当前位置:文档之家› 基于51单片机的LCD1602简单数字时钟

基于51单片机的LCD1602简单数字时钟

原理图:源程序:/***************************************************************标题:LCD1602时钟效果:在LCD1602屏上显示时分秒,能调节时间作者:皖绩小挺说明:RS:P1.0 RW:P1.1 E:P1.3 数据端口:P0key1:P3.7 key2:P3.6 key3:P3.5 key4:P3.6key5;P3.3******************************************************************/ #include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned intsbit lcdrs=P1^0; //定义LCD1602端口sbit lcdrw=P1^1;sbit lcden=P1^2;sbit key1=P3^7; //定义按键端口sbit key2=P3^6;sbit key3=P3^5;sbit key4=P3^4;sbit key5=P3^3;uchar tt; //设置全局变量uchar hour,minute,second;uchar table[]="HELLO WORLD" ; //第一行字符(11个) uchar table1[]="00:00:00"; //第二行字符(8个)/*******************************************************延时函数*******************************************************/ void delay(uint z) //delay(1)约1ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******************************************************LCD1602写命令*******************************************************/ void write_lcdcom(uchar lcd_com){lcdrs=0; //rs低电平为选择指令寄存器lcdrw=0; //rw低电平进行写操作P0=lcd_com;delay(5);lcden=1;delay(5);lcden=0;}/*******************************************************LCD1602写数据*******************************************************/ void write_lcddata(uchar lcd_data){lcdrs=1; //rs高电平为选择数据寄存器lcdrw=0;P0=lcd_data;delay(5);lcden=1;delay(5);lcden=0;}/*******************************************************LCD1602读命令*******************************************************/ void read_lcdcom(uchar lcd_com){lcdrs=0;lcdrw=1; //rw高电平进行读操作P0=lcd_com;delay(5);lcden=1;delay(5);lcden=0;}/*******************************************************LCD1602读数据*******************************************************/ void read_lcddata(uchar lcd_data){lcdrs=1;lcdrw=1;P0=lcd_data;delay(5);lcden=1;delay(5);lcden=0;}/*******************************************************系统初始化*******************************************************/ void lcdinit(){uchar i;lcden=0;write_lcdcom(0x01); //清屏delay(5);write_lcdcom(0x38); //4位,双行显示,5X7点阵delay(5);write_lcdcom(0x06); //光标右移,不整屏移动delay(5);write_lcdcom(0x0c); //显示屏幕,光标不显示delay(5);hour=0; //赋系统时间初值minute=0;second=0;key1=1;key2=1;key3=1;key4=1;key5=1;write_lcdcom(0x80+2); //显示第一行for(i=0;i<11;i++){write_lcddata(table[i]);//delay(5);}write_lcdcom(0x80+0x44); // 显示第二行for(i=0;i<8;i++){write_lcddata(table1[i]);//delay(5);}TMOD=0x01; //定时器0,方式1TH0=(65536-50000)/256; //定时器初值TL0=(65536-50000)%256;EA=1; // 开总中断ET0=1; // 开定时器0中断TR0=1; // 开启定时器0}/*********************************************************************** 写入时间***********************************************************************/ void write_hms(uchar add,uchar time){uchar shi,ge;shi=time/10; //取时间高位ge=time%10;write_lcdcom(0x80+0x40+add); //写入指令,显示位置write_lcddata(0x30+shi);//写入数据,显示内容,利用液晶屏内部字符发生write_lcddata(0x30+ge); //存储器(CGROM),直接写入需要显示字符的地址//'0'的地址就是0x30}/*****************************************************************定时器************************************************************************/ void t0() interrupt 1{TH0=(65536-50000)/256; //重载初值TL0=(65536-50000)%256;tt++; //每50ms,tt加1if(tt==20){tt=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;}write_hms(4,hour);}write_hms(7,minute);}write_hms(10,second);}}/**************************************************************时间调整***************************************************************/void keyscan(){if(key1==0) //小时加1{delay(5);if(key1==0){TR0=0;hour++;hour=0;write_hms(4,hour);delay(200); //使得调整的时候清晰可见,以免每按一次变化太大TR0=1;}}if(key2==0) // 小时减1{delay(5);if(key2==0){TR0=0;hour--;if(hour>24) //当减到00时再减的数不是<0,而是一个大于24的数(好像是0xf5)hour=23;write_hms(4,hour);delay(200);TR0=1;}}if(key3==0) // 分钟加1{delay(5);if(key3==0){TR0=0;minute++;if(minute==60)minute=0;write_hms(7,minute);delay(200);TR0=1;}}if(key4==0) // 分钟减1{delay(5);if(key4==0){TR0=0;minute--;minute=59;write_hms(7,minute);delay(200);TR0=1;}}if(key5==0) //秒钟清零{delay(5);if(key5==0){TR0=0;second=0;write_hms(10,second);TR0=1;}}}/*******************************************************主函数*******************************************************/ void main(void){lcdinit(); //调用系统初始化程序while(1){keyscan();}}。

相关主题