138译码器控制的数码管时钟,带详细注释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "reg52.h"//头文件
#define uint unsigned int
#define uchar unsigned char//宏定义
sbit duan=P1^0;//声明锁存器锁存端
sbit SMA=P2^2;
sbit SMB=P2^3;
sbit SMC=P2^4;//声明138译码器三个输入端口
sbit s1=P3^1;
sbit s2=P3^0;
sbit s3=P3^2;
sbit s4=P3^3;//声明4个按键
sbit beep=P1^5; //定义蜂鸣器端
uchar code table1[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};//0-9九个数组
uchar num1,num2,num3,num4,s1num;//定义变量
void delay(uint x)//延时函数
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void di()//蜂鸣器发声函数
{
beep=0;
delay(1000);
beep=1;
}
void main()//主函数
{
num1=18;//分钟赋值
num2=9;//小时赋值
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//装初值50ms一次中断
EA=1;//开启总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)//大循环
{
duan=1;//开启锁存器
P0=table1[num3%10];//送段选数据
duan=0;//关闭锁存器
SMA=0,SMB=0,SMC=0;//选择数码管位,给138译码器赋值,选择数码管1
delay(2);//延时5ms
duan=1;//开启锁存器
P0=table1[num3/10];//送段选数据
duan=0;//关闭锁存器
SMA=1,SMB=0,SMC=0;//选择数码管位,给138译码器赋值,选择数码管2
delay(2);//延时5ms
duan=1;//开启锁存器
P0=0x40;//送段选数据,横杠“-“
duan=0;//关闭锁存器
SMA=0,SMB=1,SMC=0;//选择数码管位,给138译码器赋值,选择数码管3
delay(2);//延时5ms
duan=1;//开启锁存器
P0=table1[num1%10];//送段选数据
duan=0;//关闭锁存器
SMA=1,SMB=1,SMC=0;//选择数码管位,给138译码器赋值,选择数码管4
delay(2);//延时5ms
duan=1;//开启锁存器
P0=table1[num1/10];//送段选数据
duan=0;//关闭锁存器
SMA=0,SMB=0,SMC=1;//选择数码管位,给138译码器赋值,选择数码管5
delay(2);//延时5ms
duan=1;//开启锁存器
P0=0x40;//送段选数据,横杠”-“
duan=0;//关闭锁存器
SMA=1,SMB=0,SMC=1;//选择数码管位,给138译码器赋值,选择数码管6
delay(2);//延时5ms
duan=1;//开启锁存器
P0=table1[num2%10];//送段选数据
duan=0;//关闭锁存器
SMA=0,SMB=1,SMC=1;//选择数码管位,给138译码器赋值,选择数码管7
delay(2);//延时5ms
duan=1;//开启锁存器
P0=table1[num2/10];//送段选数据
duan=0;//关闭锁存器
SMA=1,SMB=1,SMC=1;//选择数码管位,给138译码器赋值,选择数码管8
delay(2);//延时5ms
if(s1==0) //检测按键s1是否按下
{
delay(5); //延时去抖
if(s1==0) //再次检测按键是否被按下
{ s1num++; //按键计数加1
while(!s1); //等待按键释放,如果按键未释放一直在这等着
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1) //如果按
下按键1次
{
num3; //选着数码管秒位数
TR0=0; //定时器0停止
}
}
if(s1num==2) //如果按下按键2次
{
num1; //选着数码管分位数
TR0=0; //定时器0停止
}
if(s1num==3) //如果按下按键3次
{
num2; //选着数码管时位数
TR0=0; //定时器0停止
}
if(s1num==4) //如果按下按键4次
{
s1num=0; //按键计数清0
TR0=1; //定时器0启动
}
}
if(s4==0) //检测按键s4是否按下
{
delay(5); //延时5ms
if(s4==0) //再次检测按键是否被按下
{
while(!s4); //等待按键释放,如果按键未释放一直在这等着
di();//每当有按键释放蜂鸣器发出滴声
TR0=1; //定时器0启动
}
}
if(s1num!=0)//如果按键计数测试不等于0
{
if(s2==0)//检测按键s2是否按下
{
delay(5);//延时5ms
if(s2==0)//再次检测按键是否被按下
{
while(!s2); //等待按键释放,如果按键未释放一直在这等着
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1) //如果按下按键1次
{
num3++;//数码管秒位自加1
if(num3==60)//如果数码管秒位等于60
num3=0;//数码管秒位清0
}
if(s1num==2)//如果按下按键2次
{
num1++;//数码管分位自加1
if(num1==60)//如果数码管分位等于60
num1=0;//数码管分位清0
}
if(s1num==3)//按下按键3次
{
num2++;//数码管时位自加1
if(num2==24)//如果数码管时位等于24
num2=0;//数码管时位清0
}
}
}
}
if(s3==0)//检测按键s3是否按下
{
delay(5);//延时5ms
if(s3==0)//再次检测按键被按下
{
while(!s3);//等待按键释放,如果按键未释放一直在这等着
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//如果按下按键1次
{
/*if(num3==0)//
{
num3=59;//
}*/
num3--;//数码管秒位自减1
if(num3==-1)//如果数码管秒位等于-1
num3=59;//数码管秒位赋值59
}
if(s1num==2)//如果按键按下2次
{
num1--;//数码管分位自减1
if(num1==-1)//如果数码管分位等于-1
num1=59;//数码管分位赋值59
}
if(s1num==3)//如果按键按下3次
{
num2--;//数码管时位自减1
if(num2==-1)//如果数码管时位等于-1
num2=23;//数码管时位赋值23
}
}
}
}
}
void TO_time() interrupt 1//中断定时器0子函数,中断号为1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//重新装初值
num4++;
if(num4==20)//如果到了20次,说明1s时间到
{
num4=0;//变量num4清零
num3++;//秒加1
if(
num3==60)
{ num3=0;
num1++;//如果秒等于60,则秒清零,分加1
if(num1==60)
{ num1=0;
num2++;//如果分等于60,则分清零,时加1
if(num2==24)
num2=0;//如果时等于24,则时清零
}
}
}
}