📄 newcon3.asm
字号:
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164时钟位)
DAT164 equ 0e102h ; 段控制口(接164数据位)
IN equ 0e103h ; 键盘读入
Num equ 70h ; 显示的数据
DelayT equ 75h ;
LEDBuf equ 40h ; 显示缓冲
PD1 EQU 32H ; 模块参数
COLUMN EQU 30H
PAGE1 EQU 31H ; 页地址寄存器
CODE1 EQU 32H ; 字符代码寄存器
COUNT EQU 33H ; 计数器
COM EQU 20H ; 指令寄存器
DAT EQU 21H ; 数据寄存器
CWADD1 EQU 0fa00H ; 写指令代码地址(E1)
CRADD1 EQU 0fa80H ; 读状态字地址(E1)
DWADD1 EQU 0fa40H ; 写显示数据地址(E1)
DRADD1 EQU 0fac0H ; 读显示数据地址(E1)
CWADD2 EQU 0f800H ; 写指令代码地址(E2)
CRADD2 EQU 0f880H ; 读状态字地址(E2)
DWADD2 EQU 0f840H ; 写显示数据地址(E2)
DRADD2 EQU 0f8c0H ; 读显示数据地址(E2)
Hour equ 34h
Minute equ 35h
Second equ 36h
C100us equ 37h
Tick equ 10000
T100us equ 256-50
Pulse equ 0
PulseCNT equ 38h
ToneHigh equ 39h
ToneLow equ 3ah
Speaker equ P3.3
DAOT EQU 3bH ; 中断次数计数单元
SCNT EQU 3cH ; 为送到0832的值
CKCH EQU 3dH ; 存放转速
CKCN EQU 3eH
SETP EQU 3fH
TEMP EQU 50h
; 脉冲宽度下限
ldhmin equ 0cbh
ldlmin equ 0cbh
p0hmin equ 0f3h
p0lmin equ 0f3h
p1hmin equ 0deh
; 脉冲宽度上限
ldhmax equ 0d0h
ldlmax equ 0d0h
p0hmax equ 0f9h
p0lmax equ 0f9h
p1hmax equ 0e3h
; 发送信号时载波信号宽度
send5 equ 192
send1 equ 38
send3 equ 115
status equ 48H
rcvdat equ 49h
snddat equ 4Ah
vldmin equ 4Bh
vldmax equ 4Ch
hasdat equ 4Dh
HasRcv equ 20h.1 ; 接收标志位
RCVBuf equ 52H ; 接收缓冲
ORG 0000H
lJMP START1
ORG 0003H ;
LJMP PINT0
org 000bh
LJMP SMAT0
ORG 0023H
LJMP SMAT1
SMAT0: push PSW
push ACC
mov a,51h
cjne a,#00h,loop0
ljmp T0Int
loop0: cjne a,#01h, loop1
ljmp Timer0Int
loop1: cjne a,#02h,loop2
ljmp ptf0
loop2: cjne a,#03h,loop3
ljmp jishu
loop3: ljmp start1
jishu: CLR TR0 ;定时器0中断处理子程序
MOV TL0,#0d0H
MOV TH0,#3CH
INC 23H
MOV A,23H
CJNE A,#0AH,ZOO1
MOV 23H,#00H
MOV 53H,TH1
MOV 54H,TL1
MOV TL1,#00H
MOV TH1,#00H
ZOO1: SETB TR0
POP ACC
POP PSW
RETI
T0Int:
mov a, C100us+1
jnz Goon
dec C100us
Goon:
dec C100us+1
mov a, C100us
orl a, C100us+1
jnz Exit
mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
inc Second
mov a, Second
cjne a, #60, Exit
mov Second, #0
inc Minute
mov a, Minute
cjne a, #60, Exit
mov Minute, #0
inc Hour
mov a, Hour
cjne a, #24, Exit
mov Hour, #0
Exit:
pop ACC
pop PSW
reti
Timer0Int:
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov c, Pulse
mov Speaker, c
cpl Pulse
dec PulseCNT
pop acc
pop PSW
reti
PTF0: MOV TH0,#0D0H
SETB PSW.3
DJNZ SCNT,PTFJ
MOV SCNT,#64H
MOV A,CKCN
MOV B,#0AH
DIV AB
MOV 45H,B
MOV B,#0AH
DIV AB
MOV 44H,B
MOV 43H,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,#0f200H
MOV A,DAOT
MOVX @DPTR,A
MOVX @DPTR,A
PTFJ: NOP
POP ACC
POP PSW
RETI
PINT0: PUSH ACC
INC CKCN
MOV A,CKCN
JNZ PIPI
INC CKCN
PIPI: POP ACC
RETI
SMAT1: ; 串行口中断程序
JNB TI,S0_R
CLR TI
NOP
SJMP S0_RET
S0_R: ; 接收数据
CLR RI
MOV RCVBUF,SBUF ; 保存数据
SETB HasRcv ; 提示收到数据
NOP
S0_RET:
RETI
START1: MOV SP,#60H
clr 21h
mov dptr,#0f200h
mov a,#00h
movx @dptr,a
MOV DPTR,#0E100H ;8155初始化
MOV A,#03H
MOVX @DPTR,A
START0: JB 21H,ZICON
SJMP START2
ZICON: JMP ZICON1
START2: mov 40H, #10h ; 显示缓冲区初始化,显示P.
mov 41H, #11h
mov 42H, #11h
mov 43H, #11h
mov 44H, #11h
mov 45H, #11h
setb 20H
MLoop0:mov 30H ,#LEDBuf
MLoop:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
jb acc.4,MING ; 功能键、数字键判
mov R0,30H
mov @R0,a
inc 30H
mov r0,30h
cjne r0,#46H,MLoop
ljmp MLoop0
MING: LJMP MING1
CLEAR1: MOV R7,#06H ;清显示缓冲器子程序
MOV R0,#40H
MOV A,#00H
TUNER: MOV @R0,A
INC R0
DJNZ R7,TUNER
RET
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
db 0f3H,00h,0ffh,0b8h,40h,0f6h,38h,48H ,02h
Delay: ; 延时子程序0
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
Delay1: ; 延时子程序1
mov r7, #10h
DelayLoop1:
call ir_receive
djnz r7, DelayLoop1
djnz r6, DelayLoop1
ret
DisplayLED:
setb 0d3h
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
anl a, #1fh ; 显示键码
mov dptr, #LEDMap
movc a, @a+dptr
mov B, #8 ; 送164
DLP:
rlc a
mov r3, a
mov acc.0, c
mov dptr, #DAT164
anl a,#0fdh
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 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
clr 0d3h
ret
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,11H,12H,13H,14H,
db 15H,16H,
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
ajmp Exit1
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 Exit1
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit1:
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
MING1:
CLR C
SUBB A,#10H ;命令键处理程序
MOV DPTR,#JIAN
LMI0: ADD A,0E0H
JMP @A+DPTR
JIAN: SJMP PROG0; EXEC
SJMP PROG1; HERE
SJMP PR0G2; STEP
SJMP PROG3; TRACE
SJMP PROG4; NEXT
SJMP PROG5; LAST
SJMP PROG6; MON
PROG0:
SJMP JIAN3
PROG1:
LJMP START2
PR0G2:
LJMP START2
PROG3:
LJMP START2
PROG4:
SJMP JIAN1
PROG5:
SJMP JIAN2
PROG6:setb 21h
LJMP START0
JIAN1:
ACALL MEM1
jb 20h,guo
inc dptr
guo: ACALL MEM2
clr 20h
AJMP MLoop0
JIAN2:ACALL MEM1
jb 20h,L00EFH
MOV A, DPL
SUBB A, #01H
JC L00DCH
L00D8H:
MOV DPL, A
AJMP L00EFH
L00DCH:
DEC DPH
AJMP L00D8H
L00EFH:ACALL MEM2
CLR 20H
AJMP MLoop0
JIAN3:ACALL MEM1
MOV A,DPH
ANL A,#7FH
MOV DPH,A
PUSH DPL
PUSH DPH
RET
MEM1: MOV R0,#41H
ACALL PINZI
MOV 83H,A
MOV R0,#43H
ACALL PINZI
MOV 82H,A
MOV R0,#45H
ACALL PINZI
RET
PINZI:MOV A,@R0 ;拼字子程序
ANL A,#0FH
MOV R1,A
DEC R0
MOV A,@R0
SWAP A
ANL A,#0F0H
ORL A,R1
RET
MEM2:CLR A
MOVC A,@A+DPTR
MEM12:MOV R0,#45H
ACALL CAIZI
MOV A,82H
ACALL CAIZI
MOV A,83H
CAIZI:MOV R1,A ;拆字子程序
ACALL CAI1
MOV A,R1
SWAP A
CAI1: ANL A,#0FH
MOV @R0,A
DEC R0
RET
a090h: ;“验证式”实验九 P1口输入输出实验
DD1: JB P1.3,DD
CLR P1.2 ;点亮
DD2: CALL DELAY
SJMP DD1
DD: SETB P1.2 ;熄灭
SJMP DD2
a100h: ;“验证式” 实验十 P3.3口输入 P1口输出
MOV A, #0FFH
MOV P1,A
L0812: JB P3.0, L0812 ;判断P3,3为高吗?
MOV R2, #10H
LCALL DELAY
JB P3.0, L0812 ;延时后再判断P3.3为高吗?
L081D: JNB P3.0, L081D ;P3.3为低吗?
MOV R2, #10H
LCALL DELAY
JNB P3.0, L081D ;延时后再判断P3.3为低吗?
INC A ;累加器加1
PUSH ACC
; CPL A
MOV P1, A ;A送P1口
POP ACC
AJMP L0812
A110H:
mov Num, #0 ;"验证式
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -