STC89C52单片机 数码管动态显示
生活随笔
收集整理的這篇文章主要介紹了
STC89C52单片机 数码管动态显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數碼管動態顯示
靜態與動態顯示
動態顯示
動態顯示的特點是將所有位數碼管的段選線并聯在一起,由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選,利用發光管的余暉和人眼視覺暫留作用,使人的感覺好像各位數碼管同時都在顯示。
數組的定義與引用
數組是一組有序數據的集合,數組中每一個數據都是同一數據類型。數組中的元素可以用數組名和下標來唯一確定。
數組的一般格式定義如下:
數據類型 數組名[常量表達式] = {元素表};
例如:
unsigned char tabel[3] = [0x3F, 0x06, 0x5B,];
P0 = tabel[0]; // P0此時的值為0x3F
數碼管動態顯示數字 123
#include <reg52.h> #include <intrins.h>#define uint 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){/*第一位顯示 數字 1*/P0 = 0XFF; // 清除斷碼 如果沒有為P0 初始化賦值 0XFF,那么 P0的值會是上一個打開段選鎖存器過程中賦予的值,執行到這里 會把段選值賦給鎖存器中P0,導致數碼管顯示錯誤。WE = 1; // 打開位選鎖存器P0 = 0XFE; // 1111 1110 選通第一位數碼管// P0 = 0X00; // 0000 0000 表示選通所有位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = 0X06; // 0000 0110 顯示“1”DU = 0; // 鎖存段選數據delay(5); // 對每次數碼管的切換進行 5毫秒延時操作/*第二位顯示 數字 2*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0XFD; // 1111 1101 選通第二位數碼管// P0 = 0X00; // 0000 0000 表示選通所有位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = 0X5B; // 0101 1011 顯示“2”DU = 0; // 鎖存段選數據delay(5);/*第三位顯示 數字 3*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0XFB; // 1111 1011 選通第三位數碼管// P0 = 0X00; // 0000 0000 表示選通所有位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = 0X4F; // 0100 1111 顯示“3”DU = 0; // 鎖存段選數據delay(5);} }數碼管動態顯示數字 123 (代碼優化)
#include <reg52.h>//包含51頭文件 #include <intrins.h>//包含移位標準庫函數頭文件#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};/*==================================== 函數 : delay(uint z) 參數 :z 延時毫秒設定,取值范圍0-65535 返回值 :無 描述 :12T/Fosc11.0592M毫秒級延時 ====================================*/ void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 函數 :display(uchar i) 參數 :i 顯示數值,取值范圍0-255 返回值 :無 描述 :三位共陰數碼管動態顯示 ====================================*/ void display(uchar i) {uchar bai, shi, ge;bai = i / 100; //236 / 100 = 2shi = i % 100 / 10; //236 % 100 / 10 = 3ge = i % 10;//236 % 10 =6//第一位數碼管 P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[bai];//DU = 0;//鎖存段選數據delay(5);//第二位數碼管P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[shi];//DU = 0;//鎖存段選數據delay(5);//第三位數碼管P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFB; //1111 1011WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[ge];//DU = 0;//鎖存段選數據delay(5); }void main()//main函數自身會循環 { while(1){display(123); //數碼管顯示函數} }數碼管動態顯示數字 12345678 (代碼優化)
#include <reg52.h>//包含51頭文件 #include <intrins.h>//包含移位標準庫函數頭文件#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數碼管段選 sbit WE = P2^7;//數碼管段選//共陰數碼管段選表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};/*==================================== 函數 : delay(uint z) 參數 :z 延時毫秒設定,取值范圍0-65535 返回值 :無 描述 :12T/Fosc11.0592M毫秒級延時 ====================================*/ void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } /*==================================== 描述 :八位共陰數碼管動態顯示 ====================================*/ void display(uchar num1, uchar num2, uchar num3, uchar num4, uchar num5, uchar num6, uchar num7, uchar num8) {/*第一位顯示*/ P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num1];//DU = 0;//鎖存段選數據delay(1);/*第二位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFD; //1111 1101WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num2];//DU = 0;//鎖存段選數據delay(1);/*第三位顯示*/P0 = 0XFF;//清除斷碼WE = 1;//打開位選鎖存器P0 = 0XFB; //1111 1011WE = 0;//鎖存位選數據DU = 1;//打開段選鎖存器P0 = tabel[num3];//DU = 0;//鎖存段選數據delay(1);/*第四位顯示*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0XF7; // 1111 0111 選通第四位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = tabel[num4];//DU = 0; // 鎖存段選數據delay(1);/*第五位顯示*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0XEF; // 1110 1111 選通第五位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = tabel[num5];//DU = 0; // 鎖存段選數據delay(1);/*第六位顯示*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0XDF; // 1101 1111 選通第六位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = tabel[num6];//DU = 0; // 鎖存段選數據delay(1);/*第七位顯示*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0XBF; // 1011 1111 選通第七位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = tabel[num7];//DU = 0; // 鎖存段選數據delay(1);/*第八位顯示*/P0 = 0XFF; // 清除斷碼WE = 1; // 打開位選鎖存器P0 = 0X7F; // 0111 1111 選通第八位數碼管WE = 0; // 鎖存位選數據DU = 1; // 打開段選鎖存器P0 = tabel[num8];DU = 0; // 鎖存段選數據delay(1); }void main()//main函數自身會循環 { while(1){ display(1, 2, 3, 4, 5, 6, 7, 8); //數碼管顯示函數} }總結
以上是生活随笔為你收集整理的STC89C52单片机 数码管动态显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STC89C52单片机 数码管静态显示
- 下一篇: C++ 默认参数和占位符