專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

八位數(shù)碼管動(dòng)態(tài)顯示程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2010年04月28日   【字體:

這個(gè)是51hei開發(fā)板專區(qū)里轉(zhuǎn)來的一個(gè)程序,注釋很詳細(xì),運(yùn)行也沒有問題,原文地址:http://www.torrancerestoration.com/bbs/dpj-4140-1.html

/*動(dòng)態(tài)數(shù)顯的設(shè)計(jì)思路,首先是我們要先知道怎樣才能使哪個(gè)位亮,顯示的段是什么數(shù)值,接下來就是中斷時(shí)間
的問題了,設(shè)計(jì)步驟如下,如果要讓八個(gè)數(shù)碼管靜態(tài)顯示1到8,我們可以修改中斷時(shí)間,如把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)建段顯數(shù)值的對(duì)碼表0~9數(shù)值.如果要顯示1~8數(shù)值,最好多加前后兩位數(shù)0跟9,
      因?yàn)楹竺?+移位時(shí)就能按我們常規(guī)順序亮下去,至于如何顯示對(duì)應(yīng)數(shù)值請先看數(shù)碼顯示電路圖*/ 
uchar code tablew[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //第二步驟,創(chuàng)建位顯,就是顯示的位置,這個(gè)碼表相對(duì)簡單,用二進(jìn)制表示11111110~01111111,是0的為八位數(shù)顯管的位置
void main()
{
 a=0;            //定義個(gè)時(shí)間函數(shù)
 numw=0;     //附位顯初值為0位
 numd=0;     //附段顯初值為0位
 
 TMOD=0X01;    //第四步驟,附中斷暫存器初值
 TH0=(65535-50000)/256; //附中斷請求時(shí)間初值,高8位
 TL0=(65536-50000)%256; //附中斷請求時(shí)間初值,低8位
 EA=1;     //開啟總中斷
 ET0=1;     //開啟定時(shí)中斷
 TR0=1;     //啟動(dòng)定時(shí)中斷
 while(1)
 {
  if(a==10)   //第三步驟,執(zhí)行速度,如果等20差不多是1秒,則往下執(zhí)行,相當(dāng)于單位數(shù)值亮的時(shí)間
  {
   a=0;   //重新附值初值0
   numd++;   //段顯值++
   if(numd==9)  //如果段值在對(duì)碼表第9位則轉(zhuǎn)下執(zhí)行 
    numd=1;  /*重新附值段顯值對(duì)應(yīng)對(duì)碼表第1位,因?yàn)?+所以0位并不在數(shù)碼管中顯示.
       如果要顯示,也會(huì)因?yàn)?+而在第二輪中顯示出*/
   duan=1;   //開啟段顯端
   P0=tabled[numd];//附段顯P0值對(duì)應(yīng)段顯值對(duì)碼表
   duan=0;   //鎖存
   wei=1;   //開啟位顯端
   P0=tablew[numw];//附位顯P0值對(duì)應(yīng)位顯值對(duì)碼表
   wei=0;   //鎖存
   numw++;   //相當(dāng)于位顯移位
   if(numw==8)  //如果位顯值到對(duì)應(yīng)位顯對(duì)碼表第八位則轉(zhuǎn)下執(zhí)行
    numw=0;  //重新附值位顯值對(duì)應(yīng)對(duì)碼表第0位起
/*

下面是簡單的單個(gè)數(shù)碼管顯示例證 第一驟, 修改后在第三步驟內(nèi)
#include"reg52.h"
#include"intrins.h"

sbit duan=P2^6; //段顯端口
sbit wei=P2^7; //位顯端口

void main()
{
 //P0=0xff; 數(shù)碼管不顯示任何信號(hào),默認(rèn)情況下通電本身就不顯示,可以不寫
 duan=1;  //開啟段顯端口
 P0=0x06; //附值段顯數(shù)值為1,可以查閱數(shù)碼管電路圖相對(duì)應(yīng)顯示的對(duì)碼表
 duan=0;  //鎖存,保持上一步段顯狀態(tài),硬件說明請查閱74HC573功能
 wei=1;  //開啟位顯端口
 P0=0xfe; //附值位顯位置,01111111,左邊第一位,為0的顯示
 wei=0;  //鎖存,保持上一步位顯狀態(tài),硬件說明請查閱74HC573功能
}
*/
 
  }
 }
}

void timer0() interrupt 1 /*第四步驟,中斷時(shí)間函數(shù)這個(gè)相當(dāng)于移位數(shù)顯的速度,速度夠快,人眼就會(huì)有余輝效應(yīng),
       感覺8位數(shù)顯一直在亮著,相當(dāng)于正在播放的電影膠卷*/

{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 a++;
}

/*

以上有什么地方還需要改進(jìn)的還請老師明示

*/
 

關(guān)閉窗口

相關(guān)文章