下面的程序是想实现 顺序按下矩阵键盘后,在数码管上依次显示0~F,不按显示 — 但是现在不管按什么键都只显示— 电路原理图如下
程序如下
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char code smgDx[17]={0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,0x80,0x90,
- 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//0~F - 段码
- void DelayMs(uint xms);
- uchar ScanKey(void);
- void main()
- {
- P2 = 0x00;
- while(1)
- {
- P0 = smgDx[ScanKey()];
- }
- }
- uchar ScanKey(void)
- {
- uchar i, temp, m, n;//m为列号,n为行号
- bit find = 0;//有键按下标志
- P1 = 0xff;
- for(i=0; i<4; i++)
- {
- P1 = 0xef<<i;//逐列送低电平
- temp = ~P1;
- temp &= 0x0f;//屏蔽高四位,得出行值
- while(temp!=0x00)//判断有无按键按下,为0则无键按下
- {
- DelayMs(10);//消抖
- temp = ~P1;
- temp &= 0x0f;//屏蔽高四位,得出行值
- while(temp!=0x00)
- {
- find = 1;//有键按下
- m = i;//列值
- switch(temp)
- {
- case 0x01: n=0; break; //第0行
- case 0x02: n=1; break; //第1行
- case 0x04: n=2; break; //2
- case 0x08: n=3; break; //3
- default: break;
- }
- }
- }
- if(!find) return 16;
- return (n*4+m);
- }
- }
- void DelayMs(uint xms)
- {
- uint i,j;
- for(i=0;i<xms;i++)
- for(j=0;j<110;j++);
- }
请大家帮我看看哪里出了问题,先谢谢各位了。
|