LCD电子钟程序(广工单片机课程设计)_lcd电子钟课程设计
LCD电子钟程序(广工单片机课程设计)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“lcd电子钟课程设计”。
#include
#define uchar unsigned char
#define uint unsigned int
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit SPK = P1^2;
sbit LED = P2^4;
sbit KEY_0 = P3^7;
sbit KEY_1 = P3^6;
sbit KEY_2 = P3^5;
sbit KEY_3 = P3^4;
bit new_s, modify = 0;
char t0, sec = 0, min = 0, hour = 0;
char code LCD_line1[] = “I LOVE U”;
char code LCD_line2[] = “Timer: 00:00:00 ”;char Timer_buf[] = “00:00:00”;
char a,b,c,k = 0;
//--------------------void delay(uint z)
{
uintx, y;
for(x = z;x > 0;x--)
for(y = 100;y > 0;y--);
}//--------------------void W_LCD_Com(uchar com)//写指令 {
LCD_RS = 0;
LCD_IO = com;// LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1;delay(5);LCD_EN = 0;//用EN输入一个高脉冲 }
//--------------------void W_LCD_Dat(uchar dat)//写数据
{LCD_RS = 1;LCD_IO = dat;// LCD_RS为高、R/W为低时,写入数据LCD_EN = 1;delay(5);LCD_EN = 0;//用EN输入一个高脉冲 }
//--------------------void W_LCD_STR(uchar *s)//写字符串 {while(*s)W_LCD_Dat(*s++);}
//--------------------
void W_BUFF(void)//填写显示缓冲区
{Timer_buf[7] = sec % 10 + 48;Timer_buf[6] = sec / 10 + 48;Timer_buf[4] = min % 10 + 48;Timer_buf[3] = min / 10 + 48;Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;W_LCD_STR(Timer_buf);}
//--------------------
uchar read_key(void){ucharx1, x2;KEY_IO = 255;x1 = KEY_IO;if(x1!= 255){delay(100);x2 = KEY_IO;if(x1!= x2)return 255;while(x2!= 255)x2 = KEY_IO;if else if(x1 == 0xbf)return 1;else if(x1 == 0xdf)return 2;else if(x1 == 0xef)return 3;else if(x1 == 0xf7)return 4;}return 255;} //--------------------
void Init(){LCD_RW = 0;W_LCD_Com(0x38);delay(50);W_LCD_Com(0x0c);W_LCD_Com(0x06);W_LCD_Com(0x01);W_LCD_Com(0x80);W_LCD_STR(LCD_line1);W_LCD_STR(LCD_line2);
TMOD = 0x01;//T0定时方式1TH0 = 0x4c;TR0 = 1;//启动T0
PT0 = 1;//高优先级, 以保证定时精度
ET0 = 1;EA = 1;}
//--------------------
void main(){uint i, j;uchar Key;Init();while(1){//
if(new_s){ //如果出现了新的一秒, 修改时间
new_s = 0;sec++;sec %= 60;if(!sec){min++;min %= 60;if(!min){ hour++;hour %= 24;}}W_BUFF();//写显示
W_LCD_Com(0xc0 + 7);(x1 == 0x7f)return 0;W_LCD_Com(0xC0);
//
if(!sec &&!min){ //整点报时
for(i = 0;i
switch(Key){//分别处理四个按键
case0: if(KEY_0){min++;min %= 60;W_BUFF();break;}case1: if(KEY_1){hour++;hour %= 24;W_BUFF();break;}case2: if(KEY_2){ a=sec;b=min;c=hour;sec = 0, min = 0, hour = 0;}case3: if(KEY_3){sec=a+sec;if(sec>60){sec=sec-60;min++;}min=b+min;if(min>60){min=min-60;hour++;}hour=c+hour;if(hour>24){hour=hour-24;} }} }} //--------------------
void timer0(void)interrupt 1//T0中断函数, 50ms执行一次{TH0 = 0x4c;t0++;t0 %= 20;//20, 一秒钟if(t0 == 0){new_s = 1;LED = ~LED;}if(modify)LED = 0;} K0分加一 K1时加一 K2秒表开始
K3秒表结束,恢复正常时间!