[问题] 我想请教有关4X4建盘扫描程式的问题.

楼主: MoonGoblin (小呱ㄗ)   2011-12-18 00:38:25
这个程式原本的功能是
如果你按4X4键盘上的数字
他就会在7段显示器上显示出你按的数字
现在我想加入的功能是
如果你同时按下建盘上的1跟0
他就会显示出你刚刚按的10个数字
程式里面后面没有中文注解的就是我自己加进去的功能
但是现在就卡在 他只有一开始按什么数字就显示什么数字的功能
没有我写进去的那个功能
所以我想请各位大大们指导一下 看看我哪里有错
程式从下面开始
#include <reg51.h> // 定义8051暂存器之标头档
#define KEYP P2 // 扫瞄输出埠(高位元)及键盘输入埠(低位元)
#define SEG7P P0 // 7节显示器(g~a)输出埤
unsigned char code TAB[15]= // 共阳7节显示器(g~a)编码
{ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, // 数字0-4
0x92, 0x82, 0xf8, 0x80, 0x98, // 数字5-9
0xa0, 0x83, 0xa7, 0xa1, 0x84, // 字母a-e(10-14)
};
char disp =0x7f;
unsigned char scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7显示器及键盘之扫瞄码
void delay1ms(int); // 宣告延迟函数
void scanner(void); // 宣告扫瞄函数
int TAB1[10];
int x;
//==主程式================================================
main() // 主程式开始
{ while(1) // 无穷循环,程式一直跑
scanner(); // 扫瞄键盘及显示7段显示器
} // 主程式结束
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x) // 防弹跳函数开始
{ int i,j; // 宣告整数变量i
for(i=0;i<x;i++) // 计数x次,延迟约*1ms
for(j=0;j<120;j++); // 计数120次,延迟约1ms
} // 防弹跳函数结束
// ======= 扫瞄4*4键盘及4个7节显示器函数 ================
void scanner(void) // 扫瞄函数开始
{ unsigned char col,row; // 宣告变量(col:行,row:列,dig:颢示位)
unsigned char rowkey,kcode; // 宣告变量(rowkey:列键值,kcode:按键码)
for(col=0;col<4;col++) // for循环,扫瞄第col行
{ KEYP = scan[col]; // 高4位输出扫瞄信号,低4位元输入列值
SEG7P = disp; // 输出数字
rowkey= ~KEYP & 0x0f; // 读入KEYP低4位,反相再清除高4位求出列键值
if(rowkey != 0) // 若有按键
{ if(rowkey == 0x03) //====>这边是同时按下1跟0的话会显示出刚刚的10个数字
{ SEG7P = TAB1[x];
}
if(rowkey == 0x01) row=0; // 若第0列被按下
else if(rowkey == 0x02) row=1; // 若第1列被按下
else if(rowkey == 0x04) row=2; // 若第2列被按下
else if(rowkey == 0x08) row=3; // 若第3列被按下
kcode = 4 * col + row; // 算出按键之号码
disp=TAB[kcode]; // 键值编码后,写入最右边
if(x<10) //======> 这里是把刚刚按的数字储存在TAB1[x] 里面
{TAB1[x] = TAB[kcode];
x = x + 1;
}
while(rowkey != 0) // 当按钮未放开
rowkey=~KEYP & 0x0f; // 再读入列键值
} // if叙述(有按键时)结束
delay1ms(4); // 延迟4ms
} // for循环结束(扫瞄col行)
} // 扫瞄函数scanner()结束
希望能帮忙一下>< 谢谢><

Links booklink

Contact Us: admin [ a t ] ucptt.com