bokee.net

电子/电气工程师博客

正文 更多文章

单片机汇编语言程序的组织方法

        单片机汇编语言程序的组织方法

               王佰营  徐丽红

           wbymcs51.blog.bokee.net

  当汇编语言程序达到一定规模时,编辑程序和维护程序的难度急剧上升,我们
在编一个变频器程序时,程序行达到近八千多行,修改一次非常麻烦,为此,我
们就想到用C语言的方式组织汇编语言。幸好KEIL C51在汇编环境下支持宏处理
操作,经过摸索找到了管理汇编语言文件的方法,使用效很好。通过下面实例展
示这种方法:
一、主程序文件my_main.asm
;****************************************************
;  THIS IS MAIN PROGRAM
;=============================================

$include(W77E58.INC)
$include(VARIABLE_DEFINE.INC)

//在其他文件中需要调用该文件中的子程序
public delay

//在该文件需要调用其他文件中的子程序
extrn code( count_messadr)
;===========================================
;文件包含区;

 $include(CPU_Init.ASM)               ; CPU_INIT_DRIVE
 $include(HZ_TABLE.ASM)            ; HZ_TABLE_DRIVE
 $include(SD_2303_DRIVE.ASM) ; SD_2303_DRIVE

      -------------------------------
 $include(x5045_DRIVE.ASM)       ; x5045_DRIVE
 $include(ON_OFF_SEND.ASM)   ; ON_OFF_SEND
 $include(LCD_DRIVE.ASM)          ; LCD_DRIVE
       ------------------------------
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
;  VARIABLE_DEFINE  ;变量定义区
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
       -------------------------------

;※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
;中断向量区
  ORG  0000h
  sjmp  main        ;系统重置
  ORG  0003h       ;外部中断0
  sjmp  $
  ------------------------
;※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
;主程序区
main:
                ---------------------------------
                lcall       ini_x25045 ;初始化x25045
                -----------------------------------
;※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

;◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
;◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
  ;主程序主循环区
loop:  setb  RES
  lcall  Int_1S_CTS
  lcall  get_import_data
  lcall  OnOff_send
  ----------------------------
  lcall  key_analy
  lcall  manage_display
  lcall  manage_clk
  lcall  Manage_LCD
  lcall  rst_dog
  lcall  display
main_ret: sjmp  loop
  TRAP

;◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
;◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
;※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

;子程序区1

;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  LCD_DRIVE  ;液晶驱动程序
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■

;子程序区2
    ------------------------------------
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  HZ_TABLE_DRIVE  ;汉字表格区
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  CPU_INIT_DRIVE  ;CPU初始化区
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
   --------------------------------------
i0_endi_ti: reti
;==========================================
;子程序区3

;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  SD_2303_DRIVE  ;时钟IC驱动程序
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■

;子程序区4

;■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  x5045_DRIVE  ;x5045驱动程序
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■

;子程序区5

;■■■■■■■■■■■■■■■■■■■■■■■■■■■■  

   ON_OFF_SEND  ;开关机发送程序   

;■■■■■■■■■■■■■■■■■■■■■■■■■■■■  

 ;============================================
;  function:   delay  nms time ;n ms延时程序
;  input:      r7
;  output:  -----------------------
;               usage:      r5,r7,r6
;=============================================
delay:          ;n ms延时程序;
                 mov  b,  r7
                 mov  r5,  #03h
dy_lp:      mov  r7,  b
                 lcall  delay1
                djnz  r5,  dy_lp
                ret
  TRAP;       

;▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
  end;
二、被调用的文件

  1、CPU_Init.ASM文件

  CPU_INIT_DRIVE  MACRO
  ;===========================================
  ; function:Init_CTS 定时器/计数器,中断和串行通讯初始化子程序
  ;===========================================
   THS0  equ  0b8h;0c6h
   TLS0  equ  00h;0dh
   -------------------------------------
    TRAP_RET
     ENDM

  2、HZ_TABLE.ASM文件
   HZ_TABLE_DRIVE  MACRO
  ;以下为字库表:
  ;ASCII码字库表区
  ASCII_addr:
   DB 000H,007H,008H,010H,010H,010H,008H,007H;
   DB 000H,0F0H,008H,004H,004H,004H,008H,0F0H; "0",
   --------------------------------------
   ; 汉字字库表区
  CHI_addr:
   DB 002H,082H,073H,020H,000H,001H,002H,07DH;
   DB 041H,041H,041H,07DH,003H,002H,002H,000H;
   DB 000H,000H,0FEH,004H,009H,001H,002H,0C2H;
   DB 034H,008H,008H,034H,0C2H,003H,002H,000H; "设",
   --------------------------------------
   TRAP_RET
    ENDM
  3、SD_2303_DRIVE.ASM文件
   SD_2303_DRIVE MACRO

  ;===========================================
  ;  function: start_sd ;时钟启动
  ;===========================================
  start_sd: ;时钟启动
  clr  bsda
  N_NOP
   ----------------------------------------
   TRAP_RET
   ENDM 
  4、x5045_DRIVE.ASM文件
   x5045_DRIVE  MACRO
   ;==========================================
   ;   function:  write_byte   ;向X5045写一个字节数据
   ;   input:    r1-----向X5045写一个字节数据的地址
   ;             r0-----从RAM需要写数据的地址
   ;             bA8----X5045上下部分
   ;   output:    -------------
   ;   usage:     a,c,r0,r1,r7
   ;===========================================
   write_byte: ;向X5045写一个字节数据
    ---------------------------------------
   TRAP_RET
   ENDM
  5、ON_OFF_SEND.ASM文件
   ON_OFF_SEND MACRO
   ;开关机发送区
    ---------------------------------------
    M_END:  TRAP
    TRAP_RET
    ENDM
  6、LCD_DRIVE.ASM文件
    LCD_DRIVE   ACRO
    Show_ASC_CHI: ;实现汉字和ASCII的显示;
     push       psw
     mov        psw, #GROUP3 
     ---------------------------------------
    TRAP_RET
    ENDM

   7、RS485.ASM
     ORG   5000h

     $include(W77E58.INC)
     $include(VARIABLE_DEFINE.INC)

     //在其他文件中需要调用该文件中的子程序   
     public count_messadr

     //在该文件需要调用其他文件中的子程序
     extrn  code(delay)
     ;===========================================
     ; fuction:count_messadr;;计算设置通讯参数保存于x5045的地址
     ; input: in_code
     ; output: a
     ; usage: a
     ;===========================================
     count_messadr:;计算设置通讯参数保存于x5045的地址
        setb  BA8
        mov  a, in_code
        cjne  a, #F_58_CODE, cmr_59
        mov  a, #01h
        ret
cmr_59: cjne  a, #F_59_CODE, cmr_60
        mov  a, #02h
        ret
cmr_60: cjne  a, #F_60_CODE, cmr_ret
        mov  a,   #03h
cmr_ret:TRAP_RET
        END

    关键词:单片机 MCS51 汇编语言 include public extrn code 宏

分享到:

上一篇:使用三相移相触发TC787IC应注意

下一篇:PCB设计的基本原则

评论 (0条) 发表评论

抢沙发,第一个发表评论
验证码