4位8段共陽數碼管動態顯示固定數字0123
下面是我根據程序做的注釋,如有錯誤之處請指正!
單片機源程序如下(每一行都有詳細的注釋):- /* 4位8段共陽數碼管顯示固定數字:數碼管的動態顯示0123
- 數碼管顯示原理
- 1.靜態顯示
- 多位數碼管依然可以靜態顯示,但是顯示時要么只顯示一位數碼管,
- 否則一體的多位同時顯示必須時顯示相同內容。
- 當多位數碼管應用于某一系統時,它們的“位選”是可獨立控制的,
- 而“段選”是連接在一起的,我們可以通過位選信號控制哪幾個數碼管亮,
- 而在同一時刻,位選選通的所有數碼管上顯示的數字始終都是一樣的,
- 因為它們的段選是連接在一起的,所以送入所有數碼管的段選的信號都是相同的,
- 那么他們顯示的數字必定一樣。(換言之,你可以通過位選控制那個數碼管亮,但是亮的同時顯示的數字必定相同)
- 2.動態顯示
- 位選控制亮不亮,而段選控制顯示數字,
- 那怎樣顯示不同的數字呢?這就利用了人體肉眼觀察的能力。
- 舉個例子,
- 假設段選1控制第一位數碼管數字顯示1,那么在顯示第二個數碼管是段選控制數碼管顯示2,
- 而位選控制燈第二位數碼管亮,第一位數碼管滅。但是給人的感受是第一位數碼管并沒有滅(實際已經滅了),
- 因為時間太短人體肉眼無法識別。這樣就會發現數碼管動態顯示是向左或向右一位一位點亮。 */
- #include <reg52.h>//包含51系列頭文件
- typedef unsigned char uchar;
- //typedef和define的作用是相似的(但實質卻不一樣),都是給unsigned char定義一個別名。
- //也就是說,在定義這個別名之后,你用uchar就等于unsigned char
- //unsigned char意為無符號字符型數據,占8位數,范圍是0~255,簡寫縮寫為uchar
- /* typedef和define的區別
- typedef 是用來定義一種類型的新別名的,它不同于宏(#define),不是簡單的字符串替換。
- 它的新名字具有一定的封裝性,所以新命名的標識符具有更易定義變量的功能。
- 它是語言編譯過程的一部分,但它并不實際分配內存空間。
- 而 #define 只是簡單的字符串替換(原地擴展),它本身并不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了。
- 因此,它不會做正確性檢查,不管含義是否正確它照樣會帶入,只有在編譯已被展開的源程序時才會發現可能的錯誤并報錯。
- 接下來看下面的示例代碼:
- typedef char * PCHAR1;
- #define PCHAR2 char *
- PCHAR1 c1, c2;// c1、c2 都為char *,typedef為char *引入了一個新的別名
- PCHAR2 c3, c4;//相當于char * c3, c4;c3是char *,而c4是char
- 在定義上述的變量時,c1、c2 與 c3 按照預期都被定義成 char* 類型。
- 值得注意的是,c4 卻被定義成 char 類型,而不是我們所預期的 char*。
- 其根本原因就在于 #define 只是簡單的字符串替換,而 typedef 則是為一個類型引入一個新的別名。
- */
- uchar table[] =
- //uchar是數組類型,占8位數,范圍是0~255。
- //table是數組名稱,可以自由定義,但不能和關鍵字重名,后面必須加[],內部可注明當前數組內的元素個數,也可不注明。
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //從前往后分別是0123456789
- uchar address[] =
- //uchar是數組類型,占8位數,范圍是0~255。
- //address是數組名稱,可以自由定義,但不能和關鍵字重名,后面必須加[],內部可注明當前數組內的元素個數,也可不注明。
- {0x7F,0xBF,0xDF,0xEF}; //從前往后分別是0111~1110,共陽數碼管,故0為有效,分別對應數碼的千百十個....
- void Delay(uchar m)
- //C語言定義延時函數主要通過無意義指令(void意為空)的執行來達到延時的目的。
- //delay為延時,void delay為延時子程序。
- //m代表需要延時多少毫秒,uchar范圍是0-255
- {
- unsigned char a, b;
- //定義兩個個無符號字符型變量a和b
- //for(; m > 0; m--)
- for(b = m; b > 0; b--)
- //本句后面沒有分號,所以編譯器會默認第二個也就是下一行的for語句是本行延時語句的內部語句。
- for(a = 2; a > 0; a--);
- //程序在執行時,第一個for語句中的b每減1次,第二個for語句便執行2次,因此一共執行m*2次。
- }
- int main()
- //void定義的函數沒有返回值,int定義的函數返回整型值,int為有符號整型值,范圍是-32768~32767
- {
- uchar i = 0;
- //定義一個無符號字符型整數i為0
- while(1) //while語句的作用是讓程序停止在某處,或延時。
- //括號里面的1為表達式,表達式可以為一個常數,一個運算或一個帶返回值的函數。
- //此句后沒有跟分號,所以會默認后面第一個分號前的語句為它的內部語句。
- {
- if (i == 4) //一輪循環亮起后從頭開始。if為選擇語句,i==4,兩個==寫在一起表示測試相等,
- //即判斷等號兩邊的數是否相等。數字4為數碼管是4個,對應前面的位碼4個
- i = 0; //意思是從第一個數碼管開始顯示
-
- P3 = address[i]; //通過P3控制要亮的數碼管位
- P0 = table[i]; //通過P1控制要顯示的數碼管的段
- ++i; //故i++1(i自加1),即第二個第三個第四個數碼管相繼顯示
- //Delay(1); //快速動態顯示
- Delay(1000); //延時1000ms,可消除鬼影,達到消影
- }
- }
復制代碼
|