显示数码管60S倒计时程序。
原理
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱 动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp "的同名端连在一起,另 外为每个数码管的公共极 COM 增加位选通控制电路,位选通由各自独立的 I/O 线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是 那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我 们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数 码管就不会亮。 透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显 示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为 1~2ms, 由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同 时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会 有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且 功耗更低。
电路图
汇编代码
ORG 0000H;程序入口地址
AJMP START;跳转到START程序
ORG 0040H
START: MOV DPTR, #TAB;建表将TAB所在的地址赋值给DPTR
MOV R1, #6;十位
MOV R0, #0;个位
AJMP DISPLAY
TENS: MOV R0, #10;个位填充,十位减1
DEC R1
UNITS: DEC R0;个位减1同时填充R5
MOV R5, #250
DISPLAY:MOV A,R1
MOVC A,@A+DPTR;基地变址寻址
MOV P3,#0FEH
MOV P2,A;显示
LCALL DELAY
MOV A,R0
MOVC A,@A+DPTR;基地变址寻址
MOV P3,#0FDH
MOV P2,A;显示
LCALL DELAY
DJNZ R5,DISPLAY;每显示一个数用时大约1s
CJNE R0,#0,UNITS;个位0不等于跳转
CJNE R1,#0,TENS;十位0不等于跳转
SJMP START
DELAY: MOV R7,#250
D1: MOV R6,#4
D2: DJNZ R6,D2
DJNZ R7,D1
RET
TAB:
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
END
C语言代码
#include <REGX52.H>
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};//共阴不带小数点段码表
void delay_ms(unsigned int ms)//ms延时函数
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
while(1)
{
unsigned char i,j;
for(i=60;i>0;i--)//60s
{
for(j=100;j>0;j--)//大约1s
{
P3=0xfe;//位选
P2=tab[i/10];//显示十位
delay_ms(5);
P3=0xfd;//位选
P2=tab[i%10];//显示个位
delay_ms(5);
}
}
}
}