start:
MOV R0, #0 ; 清零R0-第一个键是key0
; 扫描 row0
SETB P0.3 ; 置1 row3
CLR P0.0 ; 清0 row0
CALL colScan ; 调用 column扫描子程序
JB F0, finish ; | 如果置1了F0,则跳到程序末尾
; | (因为找到了按下的键,其编号存储在R0)
; 扫描 row1
SETB P0.0 ; 置1 row0
CLR P0.1 ; 清0 row1
CALL colScan ; 调用 column扫描子程序
JB F0, finish ; | 如果置1了F0,则跳到程序末尾
; | (因为找到了按下的键,其编号存储在R0)
; 扫描 row2
SETB P0.1 ; 置1 row1
CLR P0.2 ; 清0 row2
CALL colScan ; 调用 column扫描子程序
JB F0, finish ; | 如果置1了F0,则跳到程序末尾
; | (因为找到了按下的键,其编号存储在R0)
; 扫描 row3
SETB P0.2 ; 置1 row2
CLR P0.3 ; 清0 row3
CALL colScan ; 调用 column扫描子程序
JB F0, finish ; | 如果置1了F0,则跳到程序末尾
; | (因为找到了按下的键,其编号存储在R0)
JMP start ; | 返回扫描row0
; | (这就是为什么在程序开始时置1row3,当程序跳回开始时,row3刚刚被扫描)
finish:
JMP $ ; 找到按键时程序执行到此处-不执行任何操作
; column扫描子程序
colScan:
JNB P0.4, gotKey ; 如果col0被清0-找到按键
INC R0 ; 否则移到下一个按键
JNB P0.5, gotKey ; 如果col1被清0-找到按键
INC R0 ; 否则移到下一个按键
JNB P0.6, gotKey ; 如果col2被清0-找到按键
INC R0 ; 否则移到下一个按键
RET ; 子程序返回-未找到按键
gotKey:
SETB F0 ; 找到按键-置1F0
RET ; 子程序返回
END
|