写的是用定时器扫描矩阵按键,然后在数码管显示,可是代码不能实现功能,检查了几遍也没想明白哪里出错了,单片机小白,求助
- #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];
- }
- }
- }
- }
- }
复制代码
|