?? h19.asm
字號:
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口
IN equ 08001h ; 鍵盤讀入口
HasRcv equ 20h.0 ; 接收標志位
LEDBuf equ 40h ; 顯示緩沖
RCVBuf equ 50H ; 接收緩沖
ORG 0000H
LJMP START
; 串行口中斷程序
ORG 0023H
JNB TI,S0_R
CLR TI
NOP
SJMP S0_RET
S0_R: ; 接收數(shù)據(jù)
CLR RI
MOV RCVBUF,SBUF ; 保存數(shù)據(jù)
SETB HasRcv ; 提示收到數(shù)據(jù)
NOP
S0_RET:
RETI
LEDMAP: ; 八段管顯示碼
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
Delay: ; 延時子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6個八段管
mov r2, #00100000b ; 從左邊開始顯示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 關(guān)所有八段管
mov a, @r0
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 顯示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 顯示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
ret
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 輸出線置為0
mov dptr, #IN
movx a, @dptr ; 讀入鍵狀態(tài)
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 鍵碼定義
db 16h, 15h, 14h, 0ffh
db 13h, 12h, 11h, 10h
db 0dh, 0ch, 0bh, 0ah
db 0eh, 03h, 06h, 09h
db 0fh, 02h, 05h, 08h
db 00h, 01h, 04h, 07h
GetKey:
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b
mov r2, #6
KLoop:
mov a, r1 ; 找出鍵所在列
cpl a
movx @dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, @r0
cpl a
anl a, #0fh
jnz Goon1 ; 該列有鍵入
djnz r2, KLoop
mov r2, #0ffh ; 沒有鍵按下, 返回 0ffh
sjmp Exit
Goon1:
mov r1, a ; 鍵值 = 列 X 4 + 行
mov a, r2
dec a
rl a
rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中為讀入的行值
mov r1, #4
LoopC:
rrc a ; 移位找出所在行
jc Exit
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit:
mov a, r2 ; 取出鍵碼
mov dptr, #KeyTable
movc a, @a+dptr
mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等鍵釋放
clr a
movx @dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
START:
MOV SP, #60H
MOV IE, #0 ; DISABLE ALL INTERRUPT
MOV TMOD,#020H ; 定時器1工作于方式2 (8位重裝)
MOV TH1, #0F3H ; 波特率
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -