数码管的驱动
文章目錄
- 1 數碼管的驅動
- 1.1 動態掃描的周期
- 1.2 鬼影的產生及解決方案
- 1.3 數碼管驅動示例程序
1 數碼管的驅動
1.1 動態掃描的周期
一個數碼管需要點亮多長時間呢?也就是說要多長時間完成一次全部數碼管的掃描呢(很明顯:整體掃描時間=單個數碼管點亮時間*數碼管個數)?答案是:10ms 以內。
1.2 鬼影的產生及解決方案
“鬼影”的出現,主要是在數碼管位選和段選產生的瞬態造成的。
解決方案有兩種:關閉段或者關閉位。
1.3 數碼管驅動示例程序
示例代碼如下:
#include <reg52.h> sbit ADDR0 = P1 ^ 0; sbit ADDR1 = P1 ^ 1; sbit ADDR2 = P1 ^ 2; sbit ADDR3 = P1 ^ 3; sbit ENLED = P1 ^ 4; unsigned char code LedChar[] = { //數碼管顯示字符轉換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[6] = { //數碼管顯示緩沖區,初值 0xFF 確保啟動時都不亮0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned char i = 0; //動態掃描的索引 unsigned int cnt = 0; //記錄 T0 中斷次數 unsigned char flag1s = 0; //1 秒定時標志void main() {unsigned long sec = 0; //記錄經過的秒數EA = 1; //使能總中斷ENLED = 0; //使能 U3,選擇控制數碼管ADDR3 = 1; //因為需要動態改變 ADDR0-2 的值,所以不需要再初始化了TMOD = 0x01; //設置 T0 為模式 1TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1msTL0 = 0x67;ET0 = 1; //使能 T0 中斷TR0 = 1; //啟動 T0while (1){if (flag1s == 1) //判斷 1 秒定時標志{flag1s = 0; //1 秒定時標志清零sec++; //秒計數自加 1//以下代碼將 sec 按十進制位從低到高依次提取并轉為數碼管顯示字符LedBuff[0] = LedChar[sec % 10];LedBuff[1] = LedChar[sec / 10 % 10];LedBuff[2] = LedChar[sec / 100 % 10];LedBuff[3] = LedChar[sec / 1000 % 10];LedBuff[4] = LedChar[sec / 10000 % 10];LedBuff[5] = LedChar[sec / 100000 % 10];}} } /* 定時器 0 中斷服務函數 */ void InterruptTimer0() interrupt 1 {TH0 = 0xFC; //重新加載初值TL0 = 0x67;cnt++; //中斷次數計數值加 1if (cnt >= 1000) //中斷 1000 次即 1 秒{cnt = 0; //清零計數值以重新開始下 1 秒計時flag1s = 1; //設置 1 秒定時標志為 1}//以下代碼完成數碼管動態掃描刷新P0 = 0xFF; //顯示消隱switch (i){case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[0]; break;case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++; P0 = LedBuff[1]; break;case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++; P0 = LedBuff[2]; break;case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; P0 = LedBuff[3]; break;case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[4]; break;case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i = 0; P0 = LedBuff[5]; break;default: break;} }參考資料:
總結
- 上一篇: RTOS原理及功能简介
- 下一篇: 翔升电脑怎么进去装机快捷 如何使用翔升电