目標:顯示“12345678” P1端口接8聯(lián)共陰數(shù)碼管SLED8的段極:P1.7接段h,…,P1.0接段a P2端口接8聯(lián)共陰數(shù)碼管SLED8的段極:P2.7接左邊的共陰極,…,P2.0接右邊的共陰極 方案說明:晶振頻率fosc=12MHz,數(shù)碼管采用動態(tài)刷新方式顯示,在1ms定時斷服務程序中實現(xiàn)
#include <at89x92.h> unsigned char DisBuf[8]; //全局顯示緩沖區(qū),DisBuf[0]對應右SLED,DisBuf[7]對應左SLED, void DisplayBrush( void ) { code unsigned char cathode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //陰極控制碼 Code unsigned char Seg7Code[16]= //用十六進數(shù)作為數(shù)組下標,可直接取得對應的七段編碼字節(jié) {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; static unsigned char i=0; // (0≤i≤7) 循環(huán)刷新顯示,由于是靜態(tài)變量,此賦值只做一次。 P2 = 0xff; //顯示消隱,以免下一段碼值顯示在前一支SLED P1 = Seg7Code[ DisBuf[i] ]; //從顯示緩沖區(qū)取出原始數(shù)據(jù),查表變?yōu)槠叨未a后送出顯示 P2 = cathode[ i ]; //將對應陰極置低,顯示 if( ++i >= 8 ) i=0; //指向下一個數(shù)碼管和相應數(shù)據(jù) } void Timer0IntRoute( void ) interrupt 1 { TL0 = -1000; //由于TL0只有8bits,所以將(-1000)低8位賦給TL0 TH0 = (-1000)>>8; //取(-1000)的高8位賦給TH0,重新定時1ms DisplayBrush(); } void Timer0Init( void ) { TMOD=(TMOD & 0xf0) | 0x01; //初始化,定時器T0,工作方式1 TL0 = -1000; //定時1ms TH0 = (-1000)>>8; TR0 = 1; //允許T0開始計數(shù) ET0 = 1; //允許T0計數(shù)溢出時產(chǎn)生中斷請求 } void Display( unsigned char index, unsigned char dataValue ){ DisBuf[ index ] = dataValue; } void main( void ) { unsigned char i; for( i=0; i<8; i++ ){ Display(i, 8-i); } //DisBuf[0]為右,DisBuf[7]為左 Timer0Init(); EA = 1; //允許CPU響應中斷請求 While(1); } |
|