⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asm0.asm

📁 这是一个软件串口的源代码 单片机为em78p458,已经测试成功
💻 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 + -