本人菜鸟 只有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
#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编辑过]
|