|
20黑幣
問題描述:單片機(jī)為清翔單片機(jī),其兩個(gè)四位共陰極數(shù)碼管由兩片74HC573控制,我做的項(xiàng)目是利用矩陣按鍵做一個(gè)簡(jiǎn)易加法計(jì)算器。我認(rèn)為大致問題是出在數(shù)碼管顯示ShowNumber這個(gè)函數(shù)。數(shù)碼管雖然能夠正確顯示結(jié)果,但是在放著單片機(jī)不碰它的時(shí)候,數(shù)碼管只有第三位是常亮的,前兩位是不亮的,只能不停地按按鍵才能讓前兩位數(shù)碼管一閃一閃從而隱約地能夠看到結(jié)果。不知道怎么解決請(qǐng)大家?guī)蛡€(gè)忙?
單片機(jī)源程序如下:
- #include <REGX52.H>
- sbit KeyOut1 = P3^0;
- sbit KeyOut2 = P3^1;
- sbit KeyOut3 = P3^2;
- sbit KeyOut4 = P3^3;
- sbit KeyIn1 = P3^4;
- sbit KeyIn2 = P3^5;
- sbit KeyIn3 = P3^6;
- sbit KeyIn4 = P3^7;
- sbit duan = P2^6;
- sbit wei = P2^7;
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- uchar T0RH,T0RL;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar KeySta[4][4]={
- {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},
- };
- uchar code KeyCodeMap[4][4] = { //矩陣按鍵編號(hào)到標(biāo)準(zhǔn)鍵盤鍵碼的映射表
- { 0x31, 0x32, 0x33, 0x26 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵
- { 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵
- { 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵
- { 0x30, 0x1B, 0x0D, 0x27 } //數(shù)字鍵 0、ESC 鍵、 回車鍵、 向右鍵
- };
- uchar we[]={0xFE,0xFD,0xFB,0xF7,0xef,0xdf,0xbf,0x7f};
- unsigned char LedBuff[6] = { //數(shù)碼管顯示緩沖區(qū)
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
- };
- void ConfigTimer0(uint ms)
- {
- ulong tmp;
- tmp = 11059200/12;
- tmp = (tmp*ms)/1000;
- tmp = 65536-tmp;
- T0RH = (uchar)(tmp>>8);
- T0RL = (uchar)tmp;
- TMOD &= 0xF0;
- TMOD |= 0x01;
- TH0 = T0RH;
- TL0 = T0RL;
- ET0 = 1;
- TR0 = 1;
- EA = 1;
- }
- void delay(uchar i)
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void ShowNumber(ulong num)
- {
- uchar bai,shi,ge;
- bai = num/100%10;
- shi = num/10%10;
- ge = num/1%10;
- duan = 0;
- P0 = table[bai];
- duan = 1;
- duan = 0;
- wei = 0;
- P0 = we[0];
- wei = 1;
- wei = 0;
- delay(5);
-
- duan = 0;
- P0 = table[shi];
- duan = 1;
- duan = 0;
- wei = 0;
- P0 = we[1];
- wei = 1;
- wei = 0;
- delay(5);
-
- duan = 0;
- P0 = table[ge];
- duan = 1;
- duan = 0;
- wei = 0;
- P0 = we[2];
- wei = 1;
- wei = 0;
- delay(5);
- }
- void KeyAction(uchar keycode)
- {
- static ulong result,addend;
- if((keycode>=0x30)&&(keycode<=0x39))
- {
- addend = (addend*10)+keycode-0x30;
- ShowNumber(addend);
- }
- else if(keycode == 0x26)
- {
- result += addend;
- addend = 0;
- ShowNumber(result);
- }
- else if(keycode == 0x0D)
- {
- result += addend;
- addend = 0;
- ShowNumber(result);
- }
- else if(keycode == 0x1B)
- {
- addend = 0;
- result = 0;
- ShowNumber(addend);
- }
- }
- void KeyDriver()
- {
- uchar i,j;
- static uchar backup[4][4]={
- {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},
- };
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- if(backup[i][j]!=KeySta[i][j])
- {
- if(backup[i][j]!=0)
- {
- KeyAction(KeyCodeMap[i][j]);
- }
- backup[i][j] = KeySta[i][j];
- }
- }
- }
- }
- void main()
- {
- ConfigTimer0(2);
- while(1)
- {
- KeyDriver();
- }
- }
- void KeyScan()
- {
- uchar i;
- static uchar KeyOut = 0;
- static uchar KeyBuf[4][4]={
- {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
- };
- KeyBuf[KeyOut][0] = (KeyBuf[KeyOut][0]<<1)|KeyIn1;
- KeyBuf[KeyOut][1] = (KeyBuf[KeyOut][1]<<1)|KeyIn2;
- KeyBuf[KeyOut][2] = (KeyBuf[KeyOut][2]<<1)|KeyIn3;
- KeyBuf[KeyOut][3] = (KeyBuf[KeyOut][3]<<1)|KeyIn4;
- for(i=0;i<4;i++)
- {
- if((KeyBuf[KeyOut][i]&0x0F)==0x00)
- KeySta[KeyOut][i] = 0;
- else if((KeyBuf[KeyOut][i]&0x0F)==0x0F)
- KeySta[KeyOut][i] = 1;
- }
- KeyOut++;
- KeyOut = KeyOut&0x03;
- switch(KeyOut)
- {
- case 0:KeyOut4=1;KeyOut3=1;KeyOut2=1;KeyOut1=0;break;
- case 1:KeyOut4=1;KeyOut3=1;KeyOut2=0;KeyOut1=1;break;
- case 2:KeyOut4=1;KeyOut3=0;KeyOut2=1;KeyOut1=1;break;
- case 3:KeyOut4=0;KeyOut3=1;KeyOut2=1;KeyOut1=1;break;
- default:break;
- }
復(fù)制代碼
計(jì)算器.rar
(33.89 KB, 下載次數(shù): 3)
2022-1-22 19:17 上傳
點(diǎn)擊文件名下載附件
|
最佳答案
查看完整內(nèi)容
你這個(gè)思路是正確的。顯示函數(shù)示例:
需要實(shí)時(shí)顯示的內(nèi)容存放在緩存中
LedBuff[0]=table[number/100%10];
LedBuff[1]=table[number/10%10];
LedBuff[2]=table[number%10];
顯示函數(shù)放在主循環(huán)中調(diào)用,對(duì)于3位數(shù)碼管動(dòng)態(tài)顯示,主循環(huán)周期不大于7ms(8位不大于2.5ms),肉眼觀察不到閃爍
|