本帖最后由 青石向晚 于 2010-5-23 15:56 编辑
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define rowkey() (~P1)&0x0f
unsigned char i=0; //扫描值的当前个数
unsigned char dis[15] = {0}; //扫描值存放的数组
void debouncer(void) //消抖函数
{
uint i;
for(i=0;i<240;i++); //延迟约2ms
}
void scanner (void) //扫描程序
{
uint col,row; //变量声明,当前扫描的行和列
char scan,keyin; //扫描信号,列按键值
scan=0xef;
for(col=0;col<4;col++)
{
P1=scan;
keyin=rowkey();
if(keyin!=0)
{
for(row=0;row<4;row++)
{
if(keyin==(0x01<<row))
{
dis=keycode(row+4*col); //返回键盘值
i++;
while(rowkey()!=0); //等待按键放开
debouncer(); //消抖
}
}
}
scan=(scan<<1)|0x01; //左移1位扫描信号
}
}
void main(void)
{
while(dis[i-1]!=15) //约定当键盘扫描值为15时扫描结束
scanner();
}
通过protuse仿真,按键后会出现单片机卡死的情况,即P1(键盘连接口)的电平不再变化,怪异的是按第一排的键的时候并不会出现卡死,请各位高手分析分析看,是不是程序有什么缺陷~~~
|