数码管的驱动
文章目錄
- 1 數(shù)碼管的驅(qū)動(dòng)
- 1.1 動(dòng)態(tài)掃描的周期
- 1.2 鬼影的產(chǎn)生及解決方案
- 1.3 數(shù)碼管驅(qū)動(dòng)示例程序
1 數(shù)碼管的驅(qū)動(dòng)
1.1 動(dòng)態(tài)掃描的周期
一個(gè)數(shù)碼管需要點(diǎn)亮多長(zhǎng)時(shí)間呢?也就是說(shuō)要多長(zhǎng)時(shí)間完成一次全部數(shù)碼管的掃描呢(很明顯:整體掃描時(shí)間=單個(gè)數(shù)碼管點(diǎn)亮?xí)r間*數(shù)碼管個(gè)數(shù))?答案是:10ms 以內(nèi)。
1.2 鬼影的產(chǎn)生及解決方案
“鬼影”的出現(xiàn),主要是在數(shù)碼管位選和段選產(chǎn)生的瞬態(tài)造成的。
解決方案有兩種:關(guān)閉段或者關(guān)閉位。
1.3 數(shù)碼管驅(qū)動(dòng)示例程序
示例代碼如下:
#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[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[6] = { //數(shù)碼管顯示緩沖區(qū),初值 0xFF 確保啟動(dòng)時(shí)都不亮0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned char i = 0; //動(dòng)態(tài)掃描的索引 unsigned int cnt = 0; //記錄 T0 中斷次數(shù) unsigned char flag1s = 0; //1 秒定時(shí)標(biāo)志void main() {unsigned long sec = 0; //記錄經(jīng)過(guò)的秒數(shù)EA = 1; //使能總中斷ENLED = 0; //使能 U3,選擇控制數(shù)碼管ADDR3 = 1; //因?yàn)樾枰獎(jiǎng)討B(tài)改變 ADDR0-2 的值,所以不需要再初始化了TMOD = 0x01; //設(shè)置 T0 為模式 1TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時(shí) 1msTL0 = 0x67;ET0 = 1; //使能 T0 中斷TR0 = 1; //啟動(dòng) T0while (1){if (flag1s == 1) //判斷 1 秒定時(shí)標(biāo)志{flag1s = 0; //1 秒定時(shí)標(biāo)志清零sec++; //秒計(jì)數(shù)自加 1//以下代碼將 sec 按十進(jìn)制位從低到高依次提取并轉(zhuǎn)為數(shù)碼管顯示字符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];}} } /* 定時(shí)器 0 中斷服務(wù)函數(shù) */ void InterruptTimer0() interrupt 1 {TH0 = 0xFC; //重新加載初值TL0 = 0x67;cnt++; //中斷次數(shù)計(jì)數(shù)值加 1if (cnt >= 1000) //中斷 1000 次即 1 秒{cnt = 0; //清零計(jì)數(shù)值以重新開(kāi)始下 1 秒計(jì)時(shí)flag1s = 1; //設(shè)置 1 秒定時(shí)標(biāo)志為 1}//以下代碼完成數(shù)碼管動(dòng)態(tài)掃描刷新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;} }參考資料:
總結(jié)
- 上一篇: RTOS原理及功能简介
- 下一篇: 翔升电脑怎么进去装机快捷 如何使用翔升电