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

📄 tt.asm

📁 基于51和VB的广告牌控制系统
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=====================================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 + -