#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
p27=P2^7//数码管位选端定义
uchar
c,i
//数码管译码表
unsigned
char
code
NumDecode[]
=
{
0XC0,//0
0XF9,//1
0XA4,//2
0XB0,//3
0X99,//4
0X92,//5
0X82,//6
0XF8,//7
0X80,//带知8
0X90,//9
}
void
main()
{
i=0//10秒计时设置
c=0//中断次数计数
p27=1//数码管位选端关闭蠢扰消
TMOD=1//设置定时器0为工作方式1
TH0=(65536-46080)/256//定时50ms高8位求模
TL0=(65536-46080)%256//定时50ms低8位求余
EA=1//开总中断
ET0=1//定时器0中断
TR0=1//启动定时器0
while(1)
{
if(c==20)//50ms中断20次
{
c=0
i++//倒计时总数每秒减1
}
if(i<10)
{
p27=0//数码管位选选李扮通
P0=NumDecode[i]//显示数据
}
else
//循环计时设置
{
i=0
}
}
}
void
timer0()
interrupt
1//定时器0中断入口
{
TH0=(65536-46080)/256//定时器重新赋初值
TL0=(65536-46080)%256
c++//中断次数
}
#include<reg51.h>#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}//0-9
uchar sec=0,min=0,hour
uchar time
uchar disdat[6]
void delay(unsigned int x)
{
unsigned int i,j
for(i=0i<xi++)
for(j=0j<120j++)
}
void dischg()
{
disdat[0]=sec%10
disdat[1]=sec/10
disdat[2]=min%10
disdat[3]=min/10
disdat[4]=hour%10
disdat[5]=hour/10
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c
TL0=0xb0
time++
if(time==20)
{
time=0
if(sec>0)sec--
else if(min>0){sec=99min--}
else if(hour>0){sec=99min=99hour--}
}
dischg()
}
void t1isr() interrupt 3 //显示
{
TH1=0xec
TL1=0x78
switch(scanled)
{
case 0:
P2=0x20
P0=~ledtab[disdat[5]]
break
case 1:
P2=0x10
P0=~ledtab[disdat[4]]
break
case 2:
P2=0x08
P0=~ledtab[disdat[3]]
break
case 3:
P2=0x04
P0=~ledtab[disdat[2]]
break
case 4:
P2=0x02
P0=~ledtab[disdat[1]]
break
case 5:
P2=0x01
P0=~ledtab[disdat[0]]
break
default:break
}
scanled++
scanled%=6
}
main()
{
TMOD=0x11
TH0=0x3c
TL0=0xb0
TH1=0xec
TL1=0x78
TR1=1
TR0=0
ET0=1
ET1=1
EA=1
fmq=0
scanled=0
time=0
mode=1
dischg()
while(1)
{
if(keyhu==0)
{
while(keyhu==0)
TR0=0
hour++
hour%=24
}
if(keyhd==0)
{
while(keyhd==0)
TR0=0
if(hour>0)hour--
if(hour==0)hour=23
}
if(keymu==0)
{
while(keymu==0)
TR0=0
min++
min%=60
}
if(keymd==0)
{
while(keymd==0)
TR0=0
if(min>0)min--
if(min==0)min=59
}
if(keysu==0)
{
while(keysu==0)
TR0=0
sec++
sec%=60
}
if(keysd==0)
{
while(keysd==0)
TR0=0
if(sec>0)sec--
if(sec==0)sec=59
}
if(keyst==0)
{
while(keyst==0)
TR0=~TR0
}
dischg()
}
}
这是一个倒计时案例,你可以参考一下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
握伍让 MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB ET0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#9
CLR 00H
CLR 01H
LOOP:
JB P1.0,LP01
段局JNB P1.0,$
SETB TR0
CLR 01H
SJMP LOOP0
LP01:
JB P1.1,LP02
JNB P1.1,$
SETB 01H
SJMP LOOP0
LP02:
JB P1.2,LOOP0
JNB P1.1,$
CLR TR0
MOV P3,#0FDH
MOV P2,#0
MOV P3,#0FEH
MOV P2,#0
SJMP MAIN
LOOP0:
JB 00H,LOOP1
MOV A,R0
SJMP LOOP2
LOOP1:
MOV A,R1
LOOP2:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
橘拍 SETB TR0
JB 01H,T0C
INC R2
T0C:
CPL 00H
MOV A,R3
JB 00H,T001
MOV P3,#0FDH
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV P2,A
T002:
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR TR0
RETI
TABLE: 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H 01234
DB 6DH,7DH,07H,7FH,6FH 56789
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)