八位數(shù)碼管動態(tài)顯示程序
這個是51hei開發(fā)板專區(qū)里轉(zhuǎn)來的一個程序,注釋很詳細(xì),運行也沒有問題,原文地址:http://www.51hei.com/bbs/dispbbs.asp?boardid=10id=4140
/*動態(tài)數(shù)顯的設(shè)計思路,首先是我們要先知道怎樣才能使哪個位亮,顯示的段是什么數(shù)值,接下來就是中斷時間
的問題了,設(shè)計步驟如下,如果要讓八個數(shù)碼管靜態(tài)顯示1到8,我們可以修改中斷時間,如把50000改成100或更低*/
#includereg52.h>
#includeintrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
uchar a,numw,numd;
uchar code tabled[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步驟,創(chuàng)建段顯數(shù)值的對碼表0~9數(shù)值.如果要顯示1~8數(shù)值,最好多加前后兩位數(shù)0跟9,
因為后面++移位時就能按我們常規(guī)順序亮下去,至于如何顯示對應(yīng)數(shù)值請先看數(shù)碼顯示電路圖*/
uchar code tablew[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //第二步驟,創(chuàng)建位顯,就是顯示的位置,這個碼表相對簡單,用二進(jìn)制表示11111110~01111111,是0的為八位數(shù)顯管的位置
void main()
{
a=0; //定義個時間函數(shù)
numw=0; //附位顯初值為0位
numd=0; //附段顯初值為0位
TMOD=0X01; //第四步驟,附中斷暫存器初值
TH0=(65535-50000)/256; //附中斷請求時間初值,高8位
TL0=(65536-50000)%256; //附中斷請求時間初值,低8位
EA=1; //開啟總中斷
ET0=1; //開啟定時中斷
TR0=1; //啟動定時中斷
while(1)
{
if(a==10) //第三步驟,執(zhí)行速度,如果等20差不多是1秒,則往下執(zhí)行,相當(dāng)于單位數(shù)值亮的時間
{
a=0; //重新附值初值0
numd++; //段顯值++
if(numd==9) //如果段值在對碼表第9位則轉(zhuǎn)下執(zhí)行
numd=1; /*重新附值段顯值對應(yīng)對碼表第1位,因為++所以0位并不在數(shù)碼管中顯示.
如果要顯示,也會因為++而在第二輪中顯示出*/
duan=1; //開啟段顯端
P0=tabled[numd];//附段顯P0值對應(yīng)段顯值對碼表
duan=0; //鎖存
wei=1; //開啟位顯端
P0=tablew[numw];//附位顯P0值對應(yīng)位顯值對碼表
wei=0; //鎖存
numw++; //相當(dāng)于位顯移位
if(numw==8) //如果位顯值到對應(yīng)位顯對碼表第八位則轉(zhuǎn)下執(zhí)行
numw=0; //重新附值位顯值對應(yīng)對碼表第0位起
/*
下面是簡單的單個數(shù)碼管顯示例證 第一驟, 修改后在第三步驟內(nèi)
#include"reg52.h"
#include"intrins.h"
sbit duan=P2^6; //段顯端口
sbit wei=P2^7; //位顯端口
void main()
{
//P0=0xff; 數(shù)碼管不顯示任何信號,默認(rèn)情況下通電本身就不顯示,可以不寫
duan=1; //開啟段顯端口
P0=0x06; //附值段顯數(shù)值為1,可以查閱數(shù)碼管電路圖相對應(yīng)顯示的對碼表
duan=0; //鎖存,保持上一步段顯狀態(tài),硬件說明請查閱74HC573功能
wei=1; //開啟位顯端口
P0=0xfe; //附值位顯位置,01111111,左邊第一位,為0的顯示
wei=0; //鎖存,保持上一步位顯狀態(tài),硬件說明請查閱74HC573功能
}
*/
}
}
}
void timer0() interrupt 1 /*第四步驟,中斷時間函數(shù)這個相當(dāng)于移位數(shù)顯的速度,速度夠快,人眼就會有余輝效應(yīng),
感覺8位數(shù)顯一直在亮著,相當(dāng)于正在播放的電影膠卷*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
/*
以上有什么地方還需要改進(jìn)的還請老師明示
*/
評論