#ifndef _LCD1602_H_ #define _LCD1602_H_ #define uchar unsigned char #define uint unsigned int uchar sec,min,hour,day,min,year,week; sbit RS = P2^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit RW = P2^1; //读写选择信号 H:读 L:写 sbit EN = P2^2; //片选信号 下降沿触发 #define yh 0x80 //第一行的初始位置 #define er 0x80+0x40 //第二行初始位置 uchar code tab1[]={"2020-06-19 FRI"}; uchar code tab2[]={"10:32:48"}; /***********************延时函数************************/ void delay(uint xms)//延时函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } void delay_uint(uint q) { while(q--); } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Cmd(uchar cmd) { RS=0; // 选择指令寄存器 RW=0;//写操作 EN=0;//正跳变,将命令写入液晶模块 P0=cmd; //将命令送入P0 delay_uint(3); EN=1; delay_uint(25); EN=0; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(uchar Data) { RS=1; //选择数据寄存器 RW=0; //写操作 EN=0; P0= Data; //将数据送入P0 delay_uint(3); EN=1; delay_uint(25); EN=0; } /*------------------------------------------------ 写入星期函数 ------------------------------------------------*/ void LCD_Write_week(uchar week) { LCD_Write_Cmd(yh+0x0d);//将星期显示到LCD的第一行的13位 switch(week) { case 1:LCD_Write_Data('M'); LCD_Write_Data('O'); LCD_Write_Data('N'); break; case 2:LCD_Write_Data('T'); LCD_Write_Data('U'); LCD_Write_Data('E'); break; case 3:LCD_Write_Data('W'); LCD_Write_Data('E'); LCD_Write_Data('D'); break; case 4:LCD_Write_Data('T'); LCD_Write_Data('H'); LCD_Write_Data('U'); break; case 5:LCD_Write_Data('F'); LCD_Write_Data('R'); LCD_Write_Data('I'); break; case 6:LCD_Write_Data('S'); LCD_Write_Data('T'); LCD_Write_Data('A'); break; case 7:LCD_Write_Data('S'); LCD_Write_Data('U'); LCD_Write_Data('N'); break; } } /*------------------------------------------------ 写入时分秒函数 ------------------------------------------------*/ void LCD_Write_sfm(uchar add,uchar dat) { uchar gw,sw;//定义十位 个位 gw=dat%10; sw=dat/10; LCD_Write_Cmd(er+add); ///将时分秒显示到LCD的第二行的add位 LCD_Write_Data(0x30+sw); LCD_Write_Data(0x30+gw);//0x30=48 十进制数+48=等于其ascll值 lcd1602为字符型 } /*------------------------------------------------ 写入年月日函数 ------------------------------------------------*/ void LCD_Write_nyr(uchar add,uchar dat) { uchar gw,sw;//定义十位 个位 gw=dat%10; sw=dat/10; LCD_Write_Cmd(yh+add); ///将时分秒显示到LCD的第二行的add位 LCD_Write_Data(0x30+sw); LCD_Write_Data(0x30+gw);//0x30=48 十进制数+48=等于其ascll值 lcd1602为字符型 } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(uchar x,uchar y,uchar *s) { if (x == 0) { LCD_Write_Cmd(0x80 + y); //表示第一行 } else { LCD_Write_Cmd(0xC0 + y); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 开机液晶显示函数 ------------------------------------------------*/ void Init_1602() //初始化液晶 { LCD_Write_String(0,2,"Hello world"); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { uchar i; LCD_Write_Cmd(0x38);//显示模式设置:16x2显示,5x7点阵,8位数据接口 LCD_Write_Cmd(0x0c); //显示模式设置:显示开,有光标 LCD_Write_Cmd(0x06); //显示模式设置:光标右移,字符不移 LCD_Write_Cmd(0x01); //清屏 Init_1602(); delay(1000); LCD_Write_Cmd(yh+2);//字符写入的位置--第一行第2位 for(i=0;i<14;i++) { LCD_Write_Data(tab1[i]); } LCD_Write_Cmd(er+4); for(i=0;i<8;i++) { LCD_Write_Data(tab2[i]); } } #endif 这是LCD1602的程序 |