📄 asm0.asm
字号:
;===============================================================
; EM78156接收程序
;===============================================================
;定义通用寄存器
PC == 02H ;声明寄存器PC的地址为02H
PORT5==0X5
PORT6==06H ;声明寄存器P6的地址为06H
P51==1
COUNT==0X12;数据位数计数器
BYTE==0X13;收发缓冲器
BITNUM==8 ;数据位为8位
;定义控制寄存器
IOC50 == 0X5;PORT5控制寄存器
IOC60 == 0X6;PORT6控制寄存器
;C_INT == 0XF;中断控制寄存器
;延时循环次数寄存器地址
N == 1AH
ORG 000H ;设置复位矢量
JMP MAIN ;跳转到主程序
;============================接收数据子程序========================
RECV:
MOV A ,@BITNUM ;数据贞位数送A
MOV COUNT , A ;传送的数据为每贞8位 ,送位数计数器
TEST:
JBC PORT5 ,P51 ;如果监测到起始位(低电平),则跳一步
JMP TEST ; 如果没有测到,循环检测
CALL DELAYSHORT198 ;延时
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ; 用于调整时序
START:
JBC PORT5 , P51 ;如果检测到低电平,则跳一步
BS BYTE , 7 ;否则,认为收到的为逻辑1
JBS PORT5 , P51 ;若检测到高电平,则跳一步
BC BYTE , 7 ;认定收到的逻辑0
DJZ COUNT ;一个字节接收完毕否,是则COUNT-1否则为0则跳过下一条指令
JMP L1 ;否,则继续接收下一位
CALL DELAYSHORT198 ;是,调用延时子程序
NOP
NOP ;用于调整时序
RET ;返回
L1:
RRC BYTE ;接受缓冲器右移一位
CALL DELAYSHORT198 ;调用延时子程序
JMP START ;检测下一位
;========================延时子函数=========================
;延时198条指令周期
DELAYSHORT198: MOV A,@38 ;(38-1)*5+11=196加上call本身的2条指令时间总共为198
MOV N, A
NOP
NOP
NOP
LOOP: NOP
NOP
DJZ N
JMP LOOP
RET
;=========================命令表子程序==============================
COMMAND: ADD PC,A ;把A叠加到PC弟8位形成跳转
JMP COMM0
JMP COMM1
JMP COMM2
JMP COMM3
JMP COMM4
JMP COMM5
JMP COMM6
JMP COMM7 ;调用各个不同的命令
;==============================命令子程序集==========================
COMM0:MOV A,@00H
MOV PORT6,A
RET ;将P60置为高电平
COMM1:MOV A,@01H
MOV PORT6,A
RET ;将P61置为高电平
COMM2:MOV A,@02H
MOV PORT6,A
RET ;将P62置为高电平
COMM3:MOV A,@03H
MOV PORT6,A
RET ;将P63置为高电平
COMM4:MOV A,@04H
MOV PORT6,A
RET ;将P64置为高电平
COMM5:MOV A,@05H
MOV PORT6,A
RET ;将P65置为高电平
COMM6:MOV A,@06H
MOV PORT6,A
RET ;将P66置为高电平
COMM7:MOV A,@07H
MOV PORT6,A
RET ;将P67置为高电平
;============================主函数===================================
;====================================================================
;ORG 003H ;设置主程序起始地址
MAIN:
DISI ;关闭所有中断
MOV A, @00H ;将P6的控制字写入A
MOV PORT6,A ;先将PORT6各个引脚的初始输出全置为低电平
MOV A, @02H ;定义P5口的方向控制数据送A
IOW IOC50 ;设定P5口的P51脚为输入用以接收信号,其余全为输出
MOV A, @00H ;定义P6口的方向控制数据送A
IOW IOC60 ;设定P6口各脚全为输出
LOOP1:
CLR BYTE ;清除收发缓冲器
CALL RECV ;调用接收子程序段
MOV A, @00H ;
MOV PORT6,A ;将PORT6各个引脚的初始输出全置为低电平
MOV A ,BYTE ;将接收到的数据送A
AND A ,@0FH ;屏蔽掉高4位后作为查表地址偏移量
CALL COMMAND ;调用命令表子程序
JMP LOOP1
STOP: JMP STOP ;停机
END ;通知汇编器源程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -