#include <reg52.h>
//#include <At89X52.h>
#define uchar unsigned char
#define uint unsigned int
sbit keydig_rck=P1^0; //用P3^2模拟串口时钟
sbit keydig_data=P1^1; //用P3^3模拟串口数据
sbit a0=ACC^0;
sbit L_1=P2^3; //定义P1_7连接矩阵键盘X_11
sbit L_2=P3^3; //定义P1_6连接矩阵键盘X_10
sbit L_3=P3^2; //定义P1_5连接矩阵键盘X_9
sbit H1=P1^7; //定义P1_7连接矩阵键盘X_12
sbit H2=P1^6; //定义P1_6连接矩阵键盘X_11
sbit H3=P1^5; //定义P1_5连接矩阵键盘X_10
sbit H4=P1^4; //定义P1_4连接矩阵键盘X_9
sbit Y_1=P0^0; //定义P0_0连接矩阵键盘Y_1
sbit Y_2=P0^1; //定义P0_1连接矩阵键盘Y_2
sbit Y_3=P0^2; //定义P0_2连接矩阵键盘Y_3
sbit Y_4=P0^3; //定义P0_3连接矩阵键盘Y_4
sbit Y_5=P0^4; //定义P0_4连接矩阵键盘Y_5
sbit Y_6=P0^5; //定义P0_5连接矩阵键盘Y_6
sbit Y_7=P0^6; //定义P0_6连接矩阵键盘Y_7
sbit Y_8=P0^7; //定义P0_7连接矩阵键盘Y_8
unsigned char bdata key_temp,delay_temp;
sbit b_key0=key_temp^0;sbit b_key1=key_temp^1;sbit b_key2=key_temp^2;sbit b_key3=key_temp^3;
sbit b_key4=key_temp^4;sbit b_key5=key_temp^5;sbit b_key6=key_temp^6;sbit b_key7=key_temp^7;
sbit b_delay0=delay_temp^0;sbit b_delay1=delay_temp^1;
sbit b_delay2=delay_temp^2;sbit b_delay3=delay_temp^3;
sbit b_delay4=delay_temp^4;sbit b_delay5=delay_temp^5;
sbit b_delay6=delay_temp^6;sbit b_delay7=delay_temp^7;
unsigned char bdata AD_key;
sbit b_AD_key0=AD_key^0;
sbit b_AD_key1=AD_key^1;
extern uint get_adc(uchar channel);
extern bit b_time10ms;
//-------------------------------------------------------------------------------------------------------
// 函数名称:out_dig
// 输入参数:data_buf
// 输出参数:无
// 功能说明:8位同步移位寄存器,将data_buf的数据逐位输出到keydig_data
//--------------------------------------------------------------------------------------------------------
void out_keydig(uchar data_buf)
{
uchar i;
i=8;//8个移位脉冲
ACC=data_buf;
do
{
keydig_rck=0;
keydig_data=a0;
keydig_rck=1;
ACC=ACC>>1;
}
while(--i!=0);
keydig_rck=0;
}
uchar scankey_4() {//m=8(74HC164)行,n=8列
unsigned char i,j,keynumber;
static unsigned char data key_buffer[8];
static unsigned char data key_delay[8];
bit b_work;
out_keydig(0xff);
P0=P0|0xFF;L_1=L_2=L_3=1;
//P1=P1|0xF0;
for (i=0;i<8;i++) {//行扫描
out_keydig(0xff);//X14=X15=X16=X17=X18=X19=1;
switch (i) {
case 0:out_keydig(0xfe);break;//QH=0
case 1:out_keydig(0xfd);break;//QG=0
case 2:out_keydig(0xfb);break;//QF=0
case 3:out_keydig(0xf7);break;//QE=0
case 4:out_keydig(0xef);break;//QD=0
case 5:out_keydig(0xdf);break;//QC=0
case 6:out_keydig(0xbf);break;//QB=0
case 7:out_keydig(0x7f);break;//QA=0
}
key_temp=key_buffer[i];delay_temp=key_delay[i];keynumber=i*8+32;//**32*
//delay(10);//
for (j=0;j<8;j++) {//读列
switch (j) {
case 0:
b_work=Y_1;
if (b_work!=b_key0) {
if(b_delay0) {
b_delay0=0;b_key0=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay0=1;key_delay[i]=delay_temp;}
}
break;
case 1:
b_work=Y_2;
if (b_work!=b_key1) {
if(b_delay1) {
b_delay1=0;b_key1=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay1=1;key_delay[i]=delay_temp;}
}
break;
case 2:
b_work=Y_3;
if (b_work!=b_key2) {
if(b_delay2) {
b_delay2=0;b_key2=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay2=1;key_delay[i]=delay_temp;}
}
break;
case 3:
b_work=Y_4;
if (b_work!=b_key3) {
if(b_delay3) {
b_delay3=0;b_key3=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay3=1;key_delay[i]=delay_temp;}
}
break;
case 4:
b_work=Y_5;
if (b_work!=b_key4) {
if(b_delay4) {
b_delay4=0;b_key4=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay4=1;key_delay[i]=delay_temp;}
}
break;
case 5:
b_work=Y_6;
if (b_work!=b_key5) {
if(b_delay5) {
b_delay5=0;b_key5=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay5=1;key_delay[i]=delay_temp;}
}
break;
case 6:
b_work=Y_7;
if (b_work!=b_key6) {
if(b_delay6) {
b_delay6=0;b_key6=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay6=1;key_delay[i]=delay_temp;}
}
break;
case 7:
b_work=Y_8;
if (b_work!=b_key7) {
if(b_delay7) {
b_delay7=0;b_key7=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay7=1;key_delay[i]=delay_temp;}
}
break;
//
}
keynumber++;
} /*end of for (j)*/
}/*end of for (i) 键处理结束*/
out_keydig(0xff);//X14=X15=X16=X17=X18=X19=1;
P0=P0|0xFF;L_1=L_2=L_3=1;
//P1=P1|0xF0;
b_time10ms=0;
return(0xff);//按键保持不变,则永远返回0xff
}
uchar scankey_3() {//m=4行,n=8列
unsigned char i,j,keynumber;
static unsigned char data key_buffer[8];
static unsigned char data key_delay[8];
bit b_work;
//static unsigned char time10ms;
out_keydig(0xff);//键盘74HC595行输出HGFEDC置高
//X14=X15=X16=X17=X18=X19=1
P0=P0|0xFF;//列线P0_5~P0_0置高
P1=P1|0xF0;
for (i=0;i<4;i++) {//行扫描
switch (i) {
case 0:
H4=1;H3=1;H2=1;H1=0;break;
case 1:
H4=1;H3=1;H2=0;H1=1;break;
case 2:
H4=1;H3=0;H2=1;H1=1;break;
case 3:
H4=0;H3=1;H2=1;H1=1;break;
}
key_temp=key_buffer[i];delay_temp=key_delay[i];keynumber=i*8;//
//delay(10);//
for (j=0;j<8;j++) {//读列
switch (j) {
case 0:
b_work=Y_1;
if (b_work!=b_key0) {
if(b_delay0) {
b_delay0=0;b_key0=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay0=1;key_delay[i]=delay_temp;}
}
break;
case 1:
b_work=Y_2;
if (b_work!=b_key1) {
if(b_delay1) {
b_delay1=0;b_key1=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay1=1;key_delay[i]=delay_temp;}
}
break;
case 2:
b_work=Y_3;
if (b_work!=b_key2) {
if(b_delay2) {
b_delay2=0;b_key2=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay2=1;key_delay[i]=delay_temp;}
}
break;
case 3:
b_work=Y_4;
if (b_work!=b_key3) {
if(b_delay3) {
b_delay3=0;b_key3=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay3=1;key_delay[i]=delay_temp;}
}
break;
case 4:
b_work=Y_5;
if (b_work!=b_key4) {
if(b_delay4) {
b_delay4=0;b_key4=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay4=1;key_delay[i]=delay_temp;}
}
break;
case 5:
b_work=Y_6;
if (b_work!=b_key5) {
if(b_delay5) {
b_delay5=0;b_key5=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay5=1;key_delay[i]=delay_temp;}
}
break;
case 6:
b_work=Y_7;
if (b_work!=b_key6) {
if(b_delay6) {
b_delay6=0;b_key6=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
else {b_delay6=1;key_delay[i]=delay_temp;}
}
break;
case 7:
b_work=Y_8;
if (b_work!=b_key7) {
if(b_delay7) {
b_delay7=0;b_key7=b_work;key_buffer[i]=key_temp;
return(b_work?keynumber+100:keynumber);
}
key_scan.rar_ScanKey库下载_key 74ls164_key sc_key_scan_单片机 算法
版权申诉
131 浏览量
2022-09-21
05:35:35
上传
评论
收藏 3KB RAR 举报
JonSco
- 粉丝: 77
- 资源: 1万+
最新资源
- SSM3J321T-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- skywalking K8S集群下安装
- 后端开发框架 MyBatis四大核心对象之ParameterHandler.pdf
- vue3和ant-design 实现前端多种验证密码规则,最全的前端验证密码规则
- SSM3J317T-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 高速光耦ICPL-075L规格书
- Java项目-基于Springboot+Vue的人职匹配推荐系统的设计与实现(源码+万字LW+部署视频+代码讲解视频+全套软件)
- 有限元大作业包含代码以及最后的报告
- MSYS2-X86-64
- SSM3J314T-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