本人菜鳥 只有C語言基礎(chǔ)和單片機(jī)概念(開始就是只知道單片機(jī)包括那幾大類東東,具體的不懂,就這種水平,現(xiàn)在對單片機(jī)有了基本的印象和了解)剛買板子幾個月 邊看書邊做,花了好久好久這么個程序,目的是用8*8數(shù)碼管用00-00-00這樣的格式表示電子鐘,但是燒進(jìn)程序后,數(shù)碼管全部顯示8.(就是全部亮,數(shù)碼管每段都亮),打擊啊,左思右想就是不知道哪里的毛病,求大手點(diǎn)化啊,新手需要鼓勵啊
//數(shù)碼管時鐘
#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 動態(tài)掃描時標(biāo)消息
uint8 Time1S= 0 ; //時鐘1S 時標(biāo)消息
static uint16 flag2MS= 0 ; //對2 ms 時標(biāo)進(jìn)行計數(shù)
uint8 LEDBuffer[8] = {0} ; //顯示緩沖區(qū)
uint8 DisplayCode[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40};//共陰數(shù)碼管使用
/*uint8 code DisplayCode[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
0xbf, //'-'號代碼
} ;//共陽數(shù)碼管使用
*/
//初始化定時器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 中斷處理程序中,設(shè)置時標(biāo)消息,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 時標(biāo)標(biāo)志位置位
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)//數(shù)碼管電子鐘程序
{
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 ;
}
}
}
}
}
}
}
}
//再分別編寫送數(shù)碼管段碼函數(shù),以及位選通函數(shù)。
void SendLedSegData(uint8 dat)
{
LED_PORT = dat ;
P2_6 = 1 ; //開段碼鎖存,送段碼數(shù)據(jù)
P2_6 = 0 ;
}
void SendLedBitData(uint8 dat)
{
uint8 temp ;
temp = (0x01 << dat ) ; //根據(jù)要選通的位計算出位碼
LED_PORT = temp ;
P2_7 = 1 ; //開位碼鎖存,送位碼數(shù)據(jù)
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 ; //關(guān)閉LED燈
P3_4=0;//關(guān)閉液晶
Timer0Init() ;
SetClock(A,B,C) ; //設(shè)置初始時間
EA = 1 ;
}
void main()
{
main_init();
while(1)
{
LedDisplay(LEDBuffer);
RunClock();
}
}
附:板子為本站的VER51HEI-5,keil 編譯通過,無錯誤無警告,附圖如下:
這個程序是網(wǎng)上找了修改的 還是完全自己寫的 問題比較多
你寫的好復(fù)雜啊
你寫的好復(fù)雜啊
我是新手啊 已經(jīng)盡力了 怎么能優(yōu)化啊 有沒有效率高代碼簡單的啊 發(fā)我一份啊
這個程序是網(wǎng)上找了修改的 還是完全自己寫的 問題比較多
管理員幫忙指出我的問題啊 我進(jìn)入自己的死胡同了轉(zhuǎn)不出來
你好! 你應(yīng)該是寫得顯示函數(shù)有問題,段與位選之間可能有問題。我改寫顯示函數(shù)以后可以正常運(yùn)行。 void display(uint8 aa, uint8 bb,uint8 cc,uint8 dd, uint8 ee,uint8 ff,uint8 gg, uint8 hh) { P0=table[aa]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xfe; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[bb]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff;//送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xfd; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[cc]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xfb; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[dd]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xf7; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[ee]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff;//送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xef; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[ff]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xdf; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[gg]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0xbf; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 P0=table[hh]; //送段選數(shù)據(jù) dula=1; //打開段選 dula=0; //關(guān)閉斷選 P0=0xff;//送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時原來段選數(shù)據(jù)通過位鎖存端造成混亂 P0=0x7f; //送位選數(shù)據(jù) wela=1; //打開位選 wela=0; //關(guān)閉位選 delayms(1); //延時 } void delayms(uint16 z) { uint16 x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 這個顯示函數(shù)是我根據(jù)光盤里的程序改寫的
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |