📄 wendu.asm
字号:
;;;2051 as keybd and disp, 164, clock etc
;;;;;;*****************************************************************
ORG 0000H; ;
JMP start
ORG 0003H; ;
reti
ORG 000BH ;
AJMP INTTMR0 ;
ORG 0013H
reti ;
ORG 001BH ;
reti ;
ORG 0023H ;
RETI
;**************************************
start:
MOV R1,#78h ;
MOV R0,#02H ;
CLR A ;
CR: INC R0 ;
MOV @R0,A ;
djnz r1,cr
setb p3.5
MAIN: MOV SP,#70H
nop
nop
MS: MOV 31H,#30
nop
nop
mov 40h,#50h
ss: nop
aCALL DISP1
NOP
aCALL DELAY
djnz 40h, ss
MOV TMOD,#51H;;;?01010001
MOV 30H, #20
MOV IE, #82H
MOV TH0,#3cH
MOV TL0,#0b0H
MOV TH1,#00H
MOV TL1,#00H
SETB TR0
;; SETB TR1
S2: NOP
NOP
acall keybd
aCALL KEY1
nop
nop
ACALL DISP
nop
AJMP S2
NOP
DELAY: MOV R7,#0aH; time delay
TM: MOV R6,#0FFH
TM6: DJNZ R6,TM6
DJNZ R7,TM
NOP
NOP
RET
NOP
KEYBD: clr p3.5
mov p1,#0ffh
mov a,#0fh
mov p1,a
MOV A,P1
ANL A,#0FH
XRL A,#0FH
JZ KEYRET
aCALL DELAY
MOV R2,#0EFH
KEYB2: MOV A,R2
MOV P1,A
MOV A,P1
MOV R1,A
ANL A,#0FH
MOV R3,A
CJNE A,#0FH,KEYB3
MOV A,R2
RL A
MOV R2,A
XRL A,#0FEH
JNZ KEYB2
ajmp keyret
KEYB3: MOV A,R2;
anl a,#0f0h
ORL A,R3;
CPL A
MOV 26H,A;
MOV R4,#00H
MOV DPTR,#KEYTAB
KEYB4: CLR A
movc a,@a+dptr
CJNE A,26H,NEQ
AJMP EQQ
NEQ: INC R4
INC DPTR
AJMP KEYB4
EQQ: aCALL DELAY
MOV A,#0FFH ;
MOV P1,A
MOV A, #0FH
MOV P1,A
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,EQQ;
MOV A,R4; A IS KEY
MOV 38H,A
nop
nop
KEYRET: RET
nop
nop
nop
nop
KEYTAB: DB 14h,24h,44h,84h,18h,28h,48h,88h,82h,42h,22h,12h,81h,41h,21h,11h
DB 00H;keytable
NOP;
NOP;
;***********************************************************
; led=> / abcdefgh
led_asc:
db 11111100B;0
db 01100000B;1
db 11011010B;2
db 11110010B;3
db 01100110B;4
db 10110110B;5
db 10111110B;6
db 11100000B;7
db 11111110B;8
db 11110110B;9
DB 11101110B;a=>A
DB 00111110B;B=>B
DB 10011100B;C=>C
DB 01111010B;D=>D
DB 10011110B;E=>E
DB 10001110B;F=>F
DB 01101110B;H=>10H
DB 00011100B;L=>11H
DB 11101100B;N=>12H
db 00101010b;n=>13h
db 11111100b;O=>14h
dB 00111010B;o=>15H
DB 11001110B;P=>16H
DB 11100110B;Q=>17H
DB 00001010B;r=>18H
DB 10110110B;S=>19H
DB 01111100B;U=>1AH
DB 00111000B;u=>1BH
DB 00000000B;BLACK=>1CH
DB 11111111B;8.=>1DH
db 00000010b;-=>1Eh
db 00011110b;t=>1Fh
db 11111101B;0.=>20h
db 01100001B;1.
db 11011011B;2.
db 11110011B;3.
db 01100111B;4.
db 10110111B;5.
db 10111111B;6.
db 11100001B;7.
db 11111111B;8.
db 11110111B;9.=>29h
db 01110110b;y=>2ah ;2001.5.9
db 'li jie by 2001.6.1'
;********************
p1_off:
;mov a,p1
;orl a,#7fh
mov a,#7fh
mov p1,a
ret
sbuf_out:
mov sbuf,a
nop
nop
nop
nop
ret
;**********************************
DISP:
setb p3.5
mov a,#0
acall p1_off
acall sbuf_out
mov dptr,#led_asc
mov r0,#3eh
mov r5,#11011111b; old 01111110b,led0=p1.5
mov r6,#06
led_bit:
mov a,@r0
movc a,@a+dptr
acall sbuf_out
mov a,r5
mov p1,a
;***************************
mov a,#64h; old 020h
ler1: dec a
jnz ler1
;*****************************
mov a,r5
rr a
mov r5,a
call p1_off
dec r0
djnz r6,led_bit
ret
DISP1: MOV 39H,#01H
MOV 3AH,#02H
MOV 3BH,#03H
MOV 3CH,#04H
MOV 3DH,#05H
mov 3eh,#06h
aCALL DISP
RET
INTTMR0:
PUSH PSW; clockint
PUSH ACC
setb rs1
MOV TH0,#3cH
MOV TL0,#0b0H
CLR TF0
DJNZ 30H,RETURN
MOV 30H,#20
MOV B,32H
clr c
mov a,#01h
ADD A,B; second
DA A
MOV 32H,A
CJNE A,#60h,RETURN11
MOV 32H,#00H
MOV A,#01H
ADD A,33H; minute
DA A
MOV 33H,A
CJNE A,#60h,RETURN11
MOV 33H,#00H
MOV A,#01H
ADD A,34H; hour
DA A
MOV 34H,A
CJNE A,#24h,RETURN11
mov 34h,#00h
RETURN11:
ACALL NEWBUF
RETURN: clr rs1
POP ACC
POP PSW
RETI
key1: MOV A,38H
MOV DPTR,#JMPTBL
RL A
JMP @A+DPTR
JMPTBL: AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK0
AJMP TSK1;;;A
AJMP TSK2;; B
AJMP TSK3;;; C
AJMP TSK4;D
AJMP TSK5;E
AJMP TSK6;;;;F
NOP
NOP
NOP
TSK0: mov a,#1ch
mov 39h,a
mov a,#10H
mov 3ah,a
mov a,#0EH
mov 3bh,a
mov a,#11H
mov 3ch,a
mov a,#11H
mov 3dh,a
mov a,#14H
mov 3eh,A
acall disp
ret
NOP
NOP
TSK1: SETB EA
SETB tr0
ret
NOP
NOP
NOP
NOP
NOP
TSK2: clr tr0
ret
NOP
NOP
TSK3:
ACALL NEWBUF
ret
NOP
NOP
NOP
TSK4: CLR TR0
CLR EA
MOV A,#1CH
MOV 3AH,A
MOV 3BH,A
MOV 3CH,A
ACALL DS1820
MOV R4,#0c8H
DDD: ACALL DISP
acall delay
DJNZ R4,DDD
ACALL TEMPER_DISP
ret
NOP
NOP
NOP
TSK5: CLR TR0
CLR EA
ACALL TIMER
ACALL DISP
ret
NOP
NOP
NOP
TSK6: ret
NOP
NOP
NOP
TIMER:
MOV A,38H
MOV 39H,A
MOV 3AH,A
MOV 3BH,A
MOV 3CH,A
MOV 3DH,A
MOV 3EH,A
SETB EA
SETB TR0
RET
NOP
NOP
NOP
NOP
;温度传感器ds1820 的汇编程序
;晶振:12M
DS1820:
TEMPER_L EQU 36H
TEMPER_H EQU 35H
TEMPER_NUM EQU 60H
FLAG1 BIT 00H
DQ BIT P3.3;;;;;;;2051第7脚
a_bit equ 3eh
b_bit equ 3dh
aaa:
LCALL GET_TEMPER
LCALL TEMPER_COV
setb p1.5
NOP
ret
;------------------读出转换后的温度值
GET_TEMPER:
SETB DQ ; 定时入口
BCD:
LCALL INIT_1820
JB FLAG1,S22
clr dq
mov 3dh,#09
mov 3eh,#09
lcall disp
LJMP BCD ; 若DS18B20不存在则返回
ret
S22:
LCALL DELAY2
lcall disp
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
NOP
LCALL DELAY1
LCALL DELAY1
lcall disp
CBA:
LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC:
LCALL DELAY2
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
nop
nop
RET
;-------------------写DS18B20的程序
WRITE_1820:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6;
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23;
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7;
DJNZ R3,$
MOV C,DQ
MOV R3,#23;
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-------------------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV A, 36H ;对整数进行处理
SWAP A
ANL A,#0FH
MOV 36H, A
MOV A,35H
MOV B,#16
MUL AB
ADD A,36H ;化为十进制数
MOV B,#100
DIV AB
MOV R5,B
MOV 3cH,A ;百位放3cH单元中
MOV A,R5
MOV B,#10
DIV AB
MOV 3dH,A ;十位放3dH单元中
MOV 3eH,B ;个位放3eH单元中
RET
;-------------------DS18B20初始化程序
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R1,#6H
TSR1:
mov r0,#107
DJNZ R0,$
DJNZ R1,TSR1 ; 延时
SETB DQ
nop
nop
nop
MOV R0,#25H ;96US-25H
TSR2:
JNB DQ,TSR3
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
mov 39h,#1fh;;;; T
acall disp
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#117 ;200US
TSR6:
DJNZ R0,TSR6 ; 延时
TSR7:
SETB DQ
RET
;------------------延时子程序
DELAY1: MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US: MOV R6,#00H
DJNZ R6,$
RET
DELAY2: MOV R7,#20H
DJNZ R7,$
RET
temper_disp:
mov a,36h
mov b,#10
div ab
mov b_bit,a
mov a_bit,b
mov a,temper_L
clr c
rrc a
MOV R3,A
MOV R1,#0
MOV R2,#0
ACALL CONV1
MOV A,R7
anl a,#0fh
mov a_bit,a
mov a,r7
anl a,#0f0h
swap a
mov b_bit,a
acall disp
ret
INTR0:
reti
;;;; MOV TH0,#7DH
;;;; MOV TL0,#0C9H
DJNZ 20H,RETUNT
CLR TR1
MOV 20H,#0AH
MOV R2,TH1
MOV R3,TL1
MOV R1,#00H
ACALL CONV1
ACALL DISP
MOV TH1,#00H
MOV TL1,#00H
RETUNT:
;;;;;;;SETB TR1
RETI
CONV1: MOV B,#24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定点整数二翻十
CLR A ;;;;;;;;;;;;R1 R2 R3 BINARY
MOV R5,A;;;;;;;;;;;;R5 R6 R7 DECIMAL
MOV R6,A
MOV R7,A
CV1: CLR C
ACALL LR0
MOV A,R7
ADDC A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
DJNZ B,CV1
RET
LR0: XCH A,R3
RLC A
XCH A,R3
XCH A,R2
RLC A
XCH A,R2
XCH A,R1
RLC A
XCH A,R1
RET
NEWBUF:
MOV A,32H
MOV R5,A
ANL A,#0FH
MOV 3eH,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV 3dH,A
MOV A,33H
MOV R5,A
ANL A,#0FH
MOV 3cH,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV 3bH,A
MOV A,34H
MOV R5,A
ANL A,#0FH
MOV 3aH,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV 39H,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -