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

📄 keyboard.asm

📁 这是一个有关C8051F020单片机的实验教学材料,相信对于单片机的研究人员会有很大的帮助.
💻 ASM
字号:
//-----------------------------------------------------------------------------
// 版权归新华龙电子公司所有
//-----------------------------------------------------------------------------
//
//文件名:	Keyboard.asm
//
//编写人:	LC
//
//编写时间:2005/03/10
//
//目标器件: C8051F02x
//
//编译工具: Silicon Laboratories IDE
//
//程序说明:	此程序动态扫描键盘,当有按键按下时,将此键转换成对应的数字键值,同时
//			蜂鸣器响一声

//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
$include (c8051f020.inc)	;SFR定义

//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------

PORTA	EQU		8000H			;8255端口A
PORTB	EQU		8001H			;8255端口B
PORTC	EQU		8002H			;8255端口C
PORTCON	EQU		8003H			;8255控制口

BUZ		EQU		P3.5		


	ORG		0
	AJMP	main
	ORG		30h

;延时子程序
Delay:
    MOV   R7, #01h			
Delay1:
    MOV   R6, #80h
Delay0:
    MOV   R5, #00h
    DJNZ  R5, $
    DJNZ  R6, Delay0
    DJNZ  R7, Delay1
	RET


main:
	;无效看门狗
   	MOV	 	WDTCN,#0deH
   	MOV		WDTCN,#0adH
   	LCALL	PORT_Init			;初始化I/O口
	MOV		DPTR,#PORTCON		;8255控制口
	MOV		A,#90H
	MOVX	@DPTR,A				;A口输入,B口输出
	MOV		R1,#0ffH			;置键盘扫描初值
LOOP:
	SETB	BUZ					;关蜂鸣器
SCANKEY:
	MOV		DPTR,#PORTB
	INC		R1
	CLR		C
	MOV		A,#04H
	SUBB	A,R1
	JNZ		NEXT
	MOV		R1,#00H
NEXT:
	CJNE	R1,#00H,LINE1
	MOV		A,#0FEH
	MOVX	@DPTR,A				;扫描第一列
	AJMP	LINE4	
LINE1:
	CJNE	R1,#01H,LINE2
	MOV		A,#0FDH
	MOVX	@DPTR,A				;扫描第二列
	AJMP	LINE4
LINE2:
	CJNE	R1,#02H,LINE3	
	MOV		A,#0FBH
	MOVX	@DPTR,A				;扫描第三列
	AJMP	LINE4
LINE3:
	CJNE	R1,#03H,LINE4
	MOV		A,#0F7H
	MOVX	@DPTR,A				;扫描第四列
LINE4:	
	LCALL	Delay
	MOV		DPTR,#PORTA
	MOVX	A,@DPTR				;读是否有键按下
	MOV		R2,A
	NOP
	CPL		A
	JZ		SCANKEY				;是否按键
	CLR		BUZ					;有键按下
	LCALL	Delay				;延时
	LCALL	Delay
	SETB	BUZ					
	CPL		A
	ANL		A,#0F0H
	JNZ		JKEY
	ORL		A,#0F0H				;屏蔽PA4~PA7
JKEY:
	CJNE	A,#0F0H,FUNKEY		;0~F按下
	;换算成数字键值
	MOV		A,R2
	CPL		A
	ANL		A,#0FH
	MOV		B,#02H
	DIV		AB
	CLR		C
	MOV		B,A
	SUBB	A,#04H
	JC		KEYVAL
	MOV		B,#03H
KEYVAL:
	MOV		A,B
	MOV		B,#04H
	MUL		AB
	CLR		C
	ADDC	A,R1
	NOP
	LJMP	LOOP
FUNKEY:							;F1~F4按下
	CJNE	A,#0E0H,F2
	MOV		A,#0F1H				;F1键按下
	AJMP	F5	
F2:
	CJNE	A,#0D0H,F3
	MOV		A,#0F2H				;F2键按下
	AJMP	F5
F3:
	CJNE	A,#0B0H,F4	
	MOV		A,#0F3H				;F3键按下
	AJMP	F5
F4:
	CJNE	A,#70H,LINE4
	MOV		A,#0F4H				;F4键按下
F5:	NOP		
	LJMP	LOOP
	RET

;初始化I/O
PORT_Init:
   	MOV	XBR2,#40H				;使能交叉开关和弱上拉
   	ORL	P74OUT,#0ffH			;使能P6,P7推挽输出
   	ORL	EMI0CF,#2cH				;EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期
   	ORL	EMI0TC,#6cH				;地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期
   	ORL	P3MDOUT,#0dfH			;使能P3.5推挽输出
   	RET
	END

⌨️ 快捷键说明

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