您的当前位置:首页正文

单片机数字钟c程序解释

2023-08-27 来源:意榕旅游网
#include

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00}; //数码管显示段数据 unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};//数码管位驱动,第一次驱动接在最低位的那一个数码管 unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};//显示缓冲寄存器 unsigned char dispbitcnt;

unsigned char second; unsigned char minite; unsigned char hour; unsigned int tcnt; unsigned char mstcnt;

unsigned char i,j;

void main(void) {

TMOD=0x02;//设置定时器工作方式为2,8位定时状态,自动装入初值。 TH0=0x06;//装入初值 TL0=0x06;

TR0=1;//起动定时器 ET0=1;//开启定时器中断 EA=1;//开总中断 while(1) {//主循环

if(P0_0==0)//如果P0.0位等于0,往下走 {

for(i=5;i>0;i--)

for(j=248;j>0;j--);//延时防抖动

if(P0_0==0)//再次判断P0.0是否等于0,如果是,则设置秒 {

second++;//秒加1

if(second==60)//如果秒等于60,又重0开始,以便开始走时 {

second=0; }

dispbuf[0]=second%10;//刷新秒个位,并装驱动显示缓冲寄存器 dispbuf[1]=second/10;//刷新秒十位,同上。

while(P0_0==0);//等待P0.0放开。(等待按键放开) } }

if(P0_1==0)//如果P0.1位等于0,往下走 {

for(i=5;i>0;i--)

for(j=248;j>0;j--);//延时防抖动

if(P0_1==0)//再次判断P0.1是否等于0,如果是,则设置分钟值 {

minite++;//分钟加1 if(minite==60)// { minite=0;

}

dispbuf[3]=minite%10;//刷新分钟个位,并装驱动显示缓冲寄存器 dispbuf[4]=minite/10;//刷新分钟十位,同上

while(P0_1==0);//等待P0.1放开。(等待按键放开) } }

if(P0_2==0)//大概意思同上,只是这里是用来设置小时值的 {

for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_2==0) { hour++; if(hour==24) { hour=0; }

dispbuf[6]=hour%10; dispbuf[7]=hour/10; while(P0_2==0); } } } }

void t0(void) interrupt 1 using 0//定时器中断子程序 {

mstcnt++;//用于刷新所显示的数据,第中断8次显示1位数码管(动态显示) if(mstcnt==8)//判断中断8次没,如果是,则显示数据 {

mstcnt=0;

P1=dispcode[dispbuf[dispbitcnt]];//段位码送P1口,驱动数码管显示 P3=dispbitcode[dispbitcnt];//选中数码管显示位 dispbitcnt++;//显示索引,用于调哪一位数据

if(dispbitcnt==8)//判断调完没,如果调完了,则又从第一位开始。 {

dispbitcnt=0; }

}

tcnt++;//第中断一次自动加1,如果中断4000次,则秒自动加1(这里的中断次数可以跟据你所置的定时器初值来改变) if(tcnt==4000) {

tcnt=0;

second++;//秒加1

if(second==60)//如果秒等于60,则分钟自动加1,并且秒回0 {

second=0; minite++;//分钟加1

if(minite==60)//如果分钟等于0,则小时值自动加1,并且分钟回0 { minite=0;

hour++;//小时值加1

if(hour==24)//如果小时值等于24,则回0 { hour=0; } }

}

dispbuf[0]=second%10;//刷新显示缓冲寄存器 dispbuf[1]=second/10; dispbuf[3]=minite%10; dispbuf[4]=minite/10; dispbuf[6]=hour%10; dispbuf[7]=hour/10; } }

因篇幅问题不能全部显示,请点此查看更多更全内容