熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2018-5-21 10:01
正文摘要:為什么單片機(jī)上程序效果不好使 我想要數(shù)碼管顯示這個(gè)數(shù) #include<reg51.h> #define DataPort P0 sbit duso=P2^1; sbit weso=P2^2; unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66 ... |
1sdaw123 發(fā)表于 2018-5-21 22:32 軟件是建立在硬件的基礎(chǔ)上的,首先要了解硬件電路,才能編寫與其相適應(yīng)的軟件。沒有包打天下的自適應(yīng)軟件。 |
1sdaw123 發(fā)表于 2018-5-21 22:32 自己要改程序了,看到你的板子,才知道不是我的板子。但原理差不多。 好像你的573控制口和我的不一樣哦。 |
好像我有你這板子,所以我有現(xiàn)成的程序。 看看我寫的(呵呵——得意的笑——新手的表現(xiàn)) #include<reg51.h> #define SMG P0//數(shù)碼管 sbit DUAN=P2^6; sbit WEI1=P2^7; unsigned char code ZF[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 ,0x7c,0x39,0x5e,0x79,0x71,0x00};//標(biāo)準(zhǔn)0~F數(shù)碼管顯示碼 unsigned char code WEI[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//控制哪一位數(shù)碼管顯示 //一次一位,對(duì)應(yīng)最左位→最右位 unsigned char DisplayData[8];//用來存放要顯示的8位數(shù)的值,一個(gè)管分配一位數(shù)組,叫顯示緩存 void DigDisplay()//數(shù)碼管動(dòng)態(tài)顯示函數(shù) { unsigned char i,j; for(i=0;i<8;i++)//只有8個(gè)數(shù)碼管 { switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,并賦值顯示內(nèi)容 { case(0): SMG=WEI[i];//先選位0(最左邊),后選段 WEI1=1; WEI1=0; SMG=DisplayData[i];//發(fā)送段碼 DUAN=1; DUAN=0; break; case(1): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(2): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(3): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(4): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(5): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(6): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(7): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; } j=20;//顯示一段時(shí)間,再消隱,可以得到穩(wěn)定的顯示 while(j--); SMG=0xff; WEI1=1; WEI1=0; SMG=0x00;//消隱 DUAN=1; DUAN=0;//關(guān)閉段碼 } } void XSHCFZ (unsigned long j)//顯示緩存賦值 { DisplayData[0]=ZF[j/10000000];//將十進(jìn)制數(shù)換算為可顯示字符 DisplayData[1]=ZF[(j%10000000)/1000000]; DisplayData[2]=ZF[(j%1000000)/100000]; DisplayData[3]=ZF[(j%100000)/10000]; DisplayData[4]=ZF[(j%10000)/1000]; DisplayData[5]=ZF[(j%1000)/100]; DisplayData[6]=ZF[(j%100)/10]; DisplayData[7]=ZF[(j%10)/1]; } void main(void) { DUAN=0;WEI1=0; XSHCFZ(76543210); while(1) { DigDisplay();//顯示 } } 好像和你的板子有點(diǎn)區(qū)別:兩個(gè)鎖存器的控制端接的口 不一樣,你自己改一下試試。 |
想要數(shù)碼管顯示count=116788;要定義變量count為 long 類型,分解這么大的數(shù)在12MHz時(shí)鐘條件下需要耗時(shí)約3ms,這會(huì)造成數(shù)碼管閃爍。給你改主循環(huán)一次分解一位,顯示一位。 #include<reg51.h> #define DataPort P0 sbit duso=P2^1; sbit weso=P2^2; unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼 unsigned char count_Data[6];//定義count的全局變量 void main() { unsigned char i=0; unsigned long count=116788; while(1) { switch(i) { case 0: count_Data[0]=dofly_DuanMa[count/100000]; break; case 1: count_Data[1]=dofly_DuanMa[count%100000/10000]; break; case 2: count_Data[2]=dofly_DuanMa[count%10000/1000]; break; case 3: count_Data[3]=dofly_DuanMa[count%1000/100]; break; case 4: count_Data[4]=dofly_DuanMa[count%100/10]; break; case 5: count_Data[5]=dofly_DuanMa[count%10]; break; } DataPort=0; //清空數(shù)據(jù),防止有交替重影 duso=1; //段鎖存 duso=0; DataPort=dofly_WeiMa[i+2]; //取位碼 weso=1; //位鎖存 weso=0; DataPort=count_Data[i]; //取顯示數(shù)據(jù),段碼 duso=1; //段鎖存 duso=0; i++; if(i>=6) i=0; } } |
主函數(shù)中沒有發(fā)現(xiàn)怎么以調(diào)用顯示函數(shù)呀~~顯示似乎沒有執(zhí)行吧?? |
Powered by 單片機(jī)教程網(wǎng)