#include #include #define uchar unsigned char sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 #define KeyPort P3 uchar second=0; uchar minute=0; uchar hour=0; uchar i; /*------------------------------------------------ uS延时函数,含有输入参数 uchart,无返回值 uchar是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(uchar t) { while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数 uchart,无返回值 uchar是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(uchar t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } /*------------------------------------------------ 判忙函数 ------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Com(uchar com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(uchar Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(uchar x,uchar y,uchar *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ void LCD_Write_Char(uchar x,uchar y,uchar Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ } unsigned char KeyScan(void) { unsigned char keyvalue; if(KeyPort!=0xff) { DelayMs(10); if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff); switch(keyvalue) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; } } } return 0; } void Init_Timer1(void) { TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH1=(65536-25000)/256; //给定初值,50000溢出,计时0.05s TL1=(65536-25000)%256; EA=1; //总中断打开 ET1=1; //定时器中断打开 TR1=1; //定时器开关打开 } void Timer1_isr(void) interrupt 3 using 1 { TH1=(65536-25000)/256; //给定初值,50000溢出,计时0.05s TL1=(65536-25000)%256; i++; if(i==40) { i=0; second++; if(second==60) { second=0; minute++; } if(minute==60) { minute=0; hour++; } if(hour==24) hour=0; } LCD_Write_Com(0x84); //送变量显示地址 LCD_Write_Data(hour/10+0x30);//送数据百位 LCD_Write_Data(hour%10+0x30); LCD_Write_Com(0x87); //送变量显示地址 LCD_Write_Data(minute/10+0x30);//送数据百位 LCD_Write_Data(minute%10+0x30); LCD_Write_Com(0x8a); //送变量显示地址 LCD_Write_Data(second/10+0x30);//送数据百位 LCD_Write_Data(second%10+0x30); } /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main(void) { uchar num; LCD_Init(); LCD_Clear();//清屏 LCD_Write_Char(6,0,':'); LCD_Write_Char(9,0,':'); Init_Timer1(); while(1) { num=KeyScan(); switch(num) { case 1:hour++;if(hour==24)hour=0; //正常时间 小时 加1 break; case 2:hour--;if(hour==255)hour=23; //正常时间 小时减1 break; case 3:minute++;if(minute==60)minute=0; //分钟加1 break; case 4:minute--;if(minute==255)minute=59; //分钟减1 break; default:break; } } }