📄 main.c
字号:
/*************************************************************************************************************
**功能:行列扫描式键盘,键盘值通过串口传输给其他CPU。
**说明:这里很详细地将了怎样编写一个4*4的行列扫描式键盘(它已经通过keil编译并使用)。该程序 利用P1口作为行列扫描端口,它能够识别是否有多键按下,键是否已经松开。对于初学者来讲是 一个很好的源程序
**************************************************************************************************************/
#include"config.h"
bit is_sen; /*是否要发送数据的标志*/
int8u data sen_data; /*所要发送的数据*/
int8u bdata key,temp;
sbit key0=key^0;
sbit key1=key^1;
sbit key2=key^2;
sbit key3=key^3;
sbit temp0=temp^0;
sbit temp1=temp^1;
sbit temp2=temp^2;
sbit temp3=temp^3;
void delay50()
{
int16u i=6000;
while(i!=0)
{
i--;
}
}
/*******************************************************
**名称:void sen_byte()
**功能:通过串口发送数据
**说明:通过设置发送标志和触发发送完毕中断来通知CPU要通
过串口来发送数据。这样做的好处是可以提高CPU的工
作效率。因为要发送数据是通过串口中断来把数据写
到SBUF里,写完一个字节后就跳出。如果是发送一串
数据的话,效率更加明显。
*******************************************************/
void sen_byte()
{
is_sen=1;
TI=1;
}
void sen() interrupt 4
{
if(TI)
{
TI=0;
if(is_sen==1)
{
SBUF=sen_data;
is_sen=0;
}
}
}
void main()
{
is_sen=0;
TMOD=0x20;
SCON=0x50;
PCON=0;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ES=1;
EA=1;
/************************************************
**以下是键盘扫描的程序。当发现有键按下时就读取键
**的位置值,然后编码并通过串口把键号送出去
************************************************/
for(; ;)
{
P14=0;
P15=1;
P16=1;
P17=1;
key0=P10;
key1=P11;
key2=P12;
key3=P13;
key&=0x0f;
if(key!=0xf)
{
delay50();
temp0=P10;
temp1=P11;
temp2=P12;
temp3=P13;
temp&=0x0f;
if(key==temp)
{
switch(key)
{
case 14:sen_data=1;break;
case 13:sen_data=5;break;
case 11:sen_data=9;break;
case 7:sen_data=13;break;
default:break;
}
sen_byte();
while(P10!=1||P11!=1||P12!=1||P13!=1);
}
}
P14=1;
P15=0;
P16=1;
P17=1;
key0=P10;
key1=P11;
key2=P12;
key3=P13;
key&=0x0f;
if(key!=0xf)
{
delay50();
temp0=P10;
temp1=P11;
temp2=P12;
temp3=P13;
temp&=0x0f;
if(key==temp)
{
switch(key)
{
case 14:sen_data=2;break;
case 13:sen_data=6;break;
case 11:sen_data=10;break;
case 7:sen_data=14;break;
default:break;
}
sen_byte();
while(P10!=1||P11!=1||P12!=1||P13!=1);
}
}
P14=1;
P15=1;
P16=0;
P17=1;
key0=P10;
key1=P11;
key2=P12;
key3=P13;
key&=0x0f;
if(key!=0xf)delay50();
temp0=P10;
temp1=P11;
temp2=P12;
temp3=P13;
temp&=0x0f;
if(key!=0xf)
{
delay50();
temp0=P10;
temp1=P11;
temp2=P12;
temp3=P13;
temp&=0x0f;
if(key==temp)
{
switch(key)
{
case 14:sen_data=3;break;
case 13:sen_data=7;break;
case 11:sen_data=11;break;
case 7:sen_data=15;break;
default:break;
}
sen_byte();
while(P10!=1||P11!=1||P12!=1||P13!=1);
}
}
P14=1;
P15=1;
P16=1;
P17=0;
key0=P10;
key1=P11;
key2=P12;
key3=P13;
key&=0x0f;
if(key!=0xf)
{
delay50();
temp0=P10;
temp1=P11;
temp2=P12;
temp3=P13;
temp&=0x0f;
if(key==temp)
{
switch(key)
{
case 14:sen_data=4;break;
case 13:sen_data=8;break;
case 11:sen_data=12;break;
case 7:sen_data=16;break;
default:break;
}
sen_byte();
while(P10!=1||P11!=1||P12!=1||P13!=1);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -