51數(shù)碼管動態(tài)顯示程序-------調(diào)試經(jīng)驗(yàn)
今兒學(xué)習(xí)了動態(tài)數(shù)碼管顯示的知識,其實(shí)很簡單,只要是首先讓數(shù)碼管逐個(gè)顯示1,2,3,4...間隔1秒鐘,用定時(shí)器0控制時(shí)間,未選也用一個(gè)table數(shù)組表示出來,然后減小間隔時(shí)間,我這用的是5ms顯示效果不錯(cuò),利用人眼的視覺暫留(<20ms),將東西完全顯示在數(shù)碼管上。
注意:如果在設(shè)計(jì)硬件電路時(shí)候,有雨動態(tài)顯示數(shù)碼管時(shí)候,亮度較靜態(tài)顯示時(shí)候低,所以,限流電阻應(yīng)取小一些。(具體電路網(wǎng)上應(yīng)該找得到)
調(diào)試經(jīng)驗(yàn)如下:
1.若keil調(diào)試出現(xiàn)亂碼,還有出現(xiàn)invalid ...path原因:(1)工程文件名是否存在中文,最好修改為英文;(2)程序文件中是否出現(xiàn)中文狀態(tài)下的字符,建議自己編寫,或者直接在自己存放的子函數(shù)中(.c文件)直接復(fù)制粘貼過來
2.中斷服務(wù)程序中莫忘aa++;否則定時(shí)器不起作用
/*
####################################################
數(shù)碼管(共陰)
段選位 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口(數(shù)據(jù)位):
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 ()
{
/*# 定時(shí)器0初始化 #*/
TMOD=0x01; //1.選擇定時(shí)器0,工作方式1(16位定時(shí)器,最大值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位數(shù)碼管顯示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; //中斷服務(wù)程序中記得要對寄存器重裝初值哦!
TL0=(65536-5000)%256;
aa++;
}