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