#define uint unsigned int
#define uchar unsigned char
uchar code segcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}//0,1,2,3,4,5,6,7,8,9,-
uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}//数码管位选码
uchar buffer[]={0,0,0,0,0,0,0,0}
uint hour,min,sec
uint status
//函数声明
void delayMS(uint t)
void keyprocess(unsigned char key)
void display()
void timer0()
main() //主函数
{
bit keyrelease
uchar buf
uchar keyinput
keyrelease=1
buf=0xff
TMOD=0x01 //T0工作在方式1,16位计数器
TH0=(65536-1000)/256 // 定时器0设置延时1ms中断初始值
TL0=(65536-1000)%256
TR0=1
IE=0x82 //开定时器0中断
status=0
while(1)
{ //键扫描程序
keyinput=P1&0xf0
if(keyinput!=0xf0)
{
delayMS(10)
if(keyinput!=0xf0)
{
if(keyrelease==1)
{
keyrelease=0
buf = keyinput //buf用来暂时存放键值
}
}
else
{
keyrelease=1
keyprocess(buf) //调用按键处理函数
buf = 0xff
}
}
else
{
keyrelease=1
keyprocess(buf)
buf=0xff
}
display()
}
}
//延时函数
void delayMS(uint t) // 晶振频率12M
{
uint i
while(t--)
for(i=0i<125i++)
}
//按键处理函数
void keyprocess(unsigned char key) //键值处理,正常计时,设置时分秒
{ switch (key)
{
case 0xe0:status++ //按下设置键
if (status>=4) status = 0
break
case 0xd0:switch(status)//按下加1键,3种模式下加1
{
case 0x01:if(hour<23) hour++
else hour=0break
case 0x02:if(min<59) min++
else min=0break
case 0x03:if(sec<59) sec++
else sec=0break
}
break
case 0xb0:switch(status) //按下减1键
{
case 0x01:if(hour>0) hour--
else hour=23 break
case 0x02:if(min>0) min--
else min=59 break
case 0x03:if(sec>0) sec--
else sec=59 break
}
break
default:break
}
}
//数码管显示函数
void display()
{
uchar i
//正常计时显示
{
buffer[0]=hour/10 // 显示时的十位
buffer[1]=hour%10 // 显示时的个位
buffer[2]=10 // 显示‘-’
buffer[3]=min/10// 显示分的十位
buffer[4]=min%10// 显示分的个位
buffer[5]=10
buffer[6]=sec/10// 显示秒的十位
buffer[7]=sec%10// 显示秒的个位
for(i=0i<8i++)
{
P0=segcode[buffer[i]]
P2=dispbit[i]
delayMS(1)//防止数码管显示的时候闪动
P2=0x0
}
}
}
//定时器0中断函数
void timer0() interrupt 1 using 2
{
static uint count
TH0=(65536-1000)/256 // 定时器0设置初始值1ms中断初始值
TL0=(65536-1000)%256
TR0=1
count++ //正常计时
if(count>=1000)// 定时 1S 到,以下为时钟的正常走钟逻辑
{
count=0
sec++
if(sec>= 60)
{
sec=0min++
if(min>= 60)
{
min=0hour++
if(hour>= 24)
{
hour=0
}
}
}
}
}
计算自然时间干嘛用两个中断?用一个外部中断就行了,加一个计时器。思路就是给计时器付初值(控制时间长短),没计一秒就进入中断,中断中就把显示的时间加一,然后又计一秒,又中断显示加一,循环就行了。
写个大概结构吧:
void main()
{
TMOD=0x00//设置定时器0为工作方式1
TL0=(65536-5000)/256;//计时器低四位附初值
TH0=(65536-5000)%256//计时器高四位赋值,12MHz晶振,那么这样计时
溢出时刚好为50ms。重复20次就为1s。
EA=1//开总中断
ET0=1;//开定时器0中断
TRO=1;//启动定时器
display()//控制显示程序
}
接下来每计满一次就会进入中断,在中断中就可以这样写:
{
num++
if(num==20)
{
num=0//清零,为下一秒记时准备
miao++
}
}
那么每计20次刚好一秒,miao就加1。在dispaly中显示就可以了。记得把计时器付初值放在循环里就行了。
大概思路就这样,希望能帮到。
............CJNE 31H,#04H,GOON
CJNE 30H,#02H,GOON
MOV 31H,#00H
MOV 30H,#00H
GOON:
...........
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)