/*動態(tài)數顯的設計思路,首先是我們要先知道怎樣才能使哪個位亮,顯示的段是什么數值,接下來就是中斷時間 的問題了,設計步驟如下,如果要讓八個數碼管靜態(tài)顯示1到8,我們可以修改中斷時間,如把50000改成100或更低*/
#include<reg52.h> #include<intrins.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)建段顯數值的對碼表0~9數值.如果要顯示1~8數值,最好多加前后兩位數0跟9, 因為后面++移位時就能按我們常規(guī)順序亮下去,至于如何顯示對應數值請先看數碼顯示電路圖*/ uchar code tablew[]={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; //第二步驟,創(chuàng)建位顯,就是顯示的位置,這個碼表相對簡單,用二進制表示11111110~01111111,是0的為八位數顯管的位置 void main() { a=0; //定義個時間函數 numw=0; //附位顯初值為0位 numd=0; //附段顯初值為0位 TMOD=0X01; //第四步驟,附中斷暫存器初值 TH0=(65536-50000)/256; //附中斷請求時間初值,高8位 TL0=(65536-50000)%256; //附中斷請求時間初值,低8位 EA=1; //開啟總中斷 ET0=1; //開啟定時中斷 TR0=1; //啟動定時中斷 while(1) { if(a==10) //第三步驟,執(zhí)行速度,如果等20差不多是1秒,則往下執(zhí)行,相當于單位數值亮的時間 { a=0; //重新附值初值0 numd++; //段顯值++ if(numd==9) //如果段值在對碼表第9位則轉下執(zhí)行 numd=1; /*重新附值段顯值對應對碼表第1位,因為++所以0位并不在數碼管中顯示. 如果要顯示,也會因為++而在第二輪中顯示出*/ duan=1; //開啟段顯端 P0=tabled[numd];//附段顯P0值對應段顯值對碼表 duan=0; //鎖存 wei=1; //開啟位顯端 P0=tablew[numw];//附位顯P0值對應位顯值對碼表 wei=0; //鎖存 numw++; //相當于位顯移位 if(numw==8) //如果位顯值到對應位顯對碼表第八位則轉下執(zhí)行 numw=0; //重新附值位顯值對應對碼表第0位起 /*
下面是簡單的單個數碼管顯示例證 第一驟, 修改后在第三步驟內 #include"reg52.h" #include"intrins.h"
sbit duan=P2^6; //段顯端口 sbit wei=P2^7; //位顯端口
void main() { //P0=0xff; 數碼管不顯示任何信號,默認情況下通電本身就不顯示,可以不寫 duan=1; //開啟段顯端口 P0=0x06; //附值段顯數值為1,可以查閱數碼管電路圖相對應顯示的對碼表 duan=0; //鎖存,保持上一步段顯狀態(tài),硬件說明請查閱74HC573功能 wei=1; //開啟位顯端口 P0=0xfe; //附值位顯位置,01111111,左邊第一位,為0的顯示 wei=0; //鎖存,保持上一步位顯狀態(tài),硬件說明請查閱74HC573功能 } */ } } }
void timer0() interrupt 1 /*第四步驟,中斷時間函數這個相當于移位數顯的速度,速度夠快,人眼就會有余輝效應, 感覺8位數顯一直在亮著,相當于正在播放的電影膠卷*/
{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; a++; }
/*
以上有什么地方還需要改進的還請老師明示
*/
[此貼子已經被作者于2010-4-28 8:52:39編輯過]
|