📄 tt.asm
字号:
UPSET BIT P1.2 ;上限标志位,未达到上限是低电平
DECT BIT P1.3 ;每张的间隔检测标志位
UP BIT P1.7 ;上升
UDOWN BIT P1.1 ;下降
DDOWN BIT P1.6 ;下降
SJJG EQU 20H ;时间间隔存在20H
JS EQU 21H ;显示当前滚动到第几张
ZS EQU 22H ;广告总数量-1(最少2张最多256张)如果ZS为00则为256张
ZS2 EQU 23H ;存放PC发过来的张数
GD BIT 2AH.00 ;允许滚动标志位,0允许滚动,1禁止
RS BIT 2AH.01 ;复位标志位,RS=1则从头执行
;====================================AT24C02定义=======================================
SDA BIT P3.6 ;本硬件电路AT2042的SDA接在P3.6
SCL BIT P3.7 ;本硬件电路AT2042的SCL接在P3.7
MTD EQU SJJG ;要发送的数据存放空间的起始地址(这里都存在20H里)
MRD EQU SJJG ;接受过来的数据存放空间的起始地址(这里都存在20H里)
SUBADR EQU 24H ;读写AT2042内部空间的起始地址地址从00H开始
NUMBYT EQU 25H ;发送或接受的字节数这里只要2字节
SLAR DATA 0A1H ;读命令,和AT2042硬件从地址
SLAW DATA 0A0H ;写命令,和AT2042硬件从地址
;======================================================================================
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME0
ORG 0023H
LJMP INT_SC
MAIN: MOV ZS, #02 ;广告总数量-1,这里为3张
MOV ZS2, #02 ;广告总数量-1,这里为3张
LOOP: MOV SP, #5FH
MOV P1, #0FFH
MOV DPTR, #TAB ;DPTR指向TAB表首地址
MOV JS, #00
CLR GD ;默认允许滚动
CLR RS ;默认无复位标志
MOV SUBADR, #00H
MOV NUMBYT, #01 ;读取1字节
LCALL RDNBYT ;读AT24C02,读出时间间隔后是存在20H即SJJG
MOV A, SJJG
CLR C
CJNE A, #01H, D0
D0: JC D2
CJNE A, #99, D1
D1: JC D3
D2: MOV SJJG, #20 ;如果时间间隔不在01~99S之间就设置为20S
MOV SUBADR, #00H
MOV NUMBYT, #01
LCALL WRNBYT ;降修改后的SJJG写入AT24C02的00H地址
D3: MOV TMOD, #21H
MOV SCON, #50H
MOV PCON, #80H
MOV TH1, #0F3H
MOV TL1, #0F3H
MOV TH0, #0E2H ;定时15ms
MOV TL0, #0B4H
SETB EA
SETB ET0
SETB ES
SETB PS
CLR PT0
SETB TR0
SETB TR1
LCALL REST
MOV JS, #01
MOV A, #100
ADD A, JS
LCALL FS_SC
JB GD, $ ;判断是否允许滚动
MOV R7, ZS
LP1: LCALL DELAY20
LP3: JB RS, LP5 ;判断是否需要复位
JB GD, LP3 ;判断是否允许滚动
LCALL UPING ;上升
INC JS
MOV A, #100
ADD A, JS
LCALL FS_SC
DJNZ R7, LP1
MOV R7, ZS
LP2: LCALL DELAY20
LP4: JB RS, LP5 ;判断是否需要复位
JB GD, LP4 ;判断是否允许滚动
LCALL DOWNING ;下降
DEC JS
MOV A, #100
ADD A, JS
LCALL FS_SC
DJNZ R7, LP2
MOV JS, #01 ;一次循环完后复位计数器防止出错
MOV ZS, ZS2 ;获取PC发送过来的张数
MOV R7, ZS
SJMP LP1
LP5: LJMP LOOP
;=======================================上升子程序======================================
UPING: SETB UDOWN
SETB DDOWN
CLR UP ;上升
LCALL DELAYS ;延时一下在判断
UP1: JB DECT, UP2
SJMP UP1
UP2: LCALL DELAY1
JNB DECT, UP1
SETB UP ;停止
SETB UDOWN
SETB DDOWN
RET
;=======================================下降子程序======================================
DOWNING: SETB UP
CLR UDOWN ;下降
CLR DDOWN
LCALL DELAYS ;延时一下在判断
DW1: JB DECT, DW2
SJMP DW1
DW2: LCALL DELAY1
JNB DECT, DW1
SETB UP ;停止
SETB UDOWN
SETB DDOWN
RET
;=======================================复位子程序======================================
REST: JB UPSET, RES1
SETB UP ;复位时一直往下降
CLR UDOWN
CLR DDOWN
SJMP REST
RES1: LCALL DELAY1 ;稍微延时一下
JNB UPSET, REST ;在判断一次防干扰
SETB UP ;在升一点点后在停止
SETB DDOWN
SETB UDOWN
RET
;====================================动态扫描显示=============================================
DISP: MOV A, SJJG ;前两个数码管是显示停留时间的
MOV B, #10
DIV AB ;低2位转BCD
MOV 40H, B ;个位暂存40H
MOV 41H, A ;十位暂存41H
;===========
MOVC A, @A+DPTR ;查表
MOV P0, A ;送到数码管显示
MOV P2, #0FDH
LCALL DELAY0
MOV A, B
MOVC A, @A+DPTR ;查表
MOV P0, A ;送到数码管显示
MOV P2, #0FEH
LCALL DELAY0
MOV A, JS
MOVC A, @A+DPTR ;查表
MOV P0, A ;送到数码管显示
MOV P2, #0DFH
RET
;=====================================按键处理子程序==================================
KEY: MOV P2, #0BFH
JB P2.0, K1
INC SJJG
MOV A, SJJG
CJNE A, #100, S1
MOV SJJG, #01
S1: MOV SUBADR, #00H
MOV NUMBYT, #01
LCALL WRNBYT ;降SJJG写入AT24C02的00H地址
MOV R5, #20
SLP0: LCALL DISP ;延时,按键防抖动
LCALL DELAY0
DJNZ R5, SLP0
K1: JB P2.1, K2
DEC SJJG
MOV A, SJJG
CJNE A, #00, S2
MOV SJJG, #99
S2: MOV SUBADR, #00H
MOV NUMBYT, #01
LCALL WRNBYT ;降SJJG写入AT24C02的00H地址
MOV R5, #20
SLP1: LCALL DISP ;延时,按键防抖动
LCALL DELAY0
DJNZ R5, SLP1
K2: RET
;=====================================5S延时子程序====================================
DELAYS: MOV 5FH, #20
DLY0: MOV 5EH, #250
DLY1: MOV 5DH, #250
DJNZ 5DH, $
JB RS, RSS0
DJNZ 5EH, DLY1
DJNZ 5FH, DLY0
RET
RSS0: LJMP LOOP
;===================================扫描显示延时====================================
DELAY0: MOV 5AH, #30
DSLY: MOV 5BH, #40
DJNZ 5BH, $
DJNZ 5AH, DSLY
RET
;=====================================防干扰延时=====================================
DELAY1: MOV 5FH, #50
DLY2: MOV 5EH, #50
DJNZ 5EH, $
DJNZ 5FH, DLY2
RET
;=====================================动态延时子程序==================================
DELAY20: MOV 5FH, SJJG ;延时时间长度由SJJG存储器的值决定,单位1S
DLY3: MOV 5EH, #05
DLY4: MOV 5DH, #200
DLY5: MOV 5CH, #245
DJNZ 5CH, $
JB RS, RSS1
DJNZ 5DH, DLY5
DJNZ 5EH, DLY4
DJNZ 5FH, DLY3
RET
RSS1: LJMP LOOP
;==========================================串口发送==================================
FS_SC: CLR ES
CLR TI
MOV SBUF, A
JNB TI, $
CLR TI
SETB ES
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -