程序由2个文件构成,main.c文件和key.c文件,以及对应的main.h文件和key.h文件。使用keil C51和proteus调试成功,键盘程序采用行列扫描式。程序还有不少不足之处,还请各位指正。
key.c文件:
#include<reg51.h>
#include"key.h"
void keyscan(void) // 行列扫描式键盘处理子程序
{
unsigned char scancode;
for(;;)
{
scancode=0xef; //扫描第一行
P1=scancode; //送扫描码
keycode=P1; //取键值
if((keycode&0x0f)!=0x0f) //判断有健按下否
{
keycode=~keycode; //键值取反
switch(keycode)
{
case 0x11:P2=led[0];break;
case 0x12:P2=led[1];break;
case 0x14:P2=led[2];break;
case 0x18:P2=led[3];break;
default:P2=0xff;break;
}
}
scancode=0xdf; //扫描第二行
P1=scancode; //送扫描码
keycode=P1; //取键值
if((keycode&0x0f)!=0x0f) //判断有健按下否
{
keycode=~keycode; //键值取反
switch(keycode)
{
case 0x21:P2=led[4];break;
case 0x22:P2=led[5];break;
case 0x24:P2=led[6];break;
case 0x28:P2=led[7];break;
default:P2=0xff;break;
}
}
scancode=0xbf; //扫描第三行
P1=scancode; //送扫描码
keycode=P1; //取键值
if((keycode&0x0f)!=0x0f) //判断有健按下否
{
keycode=~keycode; //键值取反
switch(keycode)
{
case 0x41:P2=led[8];break;
case 0x42:P2=led[9];break;
case 0x44:P2=led[10];break;
case 0x48:P2=led[11];break;
default:P2=0xff;break;
}
}
scancode=0x7f; //扫描第四行
P1=scancode; //送扫描码
keycode=P1; //取键值
if((keycode&0x0f)!=0x0f) //判断有健按下否
{
keycode=~keycode; //键值取反
switch(keycode)
{
case 0x81:P2=led[12];break;
case 0x82:P2=led[13];break;
case 0x84:P2=led[14];break;
case 0x88:P2=led[15];break;
default:P2=0xff;break;
}
}
}
return;
}
key.h文件:
#ifndef _key_h
#define _key_h
extern unsigned char keycode;
extern unsigned char code led[];
void keyscan(void);
#endif
main.c文件:
#include<reg51.h>
#include"main.h"
unsigned char keycode="0xff";
unsigned char code led[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,}; //共阳极数码管显示代码
void key_isr(void) interrupt 0 //中断服务子程序
{
keyscan(); //调用键盘扫描子程序
return;
}
int main(void)
{
IT0=1; //设置边沿触发模式
EA=1;
EX0=1; //开中断
P2=keycode;
P1=0x0f; //初始化端口
for(;;) //等待中断
;
return 0;
}
main.h文件:
#ifndef _main_h
#define _main_h
extern void keyscan(void);
void key_isr(void);
#endif
tengjingshu_112148725 2009-5-3 22:45
用户403611 2009-5-3 15:31