#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="0123456789:";
sbit en=P2^5; //使能端
sbit rs=P1^0; //數據選擇端
sbit rw=P1^1; //讀寫選擇端
sbit key1=P3^4; //功能選擇鍵
sbit key2=P3^5; //時間加 按鍵
sbit key3=P3^6; //時間減按鍵
sbit key4=P3^7; //暫停按鍵
sbit dula=P2^6; //申明U1鎖存器的鎖存端
sbit wela=P2^7; //申明U1鎖存器的鎖存端
uint num,num1,shi=0,fen=0,miao=0; //聲明全局變量
void delayms(uint z);
////////// 定時器0的使用 //////////
void T0_time() interrupt 1 //選用定時器0方式一
{
TH0=(65536-45872)/256; //重裝初值
TL0=(65536-45872)%256;
num++;
if(num>=20) //1秒到
{
miao++;
num=0; //重新對num賦值,重新計時
if(miao==60)
{
fen++;
miao=0;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
{
shi=0;
}
}
}
}
}
////////////// 用1602顯示 ////////////
void Wcom(uchar com) //寫命令
{
rs=0; //選擇數據段
P0=com; //將要寫的命令傳送到數據總線
delayms(5);
en=1; //使能端給一高脈沖,將命令送入液晶控制器
delayms(5);
en=0;
}
void Wdate(uchar date) //寫數據
{
rs=1; //選擇數據段
P0=date;
delayms(5);
en=1; //使能端給一高脈沖,將數據送入液晶控制器
delayms(5);
en=0;
}
void init() //初始化函數
{
dula=0; //關閉數碼管
wela=0;
rs=0; //選擇數據端
rw=0; //選擇讀數據端
en=0; //使能端給低電平
Wcom(0x38); //設置16x2顯示,8位數據接口
Wcom(0x0c); //設置開顯示。不顯示光標,不閃爍光標
Wcom(0x06); //寫一個字符地址指針加1
Wcom(0x01); //所有顯示清零
Wcom(0x80+0x42);
}
void show() //顯示
{
uint shi1,shi2,fen1,fen2,miao1,miao2;
shi1=shi/10; //小時的十位
shi2=shi%10; //小時的個位
fen1=fen/10; //分鐘的十位
fen2=fen%10; //分鐘的個位
miao1=miao/10; //秒十位
miao2=miao%10; //秒個位
Wcom(0x80+0x42);
for(num1=0;num1<8;num1--)
{
Wdate(table[shi1]);
delayms(5);
Wdate(table[shi2]);
delayms(5);
Wdate(table[10]);
delayms(5);
Wdate(table[fen1]);
delayms(5);
Wdate(table[fen2]);
delayms(5);
Wdate(table[10]);
delayms(5);
Wdate(table[miao1]);
delayms(5);
Wdate(table[miao2]);
delayms(5);
}
}
///////////// 按鍵檢測 /////////////////
void keyscan()
{
if(key1==0);
{
shi++;
if(shi==24)
shi=0;
while(!key1);
}
if(key2==0);
{
fen++;
if(fen==60)
{
fen=0;
shi++;
}
while(!key2);
}
if(key3==0)
{
miao++;
if(miao==60)
{
fen++;
miao=0;
}
while(!key3);
}
if(key4==0)
{
TR0=~TR0;
}
}
void main()
{
init();
TMOD=0X01; //設置定時器0為工作方式1
TH0=(65536-45872)/256; //賦初值
TL0=(65536-45872)%256;
EA=1; //開啟總中斷
ET0=1; //開啟定時器0中斷
TR0=1; //啟動定時器0
while(1)
{
keyscan();
show();
}
}
void delayms( uint z) //延時子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
|