切换到宽版
  • 3328阅读
  • 8回复

[STM]STM8学习之——诺基亚5110屏幕驱动 [复制链接]

上一主题 下一主题
离线zeze10000
 

发帖
2858
M币
8559
专家
35
粉丝
112
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-10-05
先祝坛友们国庆节快乐!

国庆休息了几天,学习还是不能耽误啊!
今天驱动个简单的屏幕,练练手!

主角是诺基亚5110,的屏幕。
应该也是一代神机。

这个屏幕驱动很久简单,看数据手册的日期是1999年的,仿佛是隔了一个世纪那么遥远~



淘宝上有人专门给这屏幕做了转接板,说明屏幕的量不小,也反映了这部手机当时的销量。

手册很简单,需要设置的参数不多,简洁明了

内部框图


指令


这个屏的分辨率是84*48
不算高,但是够用
需要设置的参数没几个
三两下就完了。

看看通讯时序

大家应该不陌生,SPI
上升沿读入数据,空闲时钟相位随意

先填个图


再写个字


也就这样了,GUI不会弄,就先这样吧!

附上nokia5110.c
  1. #include<nokia5110.h>
  2. void nokia_CMD(unsigned char cmd)
  3. {
  4.   CE=0;
  5.   DC=0;
  6.   SPI_W(cmd);
  7.   SPI_BUSY();
  8.   CE=1;
  9. }
  10. void nokia_CLS()
  11. {
  12.   unsigned int x=504;
  13.   
  14.   nokia_CMD(0x80);
  15.   nokia_CMD(0x40);
  16.   
  17.   CE=0;
  18.   DC=1;
  19.   while(x--)
  20.     SPI_W(0x00);
  21.   SPI_BUSY();
  22.   CE=1;
  23. }
  24. void nokia_init()
  25. {
  26.   CE=1;
  27.   
  28.   PC_DDR_DDR4=1;
  29.   PC_CR1_C14=1;
  30.   PC_CR2_C24=0;
  31.   
  32.   PC_DDR_DDR3=1;
  33.   PC_CR1_C13=1;
  34.   PC_CR2_C23=0;
  35.   
  36.   PC_DDR_DDR2=1;
  37.   PC_CR1_C12=1;
  38.   PC_CR2_C22=0;
  39.   
  40.   delayms(30);
  41.   
  42.   RST=0;
  43.   delay1us();
  44.   RST=1;
  45.   
  46.   nokia_CMD(0x21);      //power on,horizontal addressing,extended instruction
  47.   nokia_CMD(0x05);      //Temperature Coefficient
  48.   nokia_CMD(0x13);      //Bias
  49.   nokia_CMD(0xc3);      // VOP
  50.   nokia_CMD(0x20);      //nomal instruction
  51.   nokia_CMD(0x0c);
  52.   nokia_CLS();
  53. }
  54. void nokia_pic(const unsigned char *pBuf)
  55. {
  56.   unsigned int x=504;
  57.   
  58.   nokia_CMD(0x80);
  59.   nokia_CMD(0x40);
  60.   
  61.   CE=0;
  62.   DC=1;
  63.   while(x--)
  64.     SPI_W(*pBuf++);
  65.   SPI_BUSY();
  66.   CE=1;
  67. }
  68. unsigned char CN_IDX(char ch_H,char ch_L)       //汉字索引
  69. {
  70.   char addr=0;
  71.   
  72.   while((ch_H>127)&&(addr<26))  //未超字库范围
  73.   {
  74.     if(ch_H==idx[addr])         //匹配索引字符
  75.     {
  76.       if(ch_L==idx[addr+1])     //第二个字节匹配,找到字符
  77.       {
  78.         addr>>=1;               //一个汉字两个字节,除2得到字符位置
  79.         return addr;           //找到,返回位置
  80.       }
  81.     }
  82.     addr+=2;  //下个字符
  83.   }
  84.   return 0xff;          //未找到字符
  85. }
  86. void nokia_str16(char x,char y,char *pBuf)       //ASCII码、汉字混合输出
  87. {
  88.   unsigned char i,j;
  89.   unsigned addr;
  90.   
  91.   while(*pBuf!='\0')            //字符串不为空
  92.   {
  93.     if(*pBuf<127)       //ASCII码
  94.     {
  95.       if(x>76)         //本行已满,换下一行
  96.       {
  97.         y+=2;  
  98.         x=0;
  99.       }
  100.       if(y>4) return;   //页已满,退出
  101.       for(j=0;j<2;j++)
  102.       {
  103.         nokia_CMD(0x80|x);    //设定位置
  104.         nokia_CMD(0x40+y+j);
  105.         
  106.         addr=*pBuf-' ';             //获取字符位置
  107.         CE=0;
  108.         DC=1;
  109.         for(i=0;i<8;i++)
  110.         {
  111.           SPI_W(F8X16[addr][i+(j*8)]);
  112.         }
  113.         SPI_BUSY();
  114.         CE=1;
  115.       }
  116.       pBuf++;                        //下一个字符
  117.       x+=8;                          //下一个位置
  118.     }else               //汉字编码
  119.     {
  120.       if(x>68)         //本行已满,换下一行
  121.       {
  122.         y+=2;  
  123.         x=0;
  124.       }
  125.       if(y>4) return;   //页已写满,退出
  126.       addr=CN_IDX(*pBuf,*(pBuf+1));     //查询字符位置
  127.       if(addr!=0xff)                    //找到字符位置
  128.       {
  129.         for(j=0;j<2;j++)
  130.         {
  131.           nokia_CMD(0x80|x);    //设定位置
  132.           nokia_CMD(0x40+y+j);
  133.           
  134.           CE=0;
  135.           DC=1;
  136.           for(i=0;i<16;i++)
  137.           {
  138.             SPI_W(CN_16[addr][i+(j*16)]);    //写入数据
  139.           }
  140.           SPI_BUSY();
  141.           CE=1;
  142.         }        
  143.         x+=16;          //下一个显示位置
  144.       }
  145.       pBuf+=2;          //下一个字符
  146.     }
  147.   
  148.   }
  149. }


程序依旧打包



THE END!
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共3条打赏M币+30
luly8818 M币 +1 原創內容 2018-10-06
温力口 M币 +9 谢谢分享,慢慢学习。 2018-10-05
2545889167 M币 +20 哈哈,spi的单色屏一般都挺简单的 2018-10-05
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 1楼 发表于: 2018-10-05
请登录后查看
离线温力口

发帖
60313
M币
51283
专家
569
粉丝
909
只看该作者 2楼 发表于: 2018-10-05
请登录后查看
离线worldlyguest

发帖
2238
M币
7072
专家
5
粉丝
39
只看该作者 3楼 发表于: 2018-10-05
请登录后查看
离线595953427@qq

发帖
610
M币
51
专家
0
粉丝
15
只看该作者 4楼 发表于: 2018-10-06
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 5楼 发表于: 2018-10-06
回 595953427@qq 的帖子
请登录后查看
离线kbinggu

发帖
305
M币
3065
专家
0
粉丝
16
只看该作者 6楼 发表于: 2018-10-06
请登录后查看
离线触景情伤

发帖
3862
M币
28
专家
4
粉丝
70
只看该作者 7楼 发表于: 2019-01-10
请登录后查看
离线prima9399
发帖
471
M币
6072
专家
3
粉丝
31
只看该作者 8楼 发表于: 2019-04-07
请登录后查看
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个