接上篇的數碼管靜態顯示,以下是接上篇介紹到的動態顯示的原理。
動態顯示的特點是將所有位數碼管的段選線并聯在一起,由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選,利用發光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數碼管同時都在顯示
。
文章目錄
- 1. 數碼管簡單動態顯示
- 2. 數組的定義與引用
- 3. 實現指定值的數碼管動態顯示
1. 數碼管簡單動態顯示
按照上面提到的原理,可以設計得到如下代碼:
#include <reg52.h>
#include <intrins.h>#define unit unsigned int
#define uchar unsigned charsbit DU = P2^6; //數碼管段選
sbit WE = P2^7; //數碼管位選//毫秒級延時函數定義
void delay(uint z)
{uint x,y;for(x = z; x>0;x--)for(y=114;y>0;y--);}void main() //main函數自身就會循環
{//動態掃描就需要循環顯示,因此需要寫到循環中while(1){//第一位數碼管P0 = 0xFF; //清楚斷碼WE = 1; //打開位選鎖存器P0=0xFE; //1111 1110WE = 0; //鎖存位選數據DU = 1;//打開段選鎖存器P0=0xFD;//1111 1101DU = 0; //段選鎖存,鎖存段選數據dely(5);//第二位數碼管P0 = 0xFF; //清楚斷碼 WE = 1;//打開位選鎖存器P0=0xFD; //1111 1101WE = 0; //鎖存位選數據DU = 1;//打開段選鎖存器P0=0x5B; //0101 1011DU = 0; //段選鎖存,鎖存段選數據dely(5);}}
數碼管通常用來顯示程序運行之后的結果,我們通常是給數碼管賦一個值,然后將其進行顯示,可以將其寫為一個函數,此處需要使用到數組
2. 數組的定義與引用
數組是一組有序數據的集合,數組中每一個數據都是同一數據類型。數組中的元素可以用數組名和下標來唯一確定。
數組的一般格式定義如下:
數據類型 數組名[常量表達式]={元素表} ;
例如:
unsigned char tabel[3]={0x3F, 0x06, 0x5B, };
P0= tabel[0];//P0此時的值為0x3F
3. 實現指定值的數碼管動態顯示
回到前面的目的:給數碼管賦一個值,然后將其進行顯示
具體代碼如下:
#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned char//共陰數碼管段選表0-9
//code關鍵字存到ROM區;不加的話會存儲到data區,也就是RAM區;
//RAM區在執行過程中是可以被修改的,ROM區不可以被修改,此處不希望后期被修改
//code區容量大8K,data區只有512個字節
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x40,0x00};sbit DU = P2^6; //數碼管段選
sbit WE = P2^7; //數碼管位選//毫秒級延時函數定義
void delay(uint z)
{uint x,y;for(x = z; x>0;x--)for(y=114;y>0;y--);}//形參i表示顯示的數字
void disoplay(uchar i)
{uchar bai,shi,ge;bai = i / 100;shi = i%100/10;ge = i%10;//第一位數碼管P0 = 0xFF; //清楚斷碼WE = 1; //打開位選鎖存器P0=0xFE; //1111 1110WE = 0; //鎖存位選數據DU = 1;//打開段選鎖存器P0=table[bai];DU = 0; //段選鎖存,鎖存段選數據delay(5);//第二位數碼管P0 = 0xFF; //清楚斷碼 WE = 1;//打開位選鎖存器P0=0xFD; //1111 1101WE = 0; //鎖存位選數據DU = 1;//打開段選鎖存器P0=table[shi];DU = 0; //段選鎖存,鎖存段選數據delay(5);//第三位數碼管P0 = 0xFF; //清楚斷碼 WE = 1;//位選鎖存器P0=0xFB; //1111 1101WE = 0; //鎖存位選數據DU = 1;//打開段選鎖存器P0=table[ge];DU = 0; //段選鎖存,鎖存段選數據delay(5);}void main() //main函數自身就會循環
{//動態掃描就需要循環顯示,因此需要寫到循環中while(1){display(236);}}