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

📄 scan_key.c

📁 用holtek3000开发环境编写的单片机C语言键盘扫描程序.
💻 C
字号:
#include "ht48e50.h"
#define KEY1         	0x01
#define KEY1_RELEASE    0x81
#define KEY2            0x02
#define KEY2_RELEASE    0x82
#define KEY3            0x03
#define KEY3_RELEASE    0x83
#define KEY4            0x04
#define KEY4_RELEASE    0x84
#define KEY5            0x05
#define KEY5_RELEASE    0x85
#define KEY6            0x06
#define KEY6_RELEASE    0x86
#define KEY7            0x07
#define KEY7_RELEASE    0x87
#define KEY8            0x08
#define KEY8_RELEASE    0x88
#define KEY9            0x09
#define KEY9_RELEASE    0x89
#define KEY10           0x0a
#define KEY10_RELEASE   0x8a
#define KEY11           0x0b
#define KEY11_RELEASE   0x8b
#define KEY12           0x0c
#define KEY12_RELEASE   0x8c
#define KEY13           0x0d
#define KEY13_RELEASE   0x8d
#define KEY14           0x0e
#define KEY14_RELEASE   0x8e
#define KEY15           0x0f
#define KEY15_RELEASE   0x8f
#define KEY16           0x10
#define KEY16_RELEASE   0x90


#define com0	_pc0
#define com1	_pc1

