寫的是用定時器掃描矩陣按鍵,然后在數碼管顯示,可是代碼不能實現功能,檢查了幾遍也沒想明白哪里出錯了,單片機小白,求助
- #include "reg52.h"
- #include "intrins.h"
- void anjian();
- unsigned int a,b;
- sbit KEY_IN1 = P3^7;
- sbit KEY_IN2 = P3^6;
- sbit KEY_IN3 = P3^5;
- sbit KEY_IN4 = P3^4;
- sbit KEY_OUT1 = P3^0;
- sbit KEY_OUT2 = P3^1;
- sbit KEY_OUT3 = P3^2;
- sbit KEY_OUT4 = P3^3;
- unsigned char code pucseg_code[] = {
- 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
- 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
- }; //數碼管顯示段碼
- /*unsigned char ledbuff[8] = {
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
- };*/
- unsigned char keysta[4][4] = {
- {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
- }; //矩陣按鍵當前狀態
- void Delay1ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay300us() //@12.000MHz
- {
- unsigned char i, j;
- i = 4;
- j = 125;
- do
- {
- while (--j);
- } while (--i);
- }
- void cls_periphercal(void) //系統初始化
- {
- P0 = 0xff;
- P2 = P2 & 0x1f | 0x80;
- P2 = 0x1f;
- P0 = 0;
- P2 = P2 & 0x1f | 0xa0;
- P2 = 0x1f;
-
-
- }
- void seg_disp(unsigned char pu, unsigned char ucseg_pos) //數碼管段選
- {
- P0 = 0xff;
- P2 = P2 & 0x1f | 0xe0;
- P2 &= 0x1f;
- Delay300us();
-
- P0 = 0x80 >> ucseg_pos;
- P2 = P2 & 0x1f | 0xc0;
- P2 &= 0x1f;
- Delay300us();
-
- P0 = pu;
- P2 = P2 & 0x1f | 0xe0;
- P2 &= 0x1f;
- Delay300us();
- }
- void saomiao(unsigned char i) //數碼管循環刷新顯示
- {
- switch(i)
- {
- case 0: seg_disp(pucseg_code[0], 0); break;
- case 1: seg_disp(pucseg_code[1], 1); break;
- case 2: seg_disp(pucseg_code[2], 2); break;
- case 3: seg_disp(pucseg_code[3], 3); break;
- case 4: seg_disp(pucseg_code[4], 4); break;
- case 5: seg_disp(pucseg_code[5], 5); break;
- case 6: seg_disp(pucseg_code[6], 6); break;
- case 7: seg_disp(pucseg_code[7], 7); break;
- }
-
- }
- /*void Timer0Init(void) //2??@12.000MHz //定時器定時2ms
- {
- AUXR |= 0x80; //?????1T??
- TMOD &= 0xF0; //???????
- TL0 = 0x40; //??????
- TH0 = 0xA2; //??????
- TF0 = 0; //??TF0??
- TR0 = 1; //???0????
- ET0 = 1;
- EA = 1;
- }*/
- void InterruptTimer0() interrupt 1
- {
- unsigned char i;
- static unsigned char keyout = 0; //輸出索引值
- static unsigned char keybuf[4][4] = { //掃描緩沖數組
- {0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff},
- {0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff}
- };
- TH0 = 0XFC;
- TL0 = 0X67;
-
-
- keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^7;
- keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^6;
- keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^5;
- keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^4;
-
- for(i=0; i<4; i++)
- {
- if((keybuf[keyout][i] & 0x0f) == 0x00)
- keysta[keyout][i] = 0; //連續掃描四次4值為0,可以認為按鍵已經穩定按下或彈起
- else if((keybuf[keyout][i] & 0x0f) == 0x0f)
- keysta[keyout][i] = 1;
- }
-
- keyout++; //索引值遞增
- keyout = keyout & 0x03; //當索引值到4時歸零
- switch(keyout) //根據索引值,釋放當前輸出引腳,拉低下次輸出引腳
- {
- case 0 : KEY_OUT4 = 1; KEY_OUT1 = 0; break;
- case 1 : KEY_OUT1 = 1; KEY_OUT2 = 0; break;
- case 2 : KEY_OUT2 = 1; KEY_OUT3 = 0; break;
- case 3 : KEY_OUT3 = 1; KEY_OUT4 = 0; break;
- default: break;
- }
- }
- void anjian(void) //判斷按鍵按下的是哪一位
- {
- if(b == 0 & a == 0)
- {
- saomiao(0);
- Delay1ms();
- }
- else if(b == 1 & a == 0)
- {
- saomiao(1);
- Delay1ms();
- }
- else if(b == 2 & a == 0)
- {
- saomiao(2);
- Delay1ms();
- }
- else if(b == 3 & a == 0)
- {
- saomiao(3);
- Delay1ms();
- }
- else if(b == 0 & a == 1)
- {
- saomiao(4);
- Delay1ms();
- }
- else if(b == 1 & a == 1)
- {
- saomiao(5);
- Delay1ms();
- }
- else if(b == 2 & a == 1)
- {
- saomiao(6);
- Delay1ms();
- }
- else if(b == 3 & a == 1)
- {
- saomiao(7);
- Delay1ms();
- }
- else if(b == 0 & a == 2)
- {
- saomiao(8);
- Delay1ms();
- }
- else if(b == 1 & a == 2)
- {
- saomiao(9);
- Delay1ms();
- }
- }
- void main(void)
- {
- unsigned char backup[4][4] = {
- {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
- }; //按鍵掃描值備份
-
- EA = 1;
- //ENLED = 0;
- TMOD = 0X01;
- TH0 = 0XFC;
- TL0 = 0X67;
- ET0 = 1;
- TR0 = 1;
- saomiao(0);
-
- cls_periphercal();
- Timer0Init();
- while(1)
- {
- for(a=0; a<4; a++)
- {
- for(b=0; b<4; b++)
- {
- if(backup[a][b] != keysta[a][b])
- {
- if(backup[a][b] != 0)
- {
- //anjian();
- saomiao(7);
- Delay1ms();
- Delay1ms();
- Delay1ms();
- Delay1ms();
- Delay1ms();
- Delay1ms();
- }
- backup[a][b] = keysta[a][b];
- }
- }
- }
- }
- }
復制代碼
|