📄 csh.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 + -