?? b06.asm
字號:
; “驗證式” 實驗六 直流電機轉速測量與控制實驗
; 文件名:B06.ASM
;
;
DAOT EQU 40H;中斷次數計數單元
SCNT EQU 41H;為送到0832的值
CKCH EQU 42H;存放轉速
CKCN EQU 43H
SETP EQU 44H
TEMP EQU 45H
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164時鐘位)
DAT164 equ 0e102h ; 段控制口(接164數據位)
IN equ 0e103h ; 鍵盤讀入口
LEDBuf equ 39h ; 顯示緩沖
ORG 0000H
STRT: LJMP MAIN
ORG 0003H ;
LJMP PINT0
ORG 000BH ;
LJMP PTF0
ORG 0030H ;
PTF0: MOV TH0,#0D0H
PUSH ACC
PUSH PSW
SETB PSW.3
DJNZ SCNT,PTFJ
MOV SCNT,#64H
MOV A,CKCN
MOV B,#0AH
DIV AB
MOV 39H,B
MOV B,#0AH
DIV AB
MOV 3AH,B
MOV 3BH,A
MOV A,CKCN
CJNE A,SETP,PTFX
SJMP PTFY
PTFX: JC PTFZ
DEC DAOT
SJMP PTFY
PTFZ: CJNE A,#3,$+3
JC PTFR
INC DAOT
INC DAOT
PTFR: INC DAOT
PTFY: MOV CKCN,#0
MOV DPTR,#0a000H
MOV A,DAOT
MOVX @DPTR,A
MOVX @DPTR,A
PTFJ: NOP
POP PSW
POP ACC
RETI
MAIN: mov sp,#60h
mov dptr,#0e100h ;8155初始化
mov a,#03h
movx @dptr,a
MOV R0,#39H
MOV R7,#06H
MLP0: MOV @R0,#10H
INC R0
DJNZ R7,MLP0
LCALL DIR
;調顯示
MOV DAOT,#40H
MOV SCNT,#01H
MOV CKCH,#00H
MOV CKCN,#00H
SETB EA
NOP
SETB EX1
NOP
CLR IT1
NOP
MLP1: call TestKey ; 有鍵入?
jz MLp1 ; 無鍵入, 繼續顯示
call GetKey ; 讀入鍵碼
ANL A,#0FH
CJNE A,#0AH,$+3
JNC MLP1
MOV 3EH,A
LCALL DIR
MLP2:call TestKey ; 有鍵入?
jz MLP2 ; 無鍵入, 繼續顯示
call GetKey ; 讀入鍵碼
ANL A,#0FH
CJNE A,#0AH,$+3
JNC MLP2
MOV 3DH,A
MOV A,3EH
MOV B,#0AH
MUL AB
ADD A,3DH
MOV SETP,A
MOV DPTR,#0f200H
MOV A,DAOT
MOVX @DPTR,A
MOV A,#1
ORL A,TMOD
MOV TMOD,A
MOV TH0,#0D0H
MOV TL0,#00H
SETB TR0
SETB EA
SETB ET0
SETB EX0
SETB IT0
SETB EX1
CLR IT1
NOP
MOV IP,#04H
MLP4: MOV DPTR,#0f200H
MOV A,DAOT
MOVX @DPTR,A
LCALL DIR
LJMP MLP4
PINT0: PUSH ACC
INC CKCN
MOV A,CKCN
JNZ PIPI
INC CKCN
PIPI: POP ACC
RETI
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 輸出線置為0
mov dptr, #IN
movx a, @dptr ; 讀入鍵狀態
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 數字鍵碼定義
db 00h, 01h, 04h, 07h
db 0fh, 02h, 05h, 08h
db 0eh, 03h, 06h, 09h
db 0dh, 0ch, 0bh, 0ah
db 10H,10H,10H,10H,10H,
db 10H,10H,10H,10H,10H
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
DIR: setb 0d3h
mov r0, #LEDBuf
mov r1, #6 ; 共6個八段管
mov r2, #00000001b ; 從左邊開始顯示
Loop:
mov dptr, #OUTBIT
mov a, #00h
movx @dptr, a ; 關所有八段管
mov a, @r0
mov dptr,#LEDmap
movc a,@a+dptr
mov B, #8 ; 送164
DLP:
rlc a
mov r3, a
mov acc.0, c
anl a,#0fdh
mov dptr, #DAT164
movx @dptr, a
mov dptr, #CLK164
orl a,#02h
movx @dptr, a
anl a,#0fDh
movx @dptr, a
mov a, r3
djnz B, DLP
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 顯示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 顯示下一位
rL a
mov r2, a
inc r0
djnz r1, Loop
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a
clr 0d3h ; 關所有八段管
ret
LEDMAP: ; 八段管顯示碼
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
DB 00H
Delay: ; 延時子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -