📄 keyboard.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 + -