|
下面是LCD_5110驱动程序:
- #include "gd32e23x.h"
- #include "systick.h"
- #include <stdio.h>
- //#include "empty.h"
- #include "lcd_5110.h"
- #include "ascii5x8.h" //5x8ASCII字符集
- #include "charcode.h" //12x16(14)汉字子集
- #include "asciicode.h" //5x8(8)ASCII子集aaa
- #include "gd32e23x_gpio.h"
- void Delay(uint8_t xms)
- {
- uint8_t x,y;
- for(x=xms;x>0;x--)
- for(y=10;y>0;y--);
- }
- void LCD_Config(void)
- {
- rcu_periph_clock_enable(RCU_GPIOB);
- 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);
- 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);
- }
- /*********************************************
- * 函数名称:LCD_init
- * 函数功能:5110初始化
- * 入口参数:无
- * 出口参数:无
- * 备注:接通电源后需要一个RES低电平脉冲复位,当VDD变为高电平之后
- * 最多100ms,RST输入低电平(<0.3VDD)
- *********************************************/
- void LCD_init(void)
- {
- LCD_Config(); //配置LCD连线
- LCD_RST_RESET; //LCD_RST=0 复位
- delay_us(2);
- LCD_RST_SET; //LCD_RST=1
- LCD_CE_RESET; //LCD_CE=0 关闭LCD
- delay_us(2);
- LCD_CE_SET; //LCD_CE=1 打开LCD
- LCD_write_byte(0x21,0); //使用扩展LCD令设置LCD模式
- LCD_write_byte(0xc8,0); //设置液晶偏置电压
- LCD_write_byte(0x06,0); //温度校正(温度系数2)
- LCD_write_byte(0x13,0); //1:48
- LCD_write_byte(0x20,0); //使用基本命令,V=0,水平寻址
- LCD_write_byte(0x0c,0); //设定显示模式,正常显示
- LCD_clear(); //清屏
- LCD_CE_RESET; //LCD_CE=0 关闭LCD
- }
- /*********************************************
- * 函数名称:LCD_write_byte
- * 函数功能:模拟SPI接口时序写数据/命令LCD
- * 入口参数:data :写入的数据;
- * dc :写数据1/命令0选择
- * 出口参数:无
- * 备注:管脚D/C(LCD_DC)用于选择写的是命令(D/C=0)还是数据(D/C=1)
- *********************************************/
- void LCD_write_byte(uint8_t dat,uint8_t dc)
- {
- uint8_t i;
- LCD_CLK_RESET; //先拉低时钟CLK
- LCD_CE_RESET; //LCD_CE=0,选择5110
- if (dc == 1)
- LCD_DC_SET; //LCD_DC=dc dc=0数据,dc=1命令
- else
- LCD_DC_RESET;
- for (i=0; i<8; i++) //发送8位
- {
- if (dat & 0x80)
- LCD_DIN_SET; //LCD_DIN = 1;
- else
- LCD_DIN_RESET; //LCD_DIN = 0;
- LCD_CLK_RESET; //LCD_CLK = 0;
- delay_us(1);
- dat = dat << 1; //移位,准备发送下一位
- LCD_CLK_SET; //LCD_CLK=1 发送同步时钟
- }
-
- LCD_CE_SET; //LCD_CE=1 关闭5110
- }
- /*********************************************
- * 函数名称:LCD_set_XY
- * 函数功能:设置LCD坐标函数
- * 入口参数:X :0-83;
- * Y :0-5
- * 出口参数:无
- * 备注:
- *********************************************/
- void LCD_set_XY(uint8_t X,uint8_t Y)
- {
- LCD_write_byte(0x40 | Y,0); //column?
- LCD_write_byte(0x80 | X,0); //row?
- }
- /*********************************************
- * 函数名称:LCD_clear
- * 函数功能:5110清屏(用空白写满屏幕)
- * 入口参数:无
- * 出口参数:无
- * 备注:、
- *********************************************/
- void LCD_clear(void)
- {
- uint8_t i,j;
- LCD_set_XY(0,0); //定位左上角
- for (i=0; i<6; i++)
- {
- for (j=0; j<84; j++)
- {
- LCD_write_byte(0x00,1);
- }
- }
- }
-
- /*********************************************
- * 函数名称:LCD_write_ASCII
- * 函数功能:显示字符串5*7(8)
- * 入口参数:x,y,cid :显示ASCII字符
- * 出口参数:无 编号(行号)32~127
- * 备注:ASCII码表的数组ASC_5[95][8]来寻址
- *********************************************/
- void LCD_write_ASCII(uint8_t X,uint8_t Y,uint8_t *stru)
- {
- uint8_t i;
- LCD_set_XY(X,Y); //定位(左上角)
- while (1)
- {
- for ( i=0; i<5; i++) //输出一个5*7字符
- {
- LCD_write_byte(ASC_5[*stru-32][i],1);
- }
- stru++;
- LCD_write_byte(0x00,1); //插入空列
- if(*stru == '\0') break; //在每个字符串的最后,会有一个'\0'
- }
- }
- /*********************************************
- * 函数名称:LCD_write_ASCII
- * 函数功能:显示单个字符5*7(8)
- * 入口参数:x,y,cid :显示ASCII字符
- * 出口参数:无 编号(行号)32~127
- * 备注:ASCII码表的数组ASC_5[95][8]来寻址
- *********************************************/
- void LCD_write_ASC_SIN(uint8_t X,uint8_t Y,uint8_t cid)
- {
- uint8_t i;
- LCD_set_XY(X,Y); //定位(左上角)
- for ( i=0; i<5; i++) //输出一个5*7字符
- {
- LCD_write_byte(ASC_5[cid-32][i],1);
- }
- }
- /*********************************************
- * 函数名称:LCD_write_ASC7x12
- * 函数功能:显示自定义字符7*12(16)
- * 入口参数:x,y,cid :显示的字符 0 1 2 3 4 5 6 7 8 9 = m s
- * 出口参数:无 编号(行号)0,1,2,3,4,5,6,7,8,9,10,11,12
- * 备注:ASCII码表的数组ASC_7[13][14]来寻址
- *********************************************/
- void LCD_write_ASC7x12(uint8_t X,uint8_t Y,uint8_t cid)
- {
- uint8_t i;
-
- LCD_set_XY(X,Y); //定位{左上角)
- for (i=0; i<7; i++) //显示字符的上半部分(7列)
- {
- LCD_write_byte(ASC_7[cid][i],1);
- }
-
- LCD_set_XY(X,Y+1); //显示字符的下半部分
- for (i=7; i<14; i++)
- {
- LCD_write_byte(ASC_7[cid][i],1);
- }
- }
- /*********************************************
- * 函数名称:LCD_write_CHAR
- * 函数功能:显示自定义字符12*14(16)
- * 入口参数:x,y,cid :显示的字符 电子点焊机接间隔毫秒时
- * 出口参数:无 编号(行号)0,1,2,3,4,5,6,7,8,9,10
- * 备注:CHAR字库的数组CHAR_12[11][24]来寻址
- ***********************************************/
- void LCD_write_char(uint8_t x,uint8_t y,uint8_t cid)
- {
- uint8_t i;
-
- LCD_set_XY(x,y); //定位(左上角)
- for (i=0; i<12; i++) //写字符的上半部分(12列)
- {
- LCD_write_byte(CHAR_12[cid][i],1);
- }
-
- LCD_set_XY(x,y+1); //写字符的下半部分
- for (i=12; i<24; i++)
- {
- LCD_write_byte(CHAR_12[cid][i],1);
- }
- }
- /*********************************************
- * 函数名称:LCD_write_string
- * 函数功能:显示汉字字符串
- * 入口参数:x,y,*stru :显示的字符串
- * 出口参数:无
- * 备注:根据汉字内码从二维数组cid_12中找到字库中的行号,再逐个调用显示
- ***********************************************/
- void LCD_write_string(uint8_t x,uint8_t y,uint8_t *stru)
- {
- uint8_t j,n;
- while(1)
- {
- j = 0;
- while(1)
- {
- n = 0; //查找失败,用首个字替代
-
- if((stru[0] == cid_12[j][0]) && (stru[1] == cid_12[j][1]))
- {
- n = j; //找到行号,结束跳出
- break;
- }
- j++;
- if(*cid_12 == '\0') break;
- }
-
- LCD_write_char(x, y, n);
-
- x += 12;
- stru += 2;
- if(*stru == '\0') break; //在每个字符串的最后,会有一个'\0'
-
- LCD_write_byte(0x00,1); //插入空列
- }
- }
- /*************************************************************
- * 显示8个字节的十六进制数据
- *************************************************************/
- void LCD_write_Hex(uint8_t x, uint8_t y, uint64_t dispdate)
- {
- uint8_t i, j, c;
- uint64_t word;
- word = dispdate;
- LCD_set_XY(x,y);
- for(i = 0; i < 8; i++)
- {
- c = word << 1;
- word = word << 1;
- for ( j=0; j<5; j++) //输出高4位
- {
- LCD_write_byte(ASC_5[c-32][i],1);
- }
- }
-
- }
- /*********************************************
- * 函数名称:LCD_write_value
- * 函数功能:显示变量字符5*7(8)或7*12(16)
- * 入口参数:x,y,L,val :座标、长度、小数、变量
- * 出口参数:无 编号(行号)
- * 备注:ASCII码表的数组ASC_5[95][8]来寻址
- *********************************************/
- void LCD_write_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t D,uint16_t val)
- {
- uint8_t i,j,f = 0; //列循环、字循环、显示标志
- uint16_t n,t,cid; //当前倍数、余数、当前数字
- t = val;
- n = 1;
- for (j = 0; j < L; j++)
- n = n * 10;
-
- LCD_set_XY(X,Y); //定位(左上角)
- for (j = L; j > 0; j--) //字符循环开始
- {
- n = j < 2 ? 1: n / 10; //计算当前的倍数
- cid = t / n; //当前位数字
- t = t - (cid * n);
- if (cid > 0)
- f = 16;
- for ( i=0; i<5; i++) //写一个5*7字符
- {
- LCD_write_byte(ASC_5[cid + f][i],1);
- }
- if ( D > 0 & D == (j - 1))
- {
- for ( i=0; i<5; i++) //写小数点
- {
- LCD_write_byte(ASC_5[14][i],1);
- }
- }
- else
- if(j>1) LCD_write_byte(0x00,1);//插入空列
- }
- }
复制代码
这是屏幕的显示程序:
- /*************************************************************
- * 显示主屏幕
- *************************************************************/
- void display_main(void)
- {
- LCD_clear();
- LCD_write_string(5,0,"家庭智能监控");
- LCD_write_ASCII(0,2,"WelcomeToALARM");
- }
复制代码
下面是主程序:
- int main(void)
- {
- /* initialize KEY and LED, configure SysTick 初始化钥匙和LED,配置Systick*/
- gd_eval_key_init(KEY_WAKEUP, KEY_MODE_EXTI);
- led_config();
- systick_config();
-
- /* flash the LED for test */
- led_flash(1);
- /* configure EXTI, TIMER */
- exti_config();
- gpio_config();
- timer_config();
-
- LCD_init(); //初始化LCD5110
- display_main();
-
- DS1302_Config(); //初始化日历模块引脚
-
- // rtc_pre_config(); // 系统日历RTC配置
- // rtc_current_time_get(&rtc_initpara);
- // seco = (rtc_initpara.rtc_second >> 4) * 10 + (rtc_initpara.rtc_second & 0x0F);
- // display_value(192,305,YELLOW,BLUE,seco,2,0,0);
- // display_date();
-
- while(1){
- /* turn on LED1 */
- gpio_bit_set(GPIOA,GPIO_PIN_7);
- delay_1ms(1000);
- /* turn off LED1 */
- gpio_bit_reset(GPIOA,GPIO_PIN_7);
- delay_1ms(1000);
- }
- }
复制代码
|
|