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

📄 keyboard.asm

📁 基于单片机控制的数控电流源
💻 ASM
字号:
//===========================================================================
//函数说明:1*8键盘扫描程序
//调用方法:void keyboard(void)
//
//注意事项:1、使用IOA的高8位作为1*8键盘的接口
//			2、按键初始状态为低电平,按键有效时为高电平
//			3、采用直接扫描的方法,只对键盘扫描一次
//			4、若没有按键,则退出程序,注意在程序外部循环时加入喂狗
//			5、若没有放开按键,整个程序在函数void keyboard(void)里死循环
//			6、全局变量key_value=0时为没有按键状态,1~8分别为8个按键的键值
//===========================================================================

.include hardware.inc

.ram
.public _key_value
.var _key_value

.code
//=========================================================================================
//
//=========================================================================================
.public _keyboard
_keyboard:	.proc
	PUSH R1,R5 TO [sp]

?DETECT:
	R2=[P_IOA_Data]	
	R2|=0xff00			//保护低8位数据
	R2^=0xff00			//保护低8位数据,高8位设置成0
	[P_IOB_Data]=R2

	R2=[P_IOA_Attrib]	
	R2|=0xff00			//保护低8位数据
	R2^=0xff00			//保护低8位数据,高8位设置成0	
	[P_IOB_Attrib]=R2

	R2=[P_IOA_Dir]	
	R2|=0xff00			//保护低8位数据
	R2^=0xff00			//保护低8位数据,高8位设置成0
	[P_IOA_Dir]=R2

	R2=[P_IOA_Data]
	R2&=0xff00
	CMP R2,0x0000		//检查是否有按键,若全为低电平,则无按键;否则为有按键
	JE ?RET_KEY			//无按键,退出键盘程序
	CALL DELAY_20ms		//有按键,进行延时消抖

	R2=[P_IOA_Data]
	R2&=0xff00
	CMP R2,0x0000		//检查是否有按键,若全为低电平,则为抖动;否则为有按键	
	JE ?RET_KEY			//抖动,退出键盘程序		
	R3=1				//有按键,计算键值,设定按键初始值为0
	R2=R2 LSR 4
	R2=R2 LSR 4
?CALCULATE:
	TEST R2,0x0001	
	JNZ ?END_CAL			//检测到按键位置
	R3+=1
	R2=R2 LSR 1
	JMP ?CALCULATE
?END_CAL:
	NOP
	
?DETECT_KEY_OFF:
	R2=0x0001
	[P_Watchdog_Clear]=R2
	R2=[P_IOA_Data]
	R2&=0xff00
	CMP R2,0x0000	
	JNE ?DETECT_KEY_OFF		//若不相等,则按键尚未释放
	CALL DELAY_20ms			//延时消抖
	R2=[P_IOB_Data]
	R2&=0xff00
	CMP R2,0x0000	
	JNE ?DETECT_KEY_OFF		//若不相等,则为抖动,则按键尚未释放
	[_key_value]=R3	
?RET_KEY:			
	POP R1,R5 FROM [SP]
	RETF
.ENDP	
	
//=========================================================================================
//延时20ms子程序,在CPU频率为24.576/8=3.072MHz下,循环6000次,则约为20ms
//=========================================================================================
	
DELAY_20ms:	.PROC
	PUSH R4,R4 to [sp]
	R4=0
LOOP:
	R4+=1;
	CMP R4,6000
	JB LOOP
	POP R4,R4 from [sp]
	RETF
.ENDP	

⌨️ 快捷键说明

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