⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l5-9.c

📁 单片机C语言程序设计教程与实训源代码及图片 单片机C语言程序设计教程与实训源代码及图片
💻 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 + -