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

📄 guanggao2.asm

📁 三块广告牌
💻 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 + -