📄 l5-9.c
字号:
/**********************************************************************
程序名称:L5-9.c
程序功能:4×4矩阵非编码键盘的应用
程序作者:张三
创建时间:2008-3-28
**********************************************************************/
#include<reg51.h>
#define unchar unsigned char
#define unint unsigned int
unchar HSM,LJC,keyvalue; // HSM为行扫描码,LJC为列检测数据,keyvalue为键值
unchar tmp; // 用于主函数中接收键值
void delayXms( unint x );
unchar keyscan( void );
/**********************************************************************
函数名称:main( void )
函数功能:主函数,键值处理
函数作者:张三
创建时间:2008-3-28
**********************************************************************/
void main( void )
{
while( 1 ){
tmp = keyscan( );
switch( tmp ){
case 0x11: P0 = 0x3f; break; // 0
case 0x21: P0 = 0x06; break; // 1
case 0x41: P0 = 0x5b; break; // 2
case 0x81: P0 = 0x4f; break; // 3
case 0x12: P0 = 0x66; break; // 4
case 0x22: P0 = 0x6d; break; // 5
case 0x42: P0 = 0x7d; break; // 6
case 0x82: P0 = 0x07; break; // 7
case 0x14: P0 = 0x7f; break; // 8
case 0x24: P0 = 0x6f; break; // 9
case 0x44: P0 = 0x77; break; // A
case 0x84: P0 = 0x7c; break; // b
case 0x18: P0 = 0x39; break; // C
case 0x28: P0 = 0x5e; break; // d
case 0x48: P0 = 0x79; break; // E
case 0x88: P0 = 0x71; break; // F
default: P0 = 0x00;
}
delayXms( 100 );
}
}
/**********************************************************************
函数名称:delayXms( unsigned int x )
函数功能:延时函数,Xms
函数作者:张三
创建时间:2008-3-28
**********************************************************************/
void delayXms( unint x )
{
unchar y, z;
for( ; x>0; x-- )
for( y=0; y<4; y++ )
for( z=0; z<250; z++ ) ;
}
/**********************************************************************
函数名称:unchar keyscan( void )
函数功能:键盘扫描及键值确定
函数作者:张三
创建时间:2008-3-28
**********************************************************************/
unchar keyscan( void )
{
P1 = 0xf0; // 行线全为低电平, 列线全为高电平
LJC = P1&0xf0; // 第1次读列检测状态
if( LJC != 0xf0 ){
delayXms( 10 ); // 若有键被按下, 则延时10ms
LJC = P1&0xf0; // 第2次读列检测状态:0xe0, 0xd0, 0xb0, 0x70
if( LJC != 0xf0 ){ // 若有闭合键, 则逐行扫描
HSM = 0xfe; // 扫描码分别为0xfe,0xfd,0xfb,0xf7
while((HSM&0x10)!=0){ // 若扫描码为0xef, 则结束扫描
P1 = HSM; // 输出行扫描码
LJC = P1&0xf0; // 读列检测数据:0xe0, 0xd0, 0xb0, 0x70
if( LJC != 0xf0 ){ // 本行有闭合键
keyvalue = ( ~HSM )+( ~(LJC|0x0f) ); // 计算键值
return( keyvalue ); // 返回键值
}
else HSM = (HSM<<1)|0x01; // 行扫描码左移1位,准备扫描下一行
}
}
}
return( 0x00 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -