2831|2

932

帖子

3

TA的资源

纯净的硅(中级)

楼主
 

GD32E231 DIY大赛(3)——驱动LCD5110 [复制链接]

  昨天收到开发板,今天花了一上午时间将LCD驱动程序移植完成。代码是从原来GD32F350项目中复制过来的,虽说不复杂,但也花费了一些时间来调试,下面是显示的初步效果。







此帖出自GD32 MCU论坛

最新回复

谢谢分享   详情 回复 发表于 2021-4-8 15:55
点赞 关注
 

回复
举报

932

帖子

3

TA的资源

纯净的硅(中级)

沙发
 
下面是LCD_5110驱动程序:
  1. #include "gd32e23x.h"
  2. #include "systick.h"
  3. #include <stdio.h>
  4. //#include "empty.h"
  5. #include "lcd_5110.h"

  6. #include "ascii5x8.h"           //5x8ASCII字符集
  7. #include "charcode.h"           //12x16(14)汉字子集
  8. #include "asciicode.h"          //5x8(8)ASCII子集aaa
  9. #include "gd32e23x_gpio.h"

  10. void Delay(uint8_t xms)  
  11. {
  12.     uint8_t x,y;
  13.     for(x=xms;x>0;x--)
  14.     for(y=10;y>0;y--);
  15. }


  16. void LCD_Config(void)
  17. {
  18.     rcu_periph_clock_enable(RCU_GPIOB);
  19.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_0 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  20.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  21. }

  22. /*********************************************
  23. * 函数名称:LCD_init
  24. * 函数功能:5110初始化
  25. * 入口参数:无
  26. * 出口参数:无
  27. * 备注:接通电源后需要一个RES低电平脉冲复位,当VDD变为高电平之后
  28. *       最多100ms,RST输入低电平(<0.3VDD)
  29. *********************************************/
  30. void LCD_init(void)
  31. {
  32.     LCD_Config();                      //配置LCD连线
  33.     LCD_RST_RESET;                     //LCD_RST=0 复位
  34.     delay_us(2);
  35.     LCD_RST_SET;                       //LCD_RST=1

  36.     LCD_CE_RESET;                      //LCD_CE=0 关闭LCD
  37.     delay_us(2);
  38.     LCD_CE_SET;                        //LCD_CE=1 打开LCD

  39.     LCD_write_byte(0x21,0);            //使用扩展LCD令设置LCD模式
  40.     LCD_write_byte(0xc8,0);            //设置液晶偏置电压
  41.     LCD_write_byte(0x06,0);            //温度校正(温度系数2)
  42.     LCD_write_byte(0x13,0);            //1:48
  43.     LCD_write_byte(0x20,0);            //使用基本命令,V=0,水平寻址
  44.     LCD_write_byte(0x0c,0);            //设定显示模式,正常显示
  45.     LCD_clear();                       //清屏

  46.     LCD_CE_RESET;                      //LCD_CE=0 关闭LCD

  47. }


  48. /*********************************************
  49. * 函数名称:LCD_write_byte
  50. * 函数功能:模拟SPI接口时序写数据/命令LCD
  51. * 入口参数:data   :写入的数据;
  52. *           dc        :写数据1/命令0选择
  53. * 出口参数:无
  54. * 备注:管脚D/C(LCD_DC)用于选择写的是命令(D/C=0)还是数据(D/C=1)
  55. *********************************************/
  56. void LCD_write_byte(uint8_t dat,uint8_t dc)
  57. {
  58.     uint8_t i;

  59.     LCD_CLK_RESET;                       //先拉低时钟CLK
  60.     LCD_CE_RESET;                        //LCD_CE=0,选择5110
  61.     if (dc == 1)
  62.         LCD_DC_SET;                      //LCD_DC=dc dc=0数据,dc=1命令
  63.     else
  64.         LCD_DC_RESET;

  65.     for (i=0; i<8; i++)                  //发送8位
  66.     {
  67.         if (dat & 0x80)
  68.             LCD_DIN_SET;                 //LCD_DIN = 1;
  69.         else
  70.             LCD_DIN_RESET;               //LCD_DIN = 0;

  71.         LCD_CLK_RESET;                   //LCD_CLK = 0;
  72.         delay_us(1);

  73.         dat = dat << 1;                         //移位,准备发送下一位
  74.         LCD_CLK_SET;                     //LCD_CLK=1 发送同步时钟
  75.     }
  76.    
  77.     LCD_CE_SET;                          //LCD_CE=1 关闭5110

  78. }

  79. /*********************************************
  80. * 函数名称:LCD_set_XY
  81. * 函数功能:设置LCD坐标函数
  82. * 入口参数:X      :0-83;
  83. *           Y         :0-5
  84. * 出口参数:无
  85. * 备注:
  86. *********************************************/
  87. void LCD_set_XY(uint8_t X,uint8_t Y)
  88. {
  89.     LCD_write_byte(0x40 | Y,0); //column?
  90.     LCD_write_byte(0x80 | X,0); //row?
  91. }


  92. /*********************************************
  93. * 函数名称:LCD_clear
  94. * 函数功能:5110清屏(用空白写满屏幕)
  95. * 入口参数:无
  96. * 出口参数:无
  97. * 备注:、
  98. *********************************************/
  99. void LCD_clear(void)
  100. {
  101.     uint8_t i,j;
  102.     LCD_set_XY(0,0);            //定位左上角
  103.     for (i=0; i<6; i++)
  104.     {
  105.         for (j=0; j<84; j++)
  106.         {
  107.             LCD_write_byte(0x00,1);
  108.         }
  109.     }
  110. }




  111. /*********************************************
  112. * 函数名称:LCD_write_ASCII
  113. * 函数功能:显示字符串5*7(8)
  114. * 入口参数:x,y,cid   :显示ASCII字符
  115. * 出口参数:无                        编号(行号)32~127
  116. * 备注:ASCII码表的数组ASC_5[95][8]来寻址
  117. *********************************************/
  118. void LCD_write_ASCII(uint8_t X,uint8_t Y,uint8_t *stru)
  119. {
  120.     uint8_t i;
  121.     LCD_set_XY(X,Y);                           //定位(左上角)
  122.     while (1)
  123.     {
  124.         for ( i=0; i<5; i++)       //输出一个5*7字符
  125.         {
  126.             LCD_write_byte(ASC_5[*stru-32][i],1);
  127.         }
  128.         stru++;
  129.                 LCD_write_byte(0x00,1);    //插入空列
  130.         if(*stru == '\0') break;   //在每个字符串的最后,会有一个'\0'
  131.     }  
  132. }


  133. /*********************************************
  134. * 函数名称:LCD_write_ASCII
  135. * 函数功能:显示单个字符5*7(8)
  136. * 入口参数:x,y,cid   :显示ASCII字符
  137. * 出口参数:无                        编号(行号)32~127
  138. * 备注:ASCII码表的数组ASC_5[95][8]来寻址
  139. *********************************************/
  140. void LCD_write_ASC_SIN(uint8_t X,uint8_t Y,uint8_t cid)
  141. {
  142.     uint8_t i;
  143.     LCD_set_XY(X,Y);                           //定位(左上角)
  144.     for ( i=0; i<5; i++)           //输出一个5*7字符
  145.     {
  146.         LCD_write_byte(ASC_5[cid-32][i],1);
  147.     }
  148. }


  149. /*********************************************
  150. * 函数名称:LCD_write_ASC7x12
  151. * 函数功能:显示自定义字符7*12(16)
  152. * 入口参数:x,y,cid   :显示的字符  0 1 2 3 4 5 6 7 8 9  =  m  s
  153. * 出口参数:无                        编号(行号)0,1,2,3,4,5,6,7,8,9,10,11,12
  154. * 备注:ASCII码表的数组ASC_7[13][14]来寻址
  155. *********************************************/
  156. void LCD_write_ASC7x12(uint8_t X,uint8_t Y,uint8_t cid)
  157. {
  158.     uint8_t i;
  159.    
  160.         LCD_set_XY(X,Y);                           //定位{左上角)
  161.         for (i=0; i<7; i++)            //显示字符的上半部分(7列)
  162.     {
  163.             LCD_write_byte(ASC_7[cid][i],1);
  164.         }
  165.    
  166.         LCD_set_XY(X,Y+1);             //显示字符的下半部分
  167.         for (i=7; i<14; i++)
  168.     {
  169.         LCD_write_byte(ASC_7[cid][i],1);
  170.     }
  171. }


  172. /*********************************************
  173. * 函数名称:LCD_write_CHAR
  174. * 函数功能:显示自定义字符12*14(16)
  175. * 入口参数:x,y,cid   :显示的字符  电子点焊机接间隔毫秒时
  176. * 出口参数:无                        编号(行号)0,1,2,3,4,5,6,7,8,9,10
  177. * 备注:CHAR字库的数组CHAR_12[11][24]来寻址
  178. ***********************************************/

  179. void LCD_write_char(uint8_t x,uint8_t y,uint8_t cid)
  180. {
  181.     uint8_t i;
  182.    
  183.         LCD_set_XY(x,y);                            //定位(左上角)
  184.         for (i=0; i<12; i++)            //写字符的上半部分(12列)
  185.     {
  186.             LCD_write_byte(CHAR_12[cid][i],1);
  187.         }
  188.    
  189.         LCD_set_XY(x,y+1);              //写字符的下半部分
  190.         for (i=12; i<24; i++)
  191.     {
  192.         LCD_write_byte(CHAR_12[cid][i],1);
  193.     }
  194. }


  195. /*********************************************
  196. * 函数名称:LCD_write_string
  197. * 函数功能:显示汉字字符串
  198. * 入口参数:x,y,*stru  :显示的字符串
  199. * 出口参数:无
  200. * 备注:根据汉字内码从二维数组cid_12中找到字库中的行号,再逐个调用显示
  201. ***********************************************/

  202. void LCD_write_string(uint8_t x,uint8_t y,uint8_t *stru)
  203. {
  204.     uint8_t j,n;
  205.     while(1)
  206.     {
  207.         j = 0;
  208.         while(1)
  209.         {
  210.             n = 0;                   //查找失败,用首个字替代
  211.             
  212.             if((stru[0] == cid_12[j][0])  &&  (stru[1] == cid_12[j][1]))
  213.             {
  214.                 n = j;               //找到行号,结束跳出
  215.                 break;
  216.             }
  217.             j++;
  218.             if(*cid_12 == '\0') break;
  219.         }
  220.         
  221.         LCD_write_char(x, y, n);
  222.         
  223.         x += 12;
  224.         stru += 2;
  225.         if(*stru == '\0') break;    //在每个字符串的最后,会有一个'\0'
  226.         
  227.         LCD_write_byte(0x00,1);      //插入空列
  228.     }
  229. }

  230. /*************************************************************
  231. * 显示8个字节的十六进制数据
  232. *************************************************************/
  233. void LCD_write_Hex(uint8_t x, uint8_t y, uint64_t dispdate)
  234. {
  235.     uint8_t i, j, c;
  236.         uint64_t word;
  237.         word = dispdate;
  238.         LCD_set_XY(x,y);
  239.         for(i = 0; i < 8; i++)
  240.         {
  241.                 c = word << 1;
  242.                 word = word << 1;
  243.         for ( j=0; j<5; j++)           //输出高4位
  244.         {
  245.             LCD_write_byte(ASC_5[c-32][i],1);
  246.         }
  247.         }
  248.        
  249. }

  250. /*********************************************
  251. * 函数名称:LCD_write_value
  252. * 函数功能:显示变量字符5*7(8)或7*12(16)
  253. * 入口参数:x,y,L,val :座标、长度、小数、变量
  254. * 出口参数:无                编号(行号)
  255. * 备注:ASCII码表的数组ASC_5[95][8]来寻址
  256. *********************************************/
  257. void LCD_write_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t D,uint16_t val)
  258. {
  259.     uint8_t i,j,f = 0;              //列循环、字循环、显示标志
  260.     uint16_t n,t,cid;               //当前倍数、余数、当前数字

  261.     t = val;
  262.     n = 1;
  263.     for (j = 0; j < L; j++)
  264.       n = n * 10;
  265.    
  266.     LCD_set_XY(X,Y);                        //定位(左上角)

  267.     for (j = L; j > 0; j--)         //字符循环开始
  268.     {
  269.         n = j < 2 ? 1: n / 10;      //计算当前的倍数
  270.         cid = t / n;                //当前位数字
  271.         t = t - (cid * n);
  272.         if (cid > 0)
  273.                         f = 16;
  274.         for ( i=0; i<5; i++)        //写一个5*7字符
  275.         {
  276.             LCD_write_byte(ASC_5[cid + f][i],1);
  277.         }
  278.         if ( D > 0 & D == (j - 1))
  279.         {
  280.             for ( i=0; i<5; i++)    //写小数点
  281.             {
  282.                 LCD_write_byte(ASC_5[14][i],1);
  283.             }
  284.         }
  285.         else
  286.           if(j>1) LCD_write_byte(0x00,1);//插入空列
  287.     }
  288. }

