今儿学习了动态数码管显示的知识,其实很简单,只要是首先让数码管逐个显示1,2,3,4...间隔1秒钟,用定时器0控制时间,未选也用一个table数组表示出来,然后减小间隔时间,我这用的是5ms显示效果不错,利用人眼的视觉暂留(<20ms),将东西完全显示在数码管上。
注意:如果在设计硬件电路时候,有雨动态显示数码管时候,亮度较静态显示时候低,所以,限流电阻应取小一些。(具体电路网上应该找得到)
调试经验如下:
1.若keil调试出现乱码,还有出现invalid ...path原因:(1)工程文件名是否存在中文,最好修改为英文;(2)程序文件中是否出现中文状态下的字符,建议自己编写,或者直接在自己存放的子函数中(.c文件)直接复制粘贴过来
2.中断服务程序中莫忘aa++;否则定时器不起作用
/*
####################################################
数码管(共阴)
段选位 P2口
片选位 P1.2 P1.1 P1.0
格式 dp g f e d c b a
P1口(片选位):
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
位1 位2 位3 位4 位5 位6 位7 位8
P2口(数据位):
0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f
0 1 2 3 4 5 6 7 8 9
0x77 0x7c 0x39 0x5e 0x79 0x71
A B C D E F
####################################################
*/
#include
#define uchar unsigned char
#define uint unsigned int
uchar code duan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code wei[]={0x00,0x01,0x02,0x03,
0x04,0x05,0x06,0x07};
uchar numwe,numdu,aa;
void main ()
{
/*# 定时器0初始化 #*/
TMOD=0x01; //1.选择定时器0,工作方式1(16位定时器,最大值65536)
TH0=(65536-10000)/256; //2.对寄存器赋初值
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
numwe=0; //段位赋初值
numdu=1;
while(1)
{
P1=wei[numwe]; //第1位数码管显示1
P2=duan[numdu];
if(aa==1)
{
aa=0;
if(numwe==8)
numwe=0;
numwe++;
P1=wei[numwe];
if(numdu==8)
numdu=0;
numdu++;
P2=duan[numdu];
}
}
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256; //中断服务程序中记得要对寄存器重装初值哦!
TL0=(65536-5000)%256;
aa++;
}