📄 communication.asm
字号:
;---------------------------------------------------------
D8255 EQU 8503H ;8255 状态/命令口地址
D8255A EQU 8500H ;8255 PA 口地址
D8255B EQU 8501H ;8255 PB 口地址
D8255C EQU 8502H ;8255 PC 口地址
;---------------------------------------------------------
Z8279 EQU 0FF82H ;8279 状态/命令口地址
D8279 EQU 0FF80H ;8279 数据口地址
LEDMOD EQU 10H ;右端输入,八位字符显示;
LEDFEQ EQU 100H ;扫描速率分频系数为18H=24
LEDCLS EQU 0D1H ;清除
LEDWRO EQU 90H ;设定的将要写入的"显示RAM地址"
;地址从0000开始,且自动增量AI=1
A_DPORT EQU 8600H ;0809通道0地址
SECOND EQU 40H
MINUTE EQU 41H
HOUR EQU 42H
N1 EQU 43H
N2 EQU 44H
N3 EQU 45H
N4 EQU 46H
N5 EQU 47H
N6 EQU 48H
N7 EQU 49H
N8 EQU 50H
Org 0000h
ljmp 0100h
ORG 000BH
LJMP T0INT
ORG 0013H
LJMP INT_1
org 0100h
start1: LCALL DELAY ;延时
MOV DPTR,#D8255
MOV A,#82H ;置8255状态
MOVX @DPTR,A ;方式0,PA,PC口输出,PB口输入
mov tmod,#21h ;选定T1为模式2(自动重装)
mov tl1,#0E8h ;设定初值,波特率为1200HZ
mov th1,#0E8h ;同上
mov pcon,#00h ;PCON的SMOD=0
setb tr1 ;启动T1定时器
clr ri ;清接收标志
MOV SECOND,#00H
MOV MINUTE,#59H
MOV HOUR,#00H
MOV TH0,#4BH
MOV TL0,0FCH
MOV IE,#82H
SETB TR0
mov scon,#50h ;设定串行口为方式1(允许接收)
MOV R1,#0
MOV R2,#0
RXD1: JNB RI,NEXT
CLR RI
mov A,sbuf ;数据送累加器A
clr c
subb A,#0
jz loop2 ;若代码为0,则由开关显示a
MOV R5,#03H
X: Jb ri,AbC ;判断是否接收到数据?
LCALL DELAY
DJNZ R5,X
LJMP RXD1
AbC: clr ri ;接收到一个数据后必须清接收标志,否则不能在接受数据
mov B,sbuf ;数据送B
MOV 30H,B
lcall btod ;否则由数码管显示
MOV A,33H
MOV DPTR,#LEDSEG ;显示用字符表首址送DPTR 准备查表
MOVC A,@A+DPTR ;查表
ORL A,#80H
MOV 25H,A ;查出的字符送内部RAM的20H单元
MOV A,32H ;BCD码送A
MOVC A,@A+DPTR ;查表
MOV 26H,A
MOV A,31H
MOVC A,@A+DPTR
MOV 27H,A ;送内部RAM的22H单元
LCALL INIT8279 ;调子程序将数据送8279显示
SJMP RXD1
Loop2: jnb ri,LOOP2 ;判断是否接收到数据?
clr ri ;接收到一个数据后必须清接收标志,否则不能在接受数据
mov A,sbuf ;数据送B
MOV DPTR,#D8255C
MOVX @DPTR,A
SJMP RXD1 ;返回继续
nexT: ;没收到数据转next
mov p1,#0ffh ;读P口之前要把它置高
MOV A,P1
CLR C
SUBB A,r1
JZ A_D ;若开关输入没变看ad
MOV R1,P1
mov p1,#0ffh
MOV A,#0 ;发代码
MOV SBUF,A
loop6: jnb ti,loop6 ;判断数据是否发送完毕?
clr ti ;发送完一帧后清标志
LCALL DELAY
mov a,R1 ;发P1口输入数据
mov sbuf,a ;数据送SBUF发送
loop4: jnb ti,loop4 ;判断数据是否发送完毕?
clr ti ;发送完一帧后清标志
SJMP RXD1 ;返回最开始
A_D:
;MOV SP,#60H
MOV R7,#0FFH ;初始化,读数标志
SETB IT1 ;INT1为边沿触发
SETB EA ;开中断
SETB EX1 ;INT1允许中断
MOV DPTR,#A_DPORT
MOVX @DPTR,A ;启动 A_D
CJNE R7,#00H,$ ;等待 A_D 转换结束
MOV B,A
CLR C
SUBB A,r2
JZ LOOP9 ;若ad输入没变返回最开始
MOV R2,B
mov p1,#0ffh
MOV A,#1 ;发代码
MOV SBUF,A
loop5: jnb ti,loop5 ;判断数据是否发送完毕?
clr ti ;发送完一帧后清标志
LCALL DELAY
mov a,R2 ;发P1口输入数据
mov sbuf,a ;数据送SBUF发送
loop7: jnb ti,loop7 ;判断数据是否发送完毕?
clr ti ;发送完一帧后清标志
LOOP9: LJMP RXD1 ;返回最开始
INT_1:
MOVX A,@DPTR ;读 A_D 数据
MOV R7,#00H ;置读数标志
RETI
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
INIT8279: ;8279子程序,显示RAM20H~27H中的数据
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
PUSH 02H
PUSH 01H
LCALL DELAY ;延时
MOV R1,#20H
MOV R2,#08H
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式00010000B,8位右入
MOVX @DPTR,A ;编码扫描键盘,双键锁定
MOV A,#LEDFEQ ;置键盘扫描速率,分频系数N=24
MOVX @DPTR,A
;MOV A,#LEDCLS ;清除显示RAM ,11010001B
;MOVX @DPTR,A ;将8279的显示RAM全部清零
LCALL DELAY ;延时,8279的清除需要160μS
MOV DPTR,#Z8279
MOV A,#LEDWRO ; 设定显示RAM的起始地址
MOVX @DPTR,A ; 向8279 发"写显示RAM"命令
MOV DPTR,#D8279 ; 指向8279的数据口
LOOP33: MOV A,@R1 ; R1指向单片机内部RAM的20H单元
MOVX @DPTR,A
INC R1
DJNZ R2,LOOP33
POP 01H
POP 02H
POP ACC ;恢复现场
POP DPL
POP DPH
RET
btod: push psw
push acc
MOV A,30H
mov b,#100
div ab
anl a,#0fh
mov 31h,a ;百位存31h单元
mov a,b
mov b,#10
div ab
anl a,#0fh
mov 32h,a ;十位存32h单元
mov a,b
anl a,#0fh
mov 33h,a ;个位存33h单元
pop acc
pop psw
ret
DELAY: ;延时子程序
PUSH 00H ;保存现场
PUSH 01H
MOV R0,#00H
DELAY1: MOV R1,#00H
DJNZ R1,$
DJNZ R0,DELAY1
POP 01H ;恢复现场
POP 00H
RET
T0INT:
PUSH DPL
PUSH DPH
PUSH ACC
MOV TH0,#4BH
MOV TL0,0FCH
DJNZ N5,LOOP49
MOV A,SECOND
ADD A,#01H
DA A
MOV N1,A
CJNE A,#60H,GO1
MOV N1,#00H
MOV A,MINUTE
ADD A,#01H
DA A
MOV N2,A
CJNE A,#60H,GO2
MOV N2,#00H
MOV A,HOUR
ADD A,#01H
MOV HOUR,A
GO2:
MOV MINUTE,N2
GO1:
MOV SECOND,N1
MOV N5,#01H;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,SECOND
LCALL CAIFEN
LCALL OUT1
MOV A,MINUTE
LCALL CAIFEN
LCALL OUT2
MOV A,HOUR
MOV N7,A
MOV A,#0FH
ANL A,N7
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
ORL A,#80H
MOV 24H,A
LCALL INIT8279
LOOP49:
POP ACC
POP DPH
POP DPL
RETI
CAIFEN:
PUSH AC
MOV N7,A
MOV N8,A
MOV A,#0FH
ANL A,N7
MOV N7,A
MOV A,#0F0H
ANL A,N8
SWAP A
MOV N8,A
POP ACC
RET
OUT1:
MOV A,N7
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV 20H,A
MOV A,N8
MOVC A,@A+DPTR
MOV 21H,A
RET
OUT2:
MOV A,N7
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
ORL A,#80H
MOV 22H,A
MOV A,N8
MOVC A,@A+DPTR
MOV 23H,A
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -