本人菜鳥 只有C語言基礎和單片機概念(開始就是只知道單片機包括那幾大類東東,具體的不懂,就這種水平,現在對單片機有了基本的印象和了解)剛買板子幾個月 邊看書邊做,花了好久好久這么個程序,目的是用8*8數碼管用00-00-00這樣的格式表示電子鐘,但是燒進程序后,數碼管全部顯示8.(就是全部亮,數碼管每段都亮),打擊啊,左思右想就是不知道哪里的毛病,求大手點化啊,新手需要鼓勵啊
//數碼管時鐘 #include "REGX52.H" #define LED_PORT P0 #define uint8 unsigned char #define uint16 unsigned int #define A 20 #define B 30
1339833241908.jpg (45.88 KB, 下載次數: 198)
下載附件
2012-6-16 16:12 上傳
#define C 40 uint8 Time2Ms= 0 ; // 2msLED 動態掃描時標消息 uint8 Time1S= 0 ; //時鐘1S 時標消息 static uint16 flag2MS= 0 ; //對2 ms 時標進行計數
uint8 LEDBuffer[8] = {0} ; //顯示緩沖區 uint8 DisplayCode[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x40};//共陰數碼管使用 /*uint8 code DisplayCode[]= { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E, 0xbf, //'-'號代碼 } ;//共陽數碼管使用 */ //初始化定時器0 void Timer0Init(void) { TMOD &= 0xf0 ; TMOD |= 0x01 ; //定時器0 工作方式1 //TH0=(65536-50000)/256; //12M賦值 //TL0=(65536-50000)%256; TH0 = 0xf8 ; //定時器初始值,2MS TL0 = 0xcc ; TR0 = 1 ; ET0 = 1 ; } //在定時器0 中斷處理程序中,設置時標消息,11.0592M晶振 void Time0(void) interrupt 1 { TH0 = 0xf8 ; //定時器重新賦初值 TL0 = 0xcc ; //TH0=(65536-50000)/256; //送初值12M晶振 //TL0=(65536-50000)%256; //50ms_flag=1; Time2Ms= 1 ; //2MS 時標標志位置位 if(++flag2MS== 500) { flag2MS= 0 ; Time1S= 1 ; } } void SetClock(uint8 nHour, uint8 nMinute, uint8 nSecond) { LEDBuffer[0] = nHour / 10 ; LEDBuffer[1] = nHour % 10 ; LEDBuffer[2] = '-' ; LEDBuffer[3] = nMinute / 10 ; LEDBuffer[4] = nMinute % 10 ; LEDBuffer[5] = '-' ; LEDBuffer[6] = nSecond / 10 ; LEDBuffer[7] = nSecond % 10 ; } void RunClock(void)//數碼管電子鐘程序 { if(Time1S ) { Time1S = 0 ; if(++LEDBuffer[7] == 10) { LEDBuffer[7] = 0 ; if(++LEDBuffer[6] == 6) { LEDBuffer[6] = 0 ; if(++LEDBuffer[4] == 10) { LEDBuffer[4] = 0 ; if(++LEDBuffer[3] == 6) { LEDBuffer[3] = 0 ; if( LEDBuffer[0]<2) { if(++LEDBuffer[1]==10) { LEDBuffer[1] = 0 ; LEDBuffer[0]++; } } else { if(++LEDBuffer[1]==4) { LEDBuffer[1] = 0 ; LEDBuffer[0] = 0 ; } } } } } } } }
//再分別編寫送數碼管段碼函數,以及位選通函數。 void SendLedSegData(uint8 dat) { LED_PORT = dat ; P2_6 = 1 ; //開段碼鎖存,送段碼數據 P2_6 = 0 ; } void SendLedBitData(uint8 dat) { uint8 temp ; temp = (0x01 << dat ) ; //根據要選通的位計算出位碼 LED_PORT = temp ; P2_7 = 1 ; //開位碼鎖存,送位碼數據 P2_7 = 0 ; } void LedDisplay(uint8 * pBuffer) { static uint8 LED_BIT = 0 ; if(flag2MS) { flag2MS= 0 ; SendLedBitData(8) ; //消隱 if(pBuffer[LED_BIT] == '-') //顯示'-'號 { SendLedSegData(DisplayCode[16]) ; } else { SendLedSegData(DisplayCode[pBuffer[LED_BIT]]) ; } SendLedBitData(LED_BIT); if(++LED_BIT > 7) { LED_BIT = 0 ; } } } void main_init() { P1_4 = 1 ; //關閉LED燈 P3_4=0;//關閉液晶 Timer0Init() ; SetClock(A,B,C) ; //設置初始時間 EA = 1 ; }
void main() { main_init(); while(1) { LedDisplay(LEDBuffer); RunClock(); } } 附:板子為本站的VER51HEI-5,keil 編譯通過,無錯誤無警告,附圖如下:
[此貼子已經被作者于2012-6-16 16:12:48編輯過]
|