#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;
}
}
}
}
|