#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//液晶屏LCD1602端口定义
sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
uchar dis[8];
uchar hour=12,min=30,sec=0;
uchar t1_counter=0;
bit kp=0;
//延时函数
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
//写指令寄存器函数
void w_com(uchar com)
{
RS = 0;
RW = 0;
E = 1;
P0= com;
E = 0;
delayms(1);
}
//写数据寄存器函数
void w_dat(uchar dat)
{
RS = 1;
RW = 0;
E = 1;
P0= dat;
E = 0;
delayms(1);
}
//液晶驱动函数
void lcd_ini( void )
{
delayms(10);
w_com(0x38); //功能设置:8位口,2行,5*7点阵
delayms(10);
w_com(0x0c); //显示设置:开显示,关光标,无闪烁
delayms(10);
w_com(0x06); //输入模式:右移一格,地址加1
delayms(10);
w_com(0x01); //清显示
delayms(10);
w_com(0x38); //功能设置:8位口,2行,5*7点阵
delayms(10);
}
//按键功能函数
void s1_fun(void)
{
++hour;
if(hour==24)hour=0;
}
void s2_fun(void)
{
--hour;
if(hour==255)hour=23;
}
void s3_fun(void)
{
++min;
if(min==60)min=0;
}
void s4_fun(void)
{
--min;
if(min==255)min=59;
}
//按键扫描函数
void key_scan(void)
{
if((P3&0x0f)!=0x0f)
{
delayms(10);
if(((P3&0x0f)!=0x0f)&&(kp==0))
{
kp=1;
if((P3&0x0f)==0x0e)s1_fun();
if((P3&0x0f)==0x0d)s2_fun();
if((P3&0x0f)==0x0b)s3_fun();
if((P3&0x0f)==0x07)s4_fun();
}
}
else kp=0;
}
void main(void)
{
uchar i;
TMOD|=0x10;
TH1=15536/256; TL1=15536%256;
TR1=1; EA=1; ET1=1; lcd_ini();
while(1)
{
key_scan();
dis[0]=hour/10+0x30;
dis[1]=hour%10+0x30;
dis[2]=':';
dis[3]=min/10+0x30;
dis[4]=min%10+0x30;
dis[5]=':';
dis[6]=sec/10+0x30;
dis[7]=sec%10+0x30;//显示数组各个元素赋值
w_com(0x84);
for(i=0;i<8;i++)
w_dat(dis[i]);
}
}
//T1中断函数
void t1_int(void) interrupt 3
{
TH1=15536/256; TL1=15536%256;
if(++t1_counter==20)
{
t1_counter=0;
if(++sec==60)
{
sec=0;
if(++min==60)
{
min=0;
if(++hour==24)hour=0;
}
}
}
}
|