📄 tt.asm
字号:
;=====================================T0中断处理子程序===============================
TIME0: CLR EA
CLR TR0 ;先关闭定时器
PUSH A
PUSH B
PUSH PSW
MOV TH0, #0E2H ;定时15ms
MOV TL0, #0B4H
LCALL KEY
LCALL DISP
POP PSW
POP B
POP A
SETB TR0 ;在启动定时器
SETB EA
RETI
;=====================================串口中断处理子程序==============================
INT_SC: CLR EA
PUSH A
PUSH PSW
CLR RI
MOV A, SBUF
CLR C
CJNE A, #01, SC1
SC1: JC SC3
CJNE A, #99, SC2
SC2: JNC SC3
MOV SJJG, A
MOV SUBADR, #00H
MOV NUMBYT, #01
LCALL WRNBYT ;降SJJG写入AT24C02的00H地址
SJMP SCOUT
SC3: CJNE A, #152, SC4
MOV ZS2, #01 ;两张
MOV A, #152
LCALL FS_SC ;如果修改张数则必须下一轮才能生效
LJMP SCOUT
SC4: CJNE A, #153, SC5
MOV ZS2, #02 ;三张
MOV A, #153
LCALL FS_SC ;如果修改张数则必须下一轮才能生效
LJMP SCOUT
SC5: CJNE A, #255, SC6 ;收到255表示要向PC发送当前参数
MOV A, #151
ADD A, ZS ;向PC发送广告总张数
LCALL FS_SC
LCALL DELAY0
LCALL DELAY0
LCALL DELAY0
LCALL DELAY0
MOV A, SJJG ;向PC发送时间间隔
LCALL FS_SC
LCALL DELAY0
LCALL DELAY0
LCALL DELAY0
LCALL DELAY0
MOV A, #100
ADD A, JS ;向PC发送当前显示的页面
LCALL FS_SC
SJMP SCOUT
SC6: CJNE A, #200, SC7
SETB GD ;暂停滚动
SJMP SCOUT
SC7: CJNE A, #201, SC8
CLR GD ;允许滚动
SJMP SCOUT
SC8: CJNE A, #202, SCOUT ;复位命令
SETB RS
SJMP SCOUT
SCOUT: POP PSW
POP A
SETB EA
RETI
;============================================================================================
;///表数字0~9
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;######################################以下是对AT2042读写的子程序#######################
;===================================写入n个字节子程序===================================
WRNBYT:LCALL START
MOV A, #SLAW
LCALL WRBYTE ;写入AT2042从地址,#SLAW与A2,A1,A0引脚接线有关
LCALL CACK
JB F0, WRNBYT ;F0=0则应答信号表示写入成功,F0=1则非应答信号,则写入失败,返回重新写入
MOV A, SUBADR
LCALL WRBYTE ;指定AT2042内256字节空间中要从哪里写的起始地址
LCALL CACK
JB F0, WRNBYT
MOV R1, #MTD ;指定要写入的字节存放的空间
WRDA: MOV A, @R1
LCALL WRBYTE ;将第一个空间存储的字节(第一个字节)通过A写入AT2042
LCALL CACK
JB F0, WRNBYT
INC R1 ;要写入的字节存放的空间地址加1
DJNZ NUMBYT, WRDA
LCALL STOP
RET
;===================================读取n个字节子程序===================================
RDNBYT:LCALL START
MOV A, #SLAW
LCALL WRBYTE ;指定AT2042的从地址和写命令,因为以下要写入从AT2042读出数据的起始地址
LCALL CACK
JB F0, RDNBYT
MOV A, SUBADR
LCALL WRBYTE
LCALL CACK
JB F0, RDNBYT
LCALL START ;在重新开始,以下要读读出数据
MOV A, #SLAR ;读命令
LCALL WRBYTE ;指定AT2042的从地址和读命令
LCALL CACK
JB F0, RDNBYT
RDN: MOV R1, #MRD ;R1存要将读出字节存放在哪个空间的起始地址MRD为起始地址
RDN1: LCALL RDBYTE
MOV A, R2 ;RDBYTE里读出1字节后是存放在R2里的,所以要将读出的1字节给A即将将R2给A
MOV @R1, A ;存入存放读出字节的空间
INC R1 ;空间地址+1
DJNZ NUMBYT, ASK ;知道要读出的字节数全部读完
LCALL NACK ;读完后单片机发送非应答信号表示读数据完毕
LCALL STOP ;与AT2042断开连接
RET
ASK: LCALL ACK ;没读完则继续应答
SJMP RDN1 ;继续读
;===================================开始信号子程序======================================
START: SETB SDA
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;===================================停止信号子程序======================================
STOP: CLR SDA
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
RET
;===================================应答信号子程序======================================
ACK: CLR SDA
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
;==================================非应答信号子程序=====================================
NACK: SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
RET
;==================================检测应答信号子程序===================================
CACK: CLR SCL
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR F0
MOV C, SDA
JNC CEND ;如果是应答信号则F0=0,非应答信号F0=1
SETB F0
CEND: CLR SCL
NOP
RET
;====================================写入1字节子程序====================================
WRBYTE:MOV R6, #8
CLR SCL
WLP: RLC A
JC WR1 ;该位为0,则写入0,为1则写入1
AJMP WR0
WLP1: DJNZ R6, WLP
RET
WR1: SETB SDA ;写入1
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
AJMP WLP1
WR0: CLR SDA ;写入0
SETB SCL
NOP
NOP
CLR SCL
AJMP WLP1
;====================================读取1字节子程序====================================
RDBYTE:MOV R6, #8
RLP: SETB SDA
SETB SCL
MOV C, SDA
JNC RD0 ;C即SDA为1则读出1,为0则读出0
AJMP RD1
RLP1: DJNZ R6, RLP
RET
RD0: CLR C ;读出0程序,将C=0,移到R2.0
MOV A, R2
RLC A
MOV R2, A ;最后将读出的1字节保存在R2中
CLR SCL
AJMP RLP1
RD1: SETB C ;读出1程序,将C=1,移到R2.0
MOV A, R2
RLC A
MOV R2, A ;最后将读出的1字节保存在R2中
CLR SCL
AJMP RLP1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -