📄 keyled.s
字号:
SBRDR EQU 0X1D14008 ;SIO band rate prescaler register
SIOCON EQU 0X1D14000 ;SIO control register
PDATB EQU 0X1D2000C ;the data register for port B
I_ISPC EQU 0X1E00024 ;IRQ interrupt service claer register
SIODAT EQU 0X1D14004 ;SIO data register
INTPND EQU 0X1E00004 ;indicates the interrupt request status
SIOSTART EQU 0X08
PDATF EQU 0X1D20038
PDATG EQU 0x1d20044
;**************************************************************************
;在zlg_enable和zlg_disable 期间不要使用R0和R1,他们被用来保存SBRDR和SIOCON*
;**************************************************************************
MACRO
$label1 zlg_enable $PRE1 ;zlg7289芯片enable
$label1
LDR R0,=SBRDR ;R0保存变量用
LDR R1,=SIOCON ;R1保存变量用
LDR R2,[R0]
MOV R0,R2 ;SBRDR保存到R0中
LDR R2,[R1]
MOV R1,R2 ;SIOCON保存到R1中
MOV R3,#0X31
LDR R2,=SIOCON ;收发模式,SIO中断模式
STR R3,[R2]
MOV R3,#0XFF
LDR R2,=SBRDR ;波特率
STR R3,[R2]
LDR R2,=PDATB ;ZLG7289片选
LDR R3,=$PRE1
LDR R4,[R2]
MVN R5,R3 ;R5:=NOT R3
AND R4,R4,R5 ;R4:=R4 AND R5
STR R4,[R2]
MEND
MACRO
$label2 sendsiodata $PRE2 ;SIO发送数据
$label2
LDR R2,=I_ISPC
MOV R3,#0X10
STR R3,[R2]
LDR R2,=SIODAT ;向SIO数据寄存器中存数据
;LDR R3,=$PRE2
MOV R3,$PRE2
STR R3,[R2]
LDR R2,=SIOCON
LDR R3,=SIOSTART
LDR R4,[R2]
ORR R5,R4,R3
STR R5,[R2]
1 LDR R4,=INTPND
LDR R5,[R4]
MOV R6,#0X10
AND R5,R5,R6
CMP R5,#0X10
BNE %b1
LDR R2,=I_ISPC
MOV R3,#0X10
STR R3,[R2]
MEND
MACRO
$lable3 zlg_disable ;ZLG7289芯片DISABLE
$lable3
LDR R2,=PDATB
LDR R4,[R2]
MOV R3,#0X20
ORR R4,R4,R3
STR R4,[R2]
LDR R2,=SBRDR
STR R0,[R2]
LDR R2,=SIOCON
STR R1,[R2]
MEND
MACRO
$label4 timer $outside, $inside ;延时
$label4
MOV R2,#0
REPEAT ADD R2,R2,#1
CMP R2,#$outside
BNE NEXT1
B DELAYOVER
NEXT1 MOV R3,#0
NEXT2 ADD R3,R3,#1
CMP R3,#$inside
BNE NEXT2
B REPEAT
DELAYOVER
MEND
AREA receivedisplay,code,readonly
export keyled
keyled ;由C跳入汇编的入口
START
CHECK LDR R2,=PDATG ;查询键盘有无按键按下动作
LDR R3,[R2]
AND R3,R3,#0X10
CMP R3,#0X10
BEQ CHECK
KEY_ZLGENABLE zlg_enable 0X20
READKEY sendsiodata #0X15 ;向ZLG7289发出读键盘数据指令
LDR R2,=PDATF ;SIO准备接收从ZLG7289来的数据
LDR R5,[R2]
MOV R4,#0X4
ORR R5,R5,R4
STR R5,[R2]
RECEIVE sendsiodata #0X0 ;接收ZLG7289发出的按下的键盘数据
LDR R2,=PDATF ;SIO接收关闭
LDR R3,[R2]
AND R3,R3,#0XB
STR R3,[R2]
LDR R2,=SIODAT
LDR R7,[R2] ;KEY存在R7中
KEY_ZLGDISAB zlg_disable
MOV R3,#0 ;延时1
REPEAT1 ADD R3,R3,#1
CMP R3,#40
BNE NEXT11
B DELAYOVER1
NEXT11 MOV R4,#0
NEXT22 ADD R4,R4,#1
CMP R4,#100
BNE NEXT22
B REPEAT1
DELAYOVER1
ZLGENABLE zlg_enable 0X20
SENDINSTR sendsiodata #0X80 ;发送显示位命令
LDR R9,=KEYBOARD ;将键盘表格的地址放入R9中
LDRB R8,[R7,R9] ;查表找出被按下键盘对应的键值
passpre sendsiodata R8 ;发送显示位数据
;SENDHIDE sendsiodata #0X98 ;消隐控制指令
;SENDSIG sendsiodata #0X1 ;仅个位显示
ZLGDISAB zlg_disable
DELAYTIME timer 400, 400 ;延时2
B START
KEYBOARD DCB 0X7,0X4,0X1,0X0,0XA,0X0,0X0,0X0,0X8,0X5,0X2,0X0,0XA,\
0X0,0X0,0X0,0X9,0X6,0X3,0XA,0XA,0XA,0X0,0X0,0XA,0X0,0XA
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -