📄 guanggao2.asm
字号:
OFF EQU P1.0 ;关闭显示按键
SD EQU P1.1 ;LCM103数据线
AD EQU P1.2 ;数值加键
SB EQU P1.4 ;数值减键
WR EQU P1.3 ;LCM103写控制线
CS EQU P1.5 ;LCM103片选线
SCL EQU P1.6 ;24C02时钟线
SDA EQU P1.7 ;24C02数据线
SE EQU P3.4 ;传感器数据口
DJ EQU P3.7 ;电机控制口
FLAG1 EQU 20H ;呼出广告标志,01-广告1 02-广告2 03-广告3
FLAG2 EQU 15H ;电机位置标志,01-广告1 02-广告2 03-广告3
TIMEL EQU 12H ;倒计时标志,个位
TIMEH EQU 13H ;倒计时标志,十位
KST EQU 19H ;去除抖动标志 1-去除了抖动 0-没有进行去除抖动的处理
KCD EQU 1AH ;已识别完按键的标志 1-按键已识别但还没释放
;0-进行按键识别处理
KEY EQU 1BH ;键值标志 1-加键 2-减键
TEMP EQU 1CH ;临时变量
SHOW EQU 1DH ;倒计时标志 00H-显示倒计时 0FH-不显示倒计时
ORG 0000H
RESET: LJMP MAIN
ORG 0003H
LJMP EXINT0
ORG 000BH
LJMP MAIN
ORG 0013H
LJMP MAIN
ORG 001BH
LJMP TIMEINT1
ORG 0023H
LJMP MAIN
ORG 0026H
MAIN: NOP
CALL DELAY
SETB EA ;CPU开中断
SETB EX0
CLR EX1
MOV FLAG1,#01H ;初值为一
MOV SHOW,#0FH
MOV TMOD,#11H ;T0方式1定时 T1方式1定时
MOV TCON,#00H ;
MOV TH1,#9EH ;T1 计数初值 产生50ms定时
MOV TL1,#58H
LCALL INILCM
LCALL RE24C02 ;将各广告设置值放入相应计数器
CALL INI24C02
MOV TIMEL,60H
MOV TIMEH,61H
MOV KST,#0H
CLR DJ ;电机开始转动
MOV FLAG2,#01
WAIT: JB SE,WAIT ;等待电机转到广告位置
SETB DJ ;电机停止转动
WAIT1: CALL DELAY
MOV A,TIMEL
CJNE A,#00H,CAL1
MOV A,TIMEH
CJNE A,#00H,CAL2
CLR DJ ;电机转动
LCALL DELAY ;延时2秒
LCALL DELAY
MOV A,FLAG2
CJNE A,#01,CAL3
INC FLAG2
MOV TIMEL,62H
MOV TIMEH,63H
JMP WAIT
WAIT2: MOV A,SHOW
CJNE A,#00H,WAIT1
MOV R0,TIMEL
MOV R1,TIMEH
MOV R2,FLAG2
CALL WDATE
JMP WAIT1
CAL1: DEC TIMEL
LJMP WAIT2
CAL2: DEC TIMEH
MOV TIMEL,#09H
LJMP WAIT2
CAL3: CJNE A,#02,CAL4
INC FLAG2
MOV TIMEL,64H
MOV TIMEH,65H
JMP WAIT
CAL4: MOV FLAG2,#01
MOV TIMEL,60H
MOV TIMEH,61H
JMP WAIT
;FLAG1-广告号标志 R0-个位数字 R1-十位数字
;60-61广告1设置值 62-63广告2设置值 64-65广告3设置值 AD-加键 SB-减键
EXINT0:CLR EX0
CALL DELAY200
JB P3.2,INT5
MOV A,FLAG1
CJNE A,#01H,INT1
MOV R0,60H ;显示广告1设置值
MOV R1,61H
MOV R2,FLAG1
MOV SHOW,#0FH
INC FLAG1
LJMP INT4
INT1:CJNE A,#02H,INT2 ;显示广告2设置值
MOV R0,62H
MOV R1,63H
MOV R2,FLAG1
MOV SHOW,#0FH
INC FLAG1
LJMP INT4
INT2:CJNE A,#03H,INT3
MOV R0,64H ;显示广告3设置值
MOV R1,65H
MOV R2,FLAG1
MOV SHOW,#0FH
INC FLAG1
JMP INT4
INT3:MOV R0,#10H
MOV R1,#10H
MOV R2,FLAG1
MOV SHOW,#00H
MOV FLAG1,#01H
INT4:LCALL WDATE ;数值显示
CALL DELAY200
CLR TF1 ;T1溢出中断清零
SETB ET1 ;允许T1中断
SETB TR1 ;T1开始计数
INT5:SETB EX0 ;允许外部中断0中断
RETI
;按键扫描程序
TIMEINT1:JB AD,TIME1 ;判断加键是否按下,没按下跳转
MOV KEY,#01H
JMP TIME2
TIME1:JB SB,TIME1A ;判断减键是否按下,没按下跳转
MOV KEY,#02H
JMP TIME2
TIME1A:JB OFF,TIME5
MOV KEY,#00H
TIME2:MOV A,KST
CJNE A,#01H,TIME3 ;判断是否已消抖,没消抖跳转
MOV A,KCD
CJNE A,#00H,TIME4 ;判断按键是否释放,没释放跳转
MOV KCD,#01H
MOV A,KEY
LJMP TIME6
TIME3:MOV KST,#01H
LJMP TIME1END
TIME4:LJMP TIME1END
TIME5:MOV KST,#00H
MOV KCD,#00H
LJMP TIME1END
TIME6:CJNE A,#00,TIME7
JMP INTOFF
TIME7:CJNE A,#01,INTSB
;按加键处理程序
INTAD:CJNE R0,#09H,INTAD1 ;判断个位是否为9,不为9则跳转
CJNE R1,#09H,INTAD2 ;判断十位是否为9,不为9则跳转
MOV R0,#01H
MOV R1,#00H
LJMP INTEND
INTAD1:INC R0
LJMP INTEND
INTAD2:MOV R0,#00H
INC R1
LJMP INTEND
;按减键处理程序
INTSB:CJNE R0,#00H,INTSB1 ;判断个位是否为0,不为0则跳转
CJNE R1,#00H,INTSB2 ;判断十位是否为0,不为0则跳转
MOV R0,#09H
MOV R1,#09H
LJMP INTEND
INTSB1:DEC R0
LJMP INTEND
INTSB2:MOV R0,#09H
DEC R1
LJMP INTEND
INTOFF:CALL OFFSHOW
CALL WR24C02
CLR TR1
MOV A,FLAG1
CJNE A,#01,TIME1END
INC FLAG1
JMP TIME1END
INTEND:LCALL WDATE
MOV A,FLAG1 ;判断当前为那幅广告
CJNE A,#02,INTEND1 ;不为广告1则跳转
MOV 60H,R0 ;为广告1
MOV 61H,R1
LJMP TIME1END
INTEND1:CJNE A,#03H,INTEND2 ;不为广告2则跳转
MOV 62H,R0 ;为广告2
MOV 63H,R1
LJMP TIME1END
INTEND2:
MOV 64H,R0 ;为广告3
MOV 65H,R1
LJMP TIME1END
TIME1END:MOV TH1,#9EH
MOV TL1,#58H
RETI
WR24C02:MOV R7,#8H;WRITE AT24C02 左移8位
MOV R3,#60H
MOV R0,#60H
MOV R6,#06H
MOV A,R6
PUSH ACC
MOV R6,#2H
MOV R5,#2H
MOV R2,#0A0H
CLR SCL
SETB SDA
SETB SCL
CLR SDA
MOV A,R2
WRI1:CLR SCL
RLC A
MOV SDA,C
SETB SCL
DJNZ R7,WRI1
DJNZ R6,WRI2
DJNZ R5,WRI3
CLR SCL
SETB SDA
SETB SCL
WRIA:JB SDA,WRIA
CLR SCL
CLR SDA
SETB SCL
SETB SDA
RET
WRI2:CLR SCL
SETB SDA
SETB SCL
WR2A:JB SDA,WR2A
CLR SCL
MOV R7,#8
CJNE R5,#1,WRI4
INC R0
MOV A,@R0
SJMP WRI1
WRI4:MOV A,R3
SJMP WRI1
WRI3:CLR SCL
SETB SDA
SETB SCL
WR3A:JB SDA,WR3A
CLR SCL
POP ACC
MOV R6,A
MOV A,@R0
MOV R7,#8
SJMP WRI1
RE24C02:MOV R0,#60H ;RAM START ADDRESS
MOV R7,#8
MOV A,#06 ;READ 6 BYTES
PUSH ACC
MOV R6,#2H
MOV R5,#2H
MOV R2,#0A0H
CLR SCL
SETB SDA
SETB SCL
CLR SDA
MOV A,R2
RED1:CLR SCL
RLC A
MOV SDA,C
SETB SCL
DJNZ R7,RED1
DJNZ R6,RED2
DJNZ R5,RED3
CLR SCL
SETB SDA
SETB SCL
RED4:JB SDA,RED4
CLR SCL
MOV R7,#8
POP ACC
MOV R6,A
CLR A
RED5:SETB SCL
MOV C,SDA
CLR SCL
RLC A
DJNZ R7,RED5
DJNZ R6,RED6
MOV @R0,A
SETB SDA
SETB SCL
CLR SCL
CLR SDA
SETB SCL
SETB SDA
RET
RED2:CLR SCL
SETB SDA
SETB SCL
RD2A:JB SDA,RD2A
CLR SCL
MOV A,#60H ;24C02 START ADDRESS
MOV R7,#8
SJMP RED1
RED3:CLR SCL
SETB SDA
SETB SCL
RED3A:JB SDA,RED3A
CLR SCL
SETB SDA
SETB SCL
CLR SDA
CLR SCL
MOV R6,#1
MOV A,#0A1H
MOV R7,#8
SJMP RED1
RED6:CLR SDA
SETB SCL
CLR SCL
SETB SDA
MOV @R0,A
INC R0
CLR A
MOV R7,#8
LJMP RED5
INI24C02:MOV R0,#60H
MOV TEMP,#06H
RED7:MOV A,R0
INC R0
CLR C
SUBB A,#09H
JNC RED8
JZ RED8
DEC R0
MOV @R0,#05H
INC R0
DJNZ TEMP,RED7
JMP RED9
RED8:DJNZ TEMP,RED7
RED9:RET
INILCM: LCALL DELAY200 ;LCM初始化子程序
MOV R7,#48H
LCALL WRITE ;专用初始化命令
MOV R7,#28H
LCALL WRITE ;外部晶体振荡方式
MOV R7,#02H
LCALL WRITE ;开振荡器命令
RET
;DELAY 1 S 延时1秒子程序
DELAY: MOV R4,#04H
DELAY1: MOV R5,#0FAH
DELAY2: MOV R6,#0FAH
DELAY3: DJNZ R6,DELAY3
DJNZ R5,DELAY2
DJNZ R4,DELAY1
RET
DELAY200:MOV R7,#064H
DELAY21:MOV R6,#0FAH
DELAY22:DJNZ R6,DELAY22
DJNZ R7,DELAY21
RET
OFFSHOW:MOV R7,#04H
LCALL WRITE
RET
;写命令子程序 A-命令字前四位 R7-命令字后8位
WRITE: MOV TEMP,#04H
SETB CS
SETB WR
SETB SD
CLR CS
MOV A,#80H
WRIT1: CLR WR
RLC A
MOV SD,C
SETB WR
DJNZ TEMP,WRIT1 ;写入高字节
MOV A,R7
MOV TEMP,#08H
WRIT2: CLR WR
RLC A
MOV SD,C
SETB WR
DJNZ TEMP,WRIT2
SETB CS
SETB WR
SETB SD
RET
;连续写子程序 R0-需要显示的个位数字 R1-需要显示的十位数字 R2-广告牌标志
WDATE: MOV R7,#06H ;开显示命令
LCALL WRITE
CLR CS
CLR WR ;连续写命令 第一位
SETB WR
MOV TEMP,#08H
MOV A,#40H
WD1: CLR WR ;连续写命令 中间8位
RLC A
MOV SD,C
SETB WR
DJNZ TEMP,WD1
MOV A,R0
MOV R6,A
CALL NUMCONVERT
MOV A,R1
MOV R6,A
CJNE A,#00,WD110
MOV R6,#10H
WD110: CALL NUMCONVERT
WDENDB: MOV TEMP,#54H ;将第三位到第九位关灭
CLR SD
WDEND1: CLR WR
SETB WR
DJNZ TEMP,WDEND1
MOV A,R2
MOV R6,A
CALL NUMCONVERT
SETB CS
SETB WR
SETB SD
LJMP WDEND3
WDEND3: RET
WDWRITE:MOV TEMP,#04H
WDW1: CLR WR
RLC A
MOV SD,C
SETB WR
DJNZ TEMP,WDW1
RET
NUMCONVERT:
WD1A: CJNE R6,#00H,WD2
LJMP WDWR0 ;显示0
WD2: CJNE R6,#01H,WD3
LJMP WDWR1 ;显示1
WD3: CJNE R6,#02H,WD4
LJMP WDWR2 ;显示2
WD4: CJNE R6,#03H,WD5
LJMP WDWR3 ;显示3
WD5: CJNE R6,#04H,WD6
LJMP WDWR4 ;显示4
WD6: CJNE R6,#05H,WD7
LJMP WDWR5 ;显示5
WD7: CJNE R6,#06H,WD8
LJMP WDWR6 ;显示6
WD8: CJNE R6,#07H,WD9
LJMP WDWR7 ;显示7
WD9: CJNE R6,#08H,WD10
LJMP WDWR8 ;显示8
WD10: CJNE R6,#09H,WD11
LJMP WDWR9 ;显示9
WD11: LJMP WDWR10 ;十位数字为零,不显示
WDWR0: MOV A,#80H
LCALL WDWRITE
MOV A,#60H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
LJMP WDEND
WDWR1: MOV A,#80H
LCALL WDWRITE
MOV A,#20H
LCALL WDWRITE
MOV A,#00H
LCALL WDWRITE
LJMP WDEND
WDWR2: MOV A,#80H
LCALL WDWRITE
MOV A,#0C0H
LCALL WDWRITE
MOV A,#0A0H
LCALL WDWRITE
LJMP WDEND
WDWR3: MOV A,#80H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
MOV A,#20H
LCALL WDWRITE
LJMP WDEND
WDWR4: MOV A,#80H
LCALL WDWRITE
MOV A,#0A0H
LCALL WDWRITE
MOV A,#40H
LCALL WDWRITE
LJMP WDEND
WDWR5: MOV A,#00H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
MOV A,#60H
LCALL WDWRITE
LJMP WDEND
WDWR6: MOV A,#00H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
LJMP WDEND
WDWR7: MOV A,#80H
LCALL WDWRITE
MOV A,#60H
LCALL WDWRITE
MOV A,#00H
LCALL WDWRITE
LJMP WDEND
WDWR8: MOV A,#80H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
LJMP WDEND
WDWR9: MOV A,#80H
LCALL WDWRITE
MOV A,#0E0H
LCALL WDWRITE
MOV A,#60H
LCALL WDWRITE
LJMP WDEND
WDWR10: MOV A,#00H
LCALL WDWRITE
MOV A,#00H
LCALL WDWRITE
MOV A,#00H
LCALL WDWRITE
LJMP WDEND
WDEND: RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -