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

📄 csh.txt

📁 汇编程序的一些非常实用的初始化程序
💻 TXT
字号:
;------------------------------------------------------
;-----------      伪指令段      ------------------------
;    
;-----------------位标志的定义区-------------------------
BIT_0  EQU  00H      ;位标志0的注释,可以更换成任何名称,例如rec_flag这样的字样
                             ;位128个bit的可位寻址的标志位一般从00开始,8个标志位一般足够使用了
                             ;当然还可以根据需要增加
BIT_1   EQU  01H        ;位标志1的注释
BIT_2   EQU  02H      ;位标志2的注释
BIT_3   EQU  03H        ;位标志3的注释
BIT_4   EQU  04H        ;位标志4的注释   
BIT_5   EQU  05H        ;位标志5的注释
BIT_6   EQU  06H        ;位标志6的注释
BIT_7   EQU  07H        ;位标志7的注释
;-----------------跑马灯定义-------------------------
HORSE_led0     EQU     90H
HORSE_led1     EQU     91H
HORSE_led2     EQU     92H
HORSE_led3     EQU     93H
HORSE_led4     EQU     94H
HORSE_led5     EQU     95H
HORSE_led6     EQU     96H
HORSE_led7     EQU     97H
;-----------------位标志定义结束      -------------------
;-----------------单字节数据的定义区-------------------
;------------------------------------------------------
;串行数据接收缓冲区(内部地址30H--3fH)                               
;------------------------------------------------------
RxBuf_base equ 30H
RxBuf0   EQU   RxBuf_base+00H           ;接收缓冲区0
                                               ;内部RAM的字节的定义一般从30h开始
                                             ;接收缓冲区当然还可以根据需要增加
RxBuf1   EQU   RxBuf_base+01H           ;接收缓冲区1
RxBuf2   EQU   RxBuf_base+02H           ;接收缓冲区2
RxBuf3   EQU   RxBuf_base+03H           ;接收缓冲区3
RxBuf4   EQU   RxBuf_base+04H           ;接收缓冲区4
RxBuf5   EQU   RxBuf_base+05H           ;接收缓冲区5
RxBuf6   EQU   RxBuf_base+06H           ;接收缓冲区6
RxBuf7   EQU   RxBuf_base+07H           ;接收缓冲区7
RxBuf8   EQU   RxBuf_base+08H           ;接收缓冲区8
RxBuf9   EQU   RxBuf_base+09H           ;接收缓冲区9
RxBuf10  EQU   RxBuf_base+0aH           ;接收缓冲区10
RxBuf11  EQU   RxBuf_base+0BH           ;接收缓冲区11
RxBuf12  EQU   RxBuf_base+0CH           ;接收缓冲区12
RxBuf13  EQU   RxBuf_base+0DH           ;接收缓冲区13
RxBuf14  EQU   RxBuf_base+0EH           ;接收缓冲区14
RxBuf15  EQU   RxBuf_base+0FH           ;接收缓冲区15
;------------------------------------------------------
;串行数据发送缓冲区(内部地址40H--4fH)                               
;------------------------------------------------------
TxBuf_base equ 40H
TxBuf0   EQU   TxBuf_base+00H           ;发送缓冲区0
                                             ;
                                            ;发送缓冲区当然还可以根据需要增加
TxBuf1   EQU   TxBuf_base+01H           ;发送缓冲区1
TxBuf2   EQU   TxBuf_base+02H           ;发送缓冲区2
TxBuf3   EQU   TxBuf_base+03H           ;发送缓冲区3
TxBuf4   EQU   TxBuf_base+04H           ;发送缓冲区4
TxBuf5   EQU   TxBuf_base+05H           ;发送缓冲区5
TxBuf6   EQU   TxBuf_base+06H           ;发送缓冲区6
TxBuf7   EQU   TxBuf_base+07H           ;发送缓冲区7
TxBuf8   EQU   TxBuf_base+08H           ;发送缓冲区8
TxBuf9   EQU   TxBuf_base+09H           ;发送缓冲区9
TxBuf10  EQU   TxBuf_base+0aH           ;发送缓冲区10
TxBuf11  EQU   TxBuf_base+0BH           ;发送缓冲区11
TxBuf12  EQU   TxBuf_base+0CH           ;发送缓冲区12
TxBuf13  EQU   TxBuf_base+0DH           ;发送缓冲区13
TxBuf14  EQU   TxBuf_base+0EH           ;发送缓冲区14
TxBuf15  EQU   TxBuf_base+0FH           ;发送缓冲区15
;-----------------单字节数据定义结束---------------------
;------------- 主程序入口   ---------------------------------
             ORG 0000H;复位操作后的程序入口
             sjmp main
;-------------中断程序入口---------------------------------
ORG  0003H   ; 外部中断0服务程序入口
                                ;0003H外部中断0服务程序入口地址,下同
ljmp  int0_isr  ;使用ljmp是因为不知道到底离中断服务子程序有多远
                               ;也可以使用sjmp,如果编译通过的话
ORG  000BH    ;定时器0中断服务程序入口
   ljmp  t0_isr
ORG  0013H    ;外部中断1服务程序入口
ljmp  int1_isr

ORG  001BH    ;定时器1中断服务程序入口
ljmp  t1_isr
ORG  0023H    ;串行中断服务程序入口
ljmp  comm_isr
ORG  002BH    ;定时器2中断服务程序入口
ljmp  t2_isr
;       reti              ;如果该中断不用,也可以直接返回,但是需要在主程序初始化的时候禁止该中断中断
;-------------程序开始---------------------------------
org  0030H      ;从30h开始是为了避开以上这些中断
     ;当然程序可以从之后开始主程序,例如100h
     ;从这个地址开始主要是为了HEX文件的好阅读
     ;阅读HEX文件,使用ultraedit的最新中文版本
main:   
;-------------堆栈初始化------------------------------
MOV    SP,#60H    ;设置SP,也可以设的高一些,如果是52以上的mcu的话
;-------------内存和I/O数据初始化----------------
LCALL   RAMIO_INIT
;-------------定时器0初始化-------------------------
LCALL   T0_INIT
;-------------定时器1初始化-------------------------
LCALL   T1_INIT
;-------------定时器2初始化(52以上有)----------
LCALL   T2_INIT
;-------------串口初始化------------------------------
LCALL  UART_INIT ;串口初始化 
;-------------外部中断0初始化-------------------------

LCALL   int0_INIT
;-------------外部中断1初始化-------------------------
LCALL   int1_INIT
;-------------中断优先级设置 -------------------------
        SETB    IP.4  ;设置中断优先级,串口中断为最高
        CLR     IP.1  ;设置定时器0优先级,低于串口中断
SETB    EA  ;启动全部中断
;-------------允许全部中断           -------------------------
SETB    EA
;-------------主流程------------------------------------
loop:        
lcall  comm           ;通信子程序;也可以使用acall,如果能编译通过的话 
lcall  key              ;按键子程序       
lcall  dislpay          ;显示子程序
lcall  watchdog     ;喂狗子程序,在主流程中喂狗一次
sjmp  loop           ;返回到程序主流程,程序大循环              
;-------------comm;通信子程序        -------------
comm:
...
        ret
;-------------发数据通信子程序        -------------
UART_SEND:
        CLR    TI
        MOV   A,@R0
        MOV    SBUF,A
        JNB   TI,$
        CLR  TI
        INC    R0
        DJNZ   R7,UART_SEND
        RET

;-------------key;按键子程序           -------------
key:
...
     ret
;-------------display;显示子程序       -------------
display:
...
     ret
;-------------watchdog;喂狗子程序  -------------
watchdog:
...
  ret
;-------------以下是系列初始化子程序----------------

;-------------内存和I/O数据初始化子程序----------------

RAMIO_INIT:

        CLR     RS0  ;设置寄存器区基本参数
        CLR     RS1
        mov    R0,#30H;接收数据缓冲区起始地址
        mov    R1,#16;接收数据缓冲区长度
        mov    R2,#40H;发送数据缓冲区起始地址
        mov    R3,#16;接收数据缓冲区长度
        setb   BIT_0;位标志0置位
        setb   BIT_1;位标志1置位
        setb   BIT_2;位标志2置位
        setb   BIT_3;位标志3置位
        setb   BIT_4;位标志4置位
        setb   BIT_5;位标志5置位
        setb   BIT_6;位标志6置位
        setb   BIT_7;位标志7置位
        ret

;-------------定时器0初始化子程序-------------------------

T0_INIT:
        MOV    TMOD,A  ;T0工作在方式1
        MOV   TH0,#0FCH     ;定时周期1MS
        MOV    TL0,#066H
        SETB   ET0
        SETB    TR0  ;启动定时器0
        SETB    ET0  ;允许定时器t0中断
        RET

;-------------定时器1初始化子程序-------------------------

T1_INIT:
ret

;-------------定时器2初始化子程序(52以上有)----------
T2_INIT:
ret

;-------------串口初始化子程序------------------------------

UART_INIT:
        
        MOV     TMOD,#21H ;设置定时器1和串行接口参数9600波特率,时钟11.0592MHz
        MOV     TL1,#0FDH ;定时器1参数的设置
        MOV     TH1,#0FDH
        SETB    TR1  ;启动定时器1中断
        MOV     SCON,#50H ;启动串口控制寄存器
        SETB  ES  ;启动串口中断
        RET

;-------------外部中断0初始化子程序-------------------------
int0_INIT:
        CLR IT0  ;选择外部中断0为低电平触发
        SETB EX0  ;启动外部中断0
        ret
;-------------外部中断1初始化子程序-------------------------
int1_INIT:
        CLR IT1  ;选择外部中断1为低电平触发
        SETB EX1  ;启动外部中断1
        ret

;-------------定时器中断0服务子程序-------------
T0_isr:
        PUSH    DPH
        PUSH    DPL
        PUSH    PSW             ; PSW、ACC入栈
        PUSH    ACC
        MOV     TH0,#0FCH    ;重新设置定时周期1MS
        MOV     TL0,#066H
; CPL P1.0  ;对P1.0取反,设置定时器中断到的标志,在示波器上可以看到方波
        SETB    ET0  ;允许定时器0中断
        SETB    TR0  ;启动定时器0
T0_isr_QUIT:
        POP    ACC
        POP    PSW
        POP   DPL
        POP    DPH
        RETI   ;中断服务子程序返回,RETI是中断子程序返回的命令代码
;-------------定时器中断1服务子程序-------------
t1_isr:
reti 
;-------------定时器中断2服务子程序-------------
t2_isr:
reti 

;-------------串口中断服务子程序    -------------
com_isr:
        PUSH    DPH
        PUSH    DPL
        PUSH    PSW             ; PSW、ACC入栈
        PUSH    ACC
CLR     ES  ;禁止串行中断
JBC     RI,RECINT ;判断接收标志为有接收数据吗?有则将接收标志置0,准备接收下一条数据,跳转到接收程序
AJMP    com_quit
RECINT: MOV  A,SBUF  ;把串口的数据送到A
        MOV     @R0,A  ;再把A送到串口接收缓冲区
        CLR     RI
        INC     R0
com_quit:
        POP    ACC
        POP    PSW
        POP   DPL
        POP    DPH
SETB ES  ;允许串口中断
RETI
;-------------外部中断0  -------------
INT0_isr:
        PUSH    DPH
        PUSH    DPL
        PUSH    PSW       ;  PSW,ACC入栈
        PUSH  ACC
...
INT0_isr_QUIT
        POP   ACC
        POP    PSW
        POP   DPL
        POP    DPH 
        RETI
;-------------外部中断1  -------------
INT1_isr:
        PUSH    DPH
        PUSH    DPL
        PUSH   PSW        ;  PSW,ACC入栈
        PUSH  ACC
...
INT1_isr_QUIT:
        POP   ACC
        POP    PSW
        POP    DPL
        POP    DPH 
        RETI
        end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -