功能要求:开机黑屏一按下任意按键后,数码管上显示该键的键号(0~F)一若没有新键按下,维持前次按键结果
#include <reg51.h>
#include<intrins.h>
char led_mod[]={...};//led显示0~f的码
char key_buf[]={...};//键值
void delay(unsigned int i){
unsigned int j=0;
for(;i>0;i--)
for(;j<125;j++);
}
char getkey(void){
//确定扫猫方式--》行或列
char key_scan[]={0xef,0xdf,0xbf,0x7f};//逐列扫猫,行都置1
char i,j;
for(i=0;i<4;i++){
P2=key_scan[i];//从第几列开始扫描 ,如第一列
if((P2&0x0f)!=0x0f){//判断这一列是否有哪一行的值不为1,即被按下
//如果第i列有某一行的值不为1,被按下了
for(j=0;j<16;j++){
if(key_buf[j]==P2) //看看0~f哪个键的值与P2相等(被按下后)
return j;//返回按下的键号
}
}
}
return -1;//所有列扫描完,没有行键被按下
//无键闭合
}
void main(){
char key=-1;
P0=0x00;
while(1){
key=getkey(); //获取键号
if(key!=-1)//因为getkey从0~15,所以判断是否按下是除去这几个数之外的数
P0=led_mod[key]; //对应输出0~f(16个键)
}
}