//===============================================
// 变量定义
//===============================================
#pragma rambank0
unsigned char NewKey;
unsigned char OldKey;
unsigned char LastKey;
unsigned char Debounce;
unsigned char DispBuff[4];
unsigned char PlaceNo;
//===============================================
//	子函数声明
//===============================================
void SysInit(void);
void HexToBCD(unsigned char *hex_data);
void Disp7LED(void);
void ProcessKey(void);
bit  ScanKey(void);
//===============================================
void main(void)
{
	SysInit();
	while(1)
	{
		if(ScanKey())
			ProcessKey();
		Disp7LED();	
	}
}
//===============================================
//	系统初始化
//===============================================
void SysInit(void)
{
	_intc=0x00;
	_pac=0x00;
	_pbc=0xff;
	_pcc=0xC3;

	for(_mp0=0x40;_mp0>0x00;_mp0++)
		_iar0=0x00;

	DispBuff[0]=DispBuff[1]=DispBuff[2]=DispBuff[3]='8';
	
	
	
}
//====================================================
//	刷新七段碼显示
//  1.四位七段碼显示缓存区 DispBuff[4]
//	2.目前刷新的位码 PlaceNo
//====================================================
void Disp7LED(void)
{
	// "0123456789 "
	unsigned char const Seg7Code[11]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,
								      ~0x6d,~0x7d,~0x07,~0x7f,~0x6f,
								      ~0x00};
	unsigned char temp;
	unsigned char count;
	
	temp=0x04;
	count=DispBuff[PlaceNo];
	if((count>=0x30)&&(count<=0x39))
		count-=0x30;
	else
		count=10;

	_pc=0x00;					// 消隐上一其他位上的段碼显示
	_pa=Seg7Code[count];		// 输出数码管的段碼值
	count=PlaceNo;
	while(count)
	{
		_rl(&temp);
		count--;
	}
	_pc=temp;
	
	PlaceNo++;
	if(PlaceNo>3)
		PlaceNo=0x00;
}
//====================================================
// 	将十六进制数转换为BCD码
//	该十六进制数必须小于100
//====================================================
void HexToBCD(unsigned char *hex_data)	
{
	unsigned char bcd_data;

	for(bcd_data=0;*hex_data>9;bcd_data++)
		*hex_data-=10;
	_swap(&bcd_data);
	bcd_data|=*hex_data;
	*hex_data=bcd_data;
}
//====================================================
//	0:	表示没有键按下或松开
//  1:	表示有键按下或松开(NewKey为要执行的按键码)
//====================================================
bit ScanKey(void)
{
	unsigned char i;
	unsigned char Temp;
	_pbc=0xf0;							// 设置Pa0_Pa3 为输出,Pa4_Pa7 为输入端口
	_pb=0xff;							// Pa0_Pa3 输出为高
	Temp=0xfe;							// 行扫描信息
	for(i=0;i<4;i++)					// 按键行扫描
	{
		_pb=Temp;						// 写行扫描信息
		_nop();
		_nop();
		if((~_pb)&0x10){NewKey=1;break;}	// 扫描第一列
		if((~_pb)&0x20){NewKey=2;break;}	// 扫描第二列
		if((~_pb)&0x40){NewKey=3;break;}	// 扫描第三列
		if((~_pb)&0x80){NewKey=4;break;}	// 扫描第四列
		_rl(&Temp);						// 准备扫描下一行扫描信息
	}
	if(i>3)
		NewKey=0;						// 如果没有键按下,则NewKey=0
	else
		NewKey +=i*4;					// 计算按键的键值
	
	if(NewKey==OldKey)					// 比较上次扫描到的键值和此次扫描到的键值是否相同
	{
		if(!Debounce)					// 判断去抖是否完成
		{
			if(NewKey==LastKey)			// 判断扫描到的按键是否与执行过的按键相同
				return 0;				// 相同,则表示没有键按下
			else
			{
				if(NewKey==0)			// 如果不相同,则判断是否是按键松开
				{
					NewKey=LastKey+0x80;// 修改扫描到的按键的键值
					LastKey=OldKey;		
					return 1;	
				}
				else					// 不是按键松开,则是新的按键被按下
				{
					LastKey=OldKey;		// 此次要执行的按键值
					return 1;
				}
			}		
		}
		else							// 如果去抖动没有完成,则继续去抖动
		{
			Debounce--;
			return 0;		
		}
	}
	else								// 如果与上次扫描的结果不同,则保存此次扫描到的键值
	{
		OldKey=NewKey;
		Debounce=5;
		return	0;
	}
}
//====================================================
//	按键处理
//====================================================
void ProcessKey(void)
{
	if(NewKey&0x80)			// 按键松开
	{
		NewKey&=0x7f;		// 去掉最高位
		HexToBCD(&NewKey);	
		DispBuff[0]=' ';
		DispBuff[1]=' ';
		DispBuff[2]=(((NewKey&0xf0)>>4)+0x30);	// 转换为ASCII码
		DispBuff[3]=((NewKey&0x0f)+0x30);
	}
	else					// 按键按下
	{
		HexToBCD(&NewKey);	
		DispBuff[0]=(((NewKey&0xf0)>>4)+0x30);
		DispBuff[1]=((NewKey&0x0f)+0x30);
		DispBuff[2]=' ';
		DispBuff[3]=' ';
	}
/*
	switch(NewKey)
	{
		case KEY1:
					_nop();
		case KEY1_RELEASE:
					_nop();
		case KEY2:
					_nop();
		case KEY2_RELEASE:
					_nop();
		case KEY3:
					_nop();
		case KEY3_RELEASE:
					_nop();
		case KEY4:
					_nop();
		case KEY4_RELEASE:
					_nop();
		case KEY5:
					_nop();
		case KEY5_RELEASE:
					_nop();
		case KEY6:
					_nop();
		case KEY6_RELEASE:
					_nop();
		case KEY7:
					_nop();
		case KEY7_RELEASE:
					_nop();
		case KEY8:
					_nop();
		case KEY8_RELEASE:
					_nop();
		case KEY9:
					_nop();
		case KEY9_RELEASE:
					_nop();
		case KEY10:
					_nop();
		case KEY10_RELEASE:
					_nop();
		case KEY11:
					_nop();
		case KEY11_RELEASE:
					_nop();
		case KEY12:
					_nop();
		case KEY12_RELEASE:
					_nop();
		case KEY13:
					_nop();
		case KEY13_RELEASE:
					_nop();
		case KEY14:
					_nop();
		case KEY14_RELEASE:
					_nop();
		case KEY15:
					_nop();
		case KEY15_RELEASE:
					_nop();
		case KEY16:
					_nop();
		case KEY16_RELEASE:
					_nop();
		default:break; 	
	}
*/		
}

⌨️ 快捷键说明

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