复制代码


这是屏幕的显示程序:

  1. /*************************************************************
  2. * 显示主屏幕
  3. *************************************************************/
  4. void display_main(void)
  5. {
  6.     LCD_clear();
  7.         LCD_write_string(5,0,"家庭智能监控");
  8.         LCD_write_ASCII(0,2,"WelcomeToALARM");

  9. }
复制代码


下面是主程序:
  1. int main(void)
  2. {
  3.     /* initialize KEY and LED, configure SysTick 初始化钥匙和LED,配置Systick*/
  4.     gd_eval_key_init(KEY_WAKEUP, KEY_MODE_EXTI);
  5.     led_config();
  6.     systick_config();
  7.    
  8.     /* flash the LED for test */
  9.     led_flash(1);

  10.     /* configure EXTI, TIMER */
  11.     exti_config();
  12.     gpio_config();
  13.     timer_config();
  14.    
  15.         LCD_init();                //初始化LCD5110
  16.         display_main();
  17.        
  18.         DS1302_Config();           //初始化日历模块引脚
  19.        
  20. //    rtc_pre_config();               // 系统日历RTC配置
  21. //    rtc_current_time_get(&rtc_initpara);
  22. //        seco = (rtc_initpara.rtc_second >> 4) * 10 + (rtc_initpara.rtc_second & 0x0F);
  23. //        display_value(192,305,YELLOW,BLUE,seco,2,0,0);
  24. //        display_date();
  25.        
  26.     while(1){
  27.         /* turn on LED1 */
  28.         gpio_bit_set(GPIOA,GPIO_PIN_7);
  29.         delay_1ms(1000);
  30.         /* turn off LED1 */
  31.         gpio_bit_reset(GPIOA,GPIO_PIN_7);
  32.         delay_1ms(1000);
  33.     }
  34. }
复制代码

此帖出自GD32 MCU论坛
 
 
 

回复

661

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

谢谢分享

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表