![]() |
發布時間: 2019-6-17 14:42
正文摘要:首先感謝進來看的朋友,表示感謝。 作為一名新手,在寫LED數碼管顯示的時候遇到了問題,所以特意來向您們請教的。我用的是單片機內部中斷,一個中斷為4MS,我不想用延時函數,延時讓系統內部空轉不允許。下面的圖片 ... |
#include <reg52.h> sbit DGT0=P2^3; sbit DGT1=P2^2; sbit DGT2=P2^1; sbit DGT3=P2^0; unsigned char code LedChar[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x90}; unsigned char LedBuff[4]={0x90,0x90,0x90,0x90}; unsigned char flagls=0; unsigned int cnt=0; unsigned char i=0; void main() { unsigned int sec=9999; TMOD=0x01;//MOV TMOD,#01H TH0=0xFC; TL0=0x18; TR0=1; EA=1; ET0=1; while(1) { if(flagls==1) { flagls=0; sec--; LedBuff[0]=LedChar[sec%10]; LedBuff[1]=LedChar[sec/10%10]; LedBuff[2]=LedChar[sec/100%10]; LedBuff[3]=LedChar[sec/1000%10]; if(sec==0) sec=9999; } } } void InterruptTime0() interrupt 1 { TH0=0xFC; TL0=0x18; cnt++; if (cnt>=1000) { cnt=0; flagls=1; } P0=0xFF; switch (i) { case 0:DGT3=0;DGT2=0;DGT1=0;DGT0=1;i++;P0=LedBuff[0];break; case 1:DGT3=0;DGT2=0;DGT1=1;DGT0=0;i++;P0=LedBuff[1];break; case 2:DGT3=0;DGT2=1;DGT1=0;DGT0=0;i++;P0=LedBuff[2];break; case 3:DGT3=1;DGT2=0;DGT1=0;DGT0=0;i=0;P0=LedBuff[3];break; } } ;;以上的代碼可以試一下,親測有效 ![]() |
這里有點3位的例子點8位都沒問題http://www.zg4o1577.cn/bbs/dpj-157313-1.html |
xqleft 發表于 2019-6-20 20:13 你可以這樣來做:每4MS產生一次中斷,用一個累加的變量(比如K)來記錄進入中斷的次數(不用0~9999,0~255就可以,類型為unsigned char,也不用清零),然后每次進入中斷,K++;K對4求余;余數即為要點亮的位。 |
我建議你可以下載德飛萊開發資料程序參考一下,他的數碼管就是用16位定時器寫的,你可以參考一下 |
尹子歸來 發表于 2019-6-17 20:54 謝謝您的指導,我用的是共陽數碼管,我就想讓他一秒的時間自動計數累加,由0-9999,到了9999清零,重新開始計數。關于如何實現由9變換到10.再由99變化100,這程序我不會還請您指導一下。謝謝 |
lwh999995 發表于 2019-6-17 20:50 好的。 我會注意的。謝謝提醒 |
charles11 發表于 2019-6-17 15:55 首先謝謝您對我我的回復。 段選位選我知道,之前看了郭天祥的視頻,他用的是延時函數,現在我不用延時函數。我直接用定時器來寫。單個的我會點亮。 也能累加,但是就是9到10以后的不知道怎么寫了。 |
xianfajushi 發表于 2019-6-17 16:16 這個我知道。我現在的問題就是點亮不了第二位。如果是單點一位數碼管我知道怎么點亮,現在我求助的是就是由一位到二位,二位到三位,三位到四位的過程和代碼。 |
不知道你用的是共陰數碼管還是共陽數碼管,先假設你是共陰的,那就把你所需要亮的那個數碼管的控制端為低電平,其余的為高,所以當你要顯示個位的時候P1=0x07;//0111 類推,十位的時候P1=0x0b,百位0x0d,千位0x0e;所以你還需要對你要顯示的數字進行分段,如1234分為顯示1,2,3,4;所以要做的就是P1=0x0e;顯示1;P1=0x0d;顯示2;P1=0x0b;顯示3;P1=0x07;顯示4; 就可以了。 |
這種問題應該百度,百度有視頻,原理圖,源程序,很好借鑒 提問應該上至少傳個原理圖或源碼,草圖也行啊 不然大家猜不猜去,也浪費時間. |
sbit bit1=P1^0; sbit bit2=P1^1; sbit bit3=P1^2; sbit bit4=P1^3; P0=千位數碼管筆段數據; bit1=0;//點亮數碼管千位 延時; bit1=1; P0=百位數碼管筆段數據; bit2=0;//點亮數碼管百位 延時; bit2=1; P0=十位數碼管筆段數據; bit3=0;//點亮數碼管十位 延時; bit3=1; P0=個位數碼管筆段數據; bit4=0;//點亮數碼管個位 延時; bit4=1; |
1=8就是段9-12就是位,假如你能點亮2位了,如法炮制就能點亮3位4位. |
首先進行位選,就是選擇在哪個數碼管上顯示,然后是段選,呈現什么樣的字形。最基本要定義一個段選的數組 |