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

📄 ht48 keyboardscan.asm

📁 自己写的ht48r70a单片机的键盘扫描程序
💻 ASM
字号:
;HT48单片机
#include ht48r70a-1.INC

DataBus					EQU			PA
DataBus_c				EQU			PAC

variable		.section		'data'
		scanNum		db		?			;用于记录扫描线编号
		count1		db		?			;循环延时计数
		count2		db		?			;循环延时计数



code			.section		'code'
		org		000h
		jmp		main
		org		008h
		call	T0_Isp
		org		010h
main:
		mov		a, 000h
		mov		tmr0l, a
		mov		a, 0d8h			;10ms
		mov		tmr0h, a		;初始化
		set 	emi
		set		et0i		;开中断
		mov		a, 10010000b
		mov		tmr0c, a		;设置T0工作模式,启动定时
		jmp		$

T0_Isp			proc
		clr		tmr0c			;关闭计数器0
		
		mov		a, 0fh
		orm 	a, pdc
		mov		a, 8fh
		andm	a, pdc			;将pd的低四位设为输入,4,5,6位设为输出

		clr		DataBus_c
		clr		DataBus			;数据线上放0

		call	Delay10ms		
		call	Delay10ms		;软件去抖

		clr		scanNum

Scan:
		swap	scanNum
		mov		a, 08fh
		and		a, pd
		or		a, scanNum
		mov		pd, a
		swap	scanNum
		inc		scanNum			;设置扫描线号
		
		mov		a, pd
		and		a, 07h
		xor		a, 07h
		snz		z				;不为全1
		jmp		FindKey			;如果不为全1,则有键按下,输入确定按键
		mov		a, 4
		sub		a, scanNum
		snz		z				;是否已扫描完
		jmp		Scan
		jmp		EndScan

FindKey:
		dec		scanNum			;恢复扫描线号
		snz		pd0
		jmp		Pd0_Press
		snz		pd1
		jmp		Pd1_Press
		snz		pd2
		jmp		Pd2_Press
		jmp		Error

Pd0_Press:
		mov		a, scanNum
		sub		a, 0
		sz		z
		jmp		Pd0_0
		mov		a, scanNum
		sub		a, 1
		sz		z
		jmp		Pd0_1
		mov		a, scanNum
		sub		a, 2
		sz		z
		jmp		Pd0_2
		jmp		Pd0_3
Pd0_0:
		mov		a, 0ch
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd0_1:
		mov		a, 09h
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd0_2:
		mov		a, 6
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd0_3:
		mov		a, 03h
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘

Pd1_Press:
		mov		a, scanNum
		sub		a, 0
		sz		z
		jmp		Pd1_0
		mov		a, scanNum
		sub		a, 1
		sz		z
		jmp		Pd1_1
		mov		a, scanNum
		sub		a, 2
		sz		z
		jmp		Pd1_2
		jmp		Pd1_3
Pd1_0:
		mov		a, 0ah
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd1_1:
		mov		a, 7
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd1_2:
		mov		a, 4
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd1_3:
		mov		a, 1
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘

Pd2_Press:
		mov		a, scanNum
		sub		a, 0
		sz		z
		jmp		Pd2_0
		mov		a, scanNum
		sub		a, 1
		sz		z
		jmp		Pd2_1
		mov		a, scanNum
		sub		a, 2
		sz		z
		jmp		Pd2_2
		jmp		Pd2_3
Pd2_0:
		mov		a, 0bh
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd2_1:
		mov		a, 08h
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd2_2:
		mov		a, 5
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘
Pd2_3:
		mov		a, 02h
		mov		tblp, a
		tabrdl	DataBus
		jmp		ReScan			;继续读键盘

ReScan:
		mov		a, pd
		and		a, 07h
		xor		a, 07h
		snz		z
		jmp		ReScan
		jmp		EndScan			;继续摸摸直到松开键盘

Error:
		set		pa				;出错,LED全亮

EndScan:
		clr		pa
		mov		a, 10010000b
		mov		tmr0c, a		;设置T0工作模式,启动定时
		reti
T0_Isp			endp

Delay10ms		proc
		mov		a, 10
		mov		count1, a
loop:
		mov		a, 20
		mov		count2, a
		sdz		count2
		jmp		$ - 1
		sdz		count1
		jmp		loop 
		ret
Delay10ms		endp

;数字的LED编码表

				org			lastpage
SegmentTable:
				DC			00111111b		;0
				DC			00000110b		;1
				DC			01011011b		;2
				DC			01001111b		;3
				DC			01100110b		;4
				DC			01101101b		;5
				DC			01111101b		;6
				DC			00000111b		;7
				DC			01111111b		;8
				DC			01101111b		;9
				DC			01110111b		;a
				DC			01111100b		;b
				DC			00111001b		;c
				DC			01011110b		;d
				DC			01111011b		;e
				DC			01110001b		;f
				
END


⌨️ 快捷键说明

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