📄 key.c
字号:
//对4X4按键进行编码。P1.3--P1.0作行扫描,P1.7--P1.4作列扫描
//P3输出编码到数码管,
//P3.7--A P3.6--B P3.5--C P3.4--D
//P3.3--E P3.2--F P3.1--G
//P2作位控口。
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
void dlms(void); /*延时函数*/
uchar kbscan(void); /*键扫描函数*/
void dlms()
{ uchar i;
for(i=200;i>0;i--){}
}
uchar kbscan(void)
{
uchar sccode,recode;
P1=0xf0; /*发全0行扫描码,列线输入*/
if((P1&0xf0)!=0xf0) /*判断读进来的P1是否有变化,既有无键按下*/
{ dlms(); /*延时去抖*/
if((P1&0xf0)!=0xf0) /*再判断是否是误动作引起的键变化*/
{sccode=0xfe; /*逐行扫描码初值*/
while((sccode&0x10)!=0) /*判数行扫描码左移时,不超4位*/
{P1=sccode; /*输出行扫描码*/
if((P1&0xf0)!=0xf0) /*判断读进P1是否有变化,既本行有无键按下*/
{recode=(P1&0xf0)|0x0f;
return((~sccode)+(~recode));/*返回按键特征码*/
}
else
sccode=(sccode<<1)|0x01; /*行扫描码左移一位*/
}
}
}
return(0);
}
void todokey(j)
uchar j;
{
switch(j)
{
case 0x11: {P3=0xfc;P2=0x00;break;} /*0*/
case 0x21: {P3=0x60;P2=0x00;break;} /*1*/
case 0x41: {P3=0xda;P2=0x00;break;} /*2*/
case 0x81: {P3=0xf2;P2=0x00;break;}
case 0x12: {P3=0x66;P2=0x00;break;}
case 0x22: {P3=0xb6;P2=0x00;break;}
case 0x42: {P3=0xbe;P2=0x00;break;}
case 0x82: {P3=0xe0;P2=0x00;break;}
case 0x14: {P3=0xfe;P2=0x00;break;}
case 0x24: {P3=0xf6;P2=0x00;break;}
case 0x44: {P3=0xee;P2=0x00;break;}
case 0x84: {P3=0x3e;P2=0x00;break;}
case 0x18: {P3=0x9c;P2=0x00;break;}
case 0x28: {P3=0x7a;P2=0x00;break;}
case 0x48: {P3=0x9e;P2=0x00;break;} /*E*/
case 0x88: {P3=0x8e;P2=0x00;break;} /*F*/
default:break;
}
}
void main()
{
uchar key;
while(1)
{
key=kbscan();
dlms();
todokey(key);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -