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

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
//-----------------------函数声明,变量定义---------------------------
#include <reg51.h>                    	//头文件
#define uchar unsigned char         	//类型定义
#define uint  unsigned int           	//类型定义
#define KEY P1
//-----------------------函数声明------------------------------------
void SCANkey();                        	//程序扫描键盘,供主程序调用
void delay(uint N);                   	//延时子程序,实现(16*N+24)us的延时 
bit hitkey();                         	//判断是否有键按下,有返回1,没有返回0
uchar scan_key();                     	//扫描键盘,返回键值
void key_manage(uchar keycode);    		//键值处理跳转程序
void key1(void);                      	//按键1处理程序
//……                                  //其它按键处理程序省略
//main():主函数
//在主函数中,先对系统进行初始化设置,其后主要任务是实时检测有无按键按下,有按键按下时,调用相应处理程序;无按键按下时,继续循环检测。
void main()
{
	EA=0;                              	//关中断
	while(1)                          	//循环检测按键,调用相应处理程序
	{ 
		SCANkey();                 		//调用扫描键盘程序
	}
}
//SCANkey():扫描键盘程序
//扫描键盘程序,有键按下完成按键处理,无键按下直接返回。
void SCANkey()
{
	uchar key_code;
	if(hitkey())                      	//判断是否有键按下
	{ 
		delay(1000);                 	//延时20ms左右,消除抖动干扰
		if(hitkey())                 	//判断是否有效按键
		{
			key_code=scan_key(); 
			while(hitkey());        	//等待按键释放
			key_manage(key_code);  		//键盘扫描、键值处理跳转、按键处理
		}
	}
}
//delay():延时子程序
//延时子程序,实现(16*N+24)us的延时。系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动。
void delay(uint N)  
{
	int i; 
	for(i=0;i<N;i++);
}

//hitkey():判断是否有键按下
//函数功能:判断是否有键按下,有返回1,没有返回0。
bit hitkey()                        	//判断是否有键按下,有返回1,没有返回0
{
	uchar scancode,keycode;
	scancode=0x0f;                 		//P1.4~P1.7输出全0
	KEY=scancode;
	keycode=KEY;                   		//读P1.0~P1.3的状态
	if((keycode&0x0f)==0x0f)     		//屏蔽高4位
		return(0);                 		//全1则无键闭合,返回0
	else 
		return(1);                 		//否则有键闭合,返回1
}
//scan_key():扫描键盘子程序
//扫描键盘,返回键值。高四位代表行,低四位代表列。
uchar scan_key()                   		//扫描键盘,返回键值(高四位代表行,低四位代表列)
{
	uchar scancode,keycode;
	scancode=0xef;                 		//键盘扫描码,采用逐行扫描法,P1.4=0,扫描第一列
	while(scancode!=0xff)
	{
		KEY=scancode;              		//输入扫描码,扫描P1.4对应的行
		keycode=KEY;               		//读出数据,看是否在此行上的某列键盘被按下   
		if((keycode&0x0f)!=0x0f)break; 	//扫描到按下的键,则退出  
		scancode=(keycode<<1)|0x0f;     //否则,左移,更新扫描码继续扫描  
    }  
		keycode=~keycode;            	//键盘扫描码变反,返回
		return(keycode);
}
//键值处理跳转子程序
//keycode 扫描键盘返回的键值。高四位代表行,低四位代表列。
void key_manage(uchar keycode)
{
	switch(keycode)
	 {
		case 0x11: key1();break;
		case 0x12: key2();break;
		case 0x14: key3();break;
		case 0x18: key4();break;
		case 0x21: key5();break;
		case 0x22: key6();break;
		case 0x24: key7();break;
		case 0x28: key8();break;
		case 0x41: key9();break;
		case 0x42: key10();break;
		case 0x44: key11();break;
		case 0x48: key12();break;
		case 0x81: key13();break;
		case 0x82: key14();break;
		case 0x84: key15();break;
		case 0x88: key16();break;
	// default:   
    }
 }

void key1(void)
{
//……
}
//……//其它键值处理程序省略

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -