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

📄 iic.asm

📁 自己学习单片机期间 自己遍的一个 LCD 显示模块 可以调整时间并且哟闹铃功能
💻 ASM
字号:
      SDA      EQU    P0.5   ;串行数据线 
      SCL      EQU    P0.6   ;串行时钟线
      SLA      EQU    50H    ;寻址字节存放单元
      NUMBYT   EQU    51H    ;数据的长度
      MTD      EQU    30H    ;发数据缓冲首地址
      MRD      EQU    40H    ;接受数据缓冲首地址
      SLAW     EQU    0A0H   ;EEPROM寻址字节写 
      SLAR     EQU    0A1H   ;EEPROM寻址字节读       
      RS   EQU P3.5
      RW   EQU P3.4
      E    EQU P3.6
      XPOS EQU 21H       ;行方向
      YPOS EQU 22H       ;列方向
;---------------------------------------------------------------------------------------
      ORG   00H
      LJMP  MAIN
      ORG   30H
MAIN: MOV   50H,#11H
      MOV   51H,#11H
      MOV   52H,#11H
      LCALL VIICWRITE
      LCALL VIICREAD
      MOV   A,60H
      CJNE  A,#11H,YY
      CPL   P3.3
YY:   LJMP  $
      
;;;;;;;;;;;;;;;;;;;;;;IICWRITE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VIICWRITE:
      LCALL  WMOV9
      MOV    SLA,#SLAW
      MOV    NUMBYT,#02H
      LCALL  WRNBYT
      RET

WMOV9:MOV    5FH,#50H
      MOV    R0,#MTD
      MOV    R1,#5FH
      MOV    R2,#09H
WMOV: MOV    A,@R1
      MOV    @R0,A
      INC    R0
      INC    R1
      DJNZ   R2,WMOV
      RET
;;;;;;;;;;;;;;;;;;;;;;;;IICREAD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VIICREAD:
      MOV    MTD,#50
      MOV    SLA,#SLAW
      MOV    NUMBYT,#01H
      LCALL  WRNBYT
      MOV    SLA,#SLAR
      MOV    NUMBYT,#09H
      LCALL  RDNBYT
      LCALL  RMOV8
      RET

RMOV8:MOV    R0,#MRD
      MOV    R1,#60H
      MOV    R2,#08H
RMOV: MOV    A,@R0
      MOV    @R0,A
      INC    R0
      INC    R1
      DJNZ   R2,RMOV
      RET 
;-------------------写数据块子程序------------------------------
WRNBYT:
      MOV    R3,NUMBYT
      LCALL  STA
      MOV    A,SLA
      LCALL  WR_BYTE
      LCALL  CACK
      JB     F0,WRNBYT
      MOV    R1,#MTD
WRDA: MOV    A,@R1
      LCALL  WR_BYTE
      LCALL  CACK
      JB     F0,WRNBYT
      INC    R1
      DJNZ   R3,WRDA
      LCALL  STOP
      RET
;----------------------读数据块子程序----------------------------
RDNBYT:
      MOV     R3,NUMBYT
      LCALL   STA
      MOV     A,SLA
      LCALL   WR_BYTE
      LCALL   CACK
      JB      F0,RDNBYT
RDN:  MOV     R1,#MRD
RDN1: LCALL   RD_BYTE
      MOV     R1,A
      DJNZ    R3,ACK
      LCALL   MNACK
      LCALL   STOP
      RET
ACK:  LCALL   MACK
      INC     R1
      LJMP    RDN1
     
;--------------发起脉冲子程序------------------------
STA:  SETB  SDA
      SETB  SCL
      NOP
      NOP
      NOP
      NOP
      CLR   SDA
      NOP 
      CLR   SDA
      NOP
      NOP
      NOP
      NOP
      CLR   SCL
      RET
;---------------------发停止脉冲子程序------------------------
STOP: CLR   SDA
      SETB  SCL
      NOP 
      NOP
      NOP
      NOP 
      SETB  SDA
      NOP
      NOP
      NOP
      NOP
      CLR   SDA
      CLR   SCL
      RET
;----------------------应答子程序----------------------------
MACK: CLR   SDA
      SETB  SCL
      NOP
      NOP
      NOP
      NOP
      CLR   SCL  
      SETB  SDA
      RET
;-------------------------非应答子程序----------------------------
MNACK: SETB  SDA
      SETB  SCL
      NOP
      NOP
      NOP
      NOP
      CLR   SCL
      SETB  SDA
      RET
;-------------------------非应答子程序----------------------------
CACK: SETB  SDA
      SETB  SCL
      CLR   F0 
      MOV   C,SDA
      JNC   CEND
      SETB  F0
CEND: CLR   SCL
      RET
;------------------------------ 写一个字节子程序-------------------------
WR_BYTE:
      MOV   R0,#08H
WR_LP:RLC   A
      JC    WR1
      LJMP  WR3
WR_LP1:DJNZ R0,WR_LP
      RET
WR1:  SETB  SDA
      SETB  SCL
      NOP  
      NOP
      NOP
      NOP
      CLR   SCL
      CLR   SDA
      LJMP  WR_LP1
WR3:  CLR   SDA
      SETB  SCL
      NOP
      NOP
      NOP
      NOP
      CLR   SCL
      LJMP  WR_LP1

;-------------------------------读一个字节子程序--------------------------  
RD_BYTE:
      MOV   R0,#8H
RD_LP:SETB  SDA
      SETB  SCL
      MOV   C,SDA
      MOV   A,R2
      RLC   A
      MOV   A,R2
      CLR   SCL
      DJNZ  R0,RD_LP
      RET
;----------------把秒,分,时等分成两个存储空间---------------------
EXCHANGE:
      MOV   A,50H
      MOV   B,#10H
      DIV   AB
      MOV   61H,A
      MOV   60H,B
      MOV   A,51H
      MOV   B,#10H
      DIV   AB
      MOV   63H,A
      MOV   62H,B   
      MOV   A,52H
      MOV   B,#10H
      DIV   AB
      MOV   65H,A
      MOV   64H,B
      MOV   A,53H
      MOV   B,#10H
      DIV   AB
      MOV   67H,A
      MOV   66H,B
      MOV   A,54H
      MOV   B,#10H
      DIV   AB
      MOV   69H,A
      MOV   68H,B
      MOV   6AH,75H
      MOV   A,55H
      MOV   B,#10H
      DIV   AB
      MOV   6CH,A
      MOV   6BH,B
      RET
;-----------------------------------16进制转换成 ASCII码值---------------------------
ADD_ASCII:
      MOV   A,60H
      ADD   A,#48
      MOV   60H,A
      MOV   A,61H
      ADD   A,#48
      MOV   61H,A
      MOV   A,62H
      ADD   A,#48
      MOV   62H,A
      MOV   A,63H
      ADD   A,#48
      MOV   63H,A
      MOV   A,64H
      ADD   A,#48
      MOV   64H,A
      MOV   A,65H
      ADD   A,#48
      MOV   65H,A
      MOV   A,66H
      ADD   A,#48
      MOV   66H,A
      MOV   A,67H
      ADD   A,#48
      MOV   67H,A
      MOV   A,68H
      ADD   A,#48
      MOV   68H,A
      MOV   A,69H
      ADD   A,#48
      MOV   69H,A
      MOV   A,6AH
      ADD   A,#48
      MOV   6AH,A
      MOV   A,6BH
      ADD   A,#48
      MOV   6BH,A
      MOV   A,6CH
      ADD   A,#48
      MOV   6CH,A
      RET
;--------------------------------LCD 对应的XPOS,YPOS 输出---------------------------------
DISBUF:
      MOV   XPOS,#0
      MOV   YPOS,#0
      MOV   A,#61H
      LCALL LCDWRITE
      MOV   XPOS,#1
      MOV   YPOS,#0
      MOV   A,#60H
      LCALL LCDWRITE
      MOV   XPOS,#2
      MOV   YPOS,#0
      MOV   A,#63H
      LCALL LCDWRITE
      MOV   XPOS,#3
      MOV   YPOS,#0
      MOV   A,#62H
      LCALL LCDWRITE
      MOV   XPOS,#4
      MOV   YPOS,#0
      MOV   A,65H
      LCALL LCDWRITE
      MOV   XPOS,#5
      MOV   YPOS,#0
      MOV   A,64H
      LCALL LCDWRITE
      MOV   XPOS,#6
      MOV   YPOS,#0
      MOV   A,67H
      LCALL LCDWRITE
      MOV   XPOS,#7
      MOV   YPOS,#0
      MOV   A,66H
      LCALL LCDWRITE
      MOV   XPOS,#8
      MOV   YPOS,#0
      MOV   A,69H
      LCALL LCDWRITE
      MOV   XPOS,#9
      MOV   YPOS,#0
      MOV   A,68H
      LCALL LCDWRITE
      MOV   XPOS,#10
      MOV   YPOS,#0
      MOV   A,6BH
      LCALL LCDWRITE
      MOV   XPOS,#11
      MOV   YPOS,#0
      MOV   A,6AH
      LCALL LCDWRITE
      MOV   XPOS,#12
      MOV   YPOS,#0
      MOV   A,6CH
      LCALL LCDWRITE
      MOV   XPOS,#13
      MOV   YPOS,#0
      MOV   A,6BH
      LCALL LCDWRITE
      RET
LCDWRITE:
      LCALL LCDPOS     ;lcd 写地址指令
      LCALL LCDWD      ;LCD 写字符指令
      RET
LCDRESET:
      LCALL DELAY5MS
      LCALL DELAY5MS
      LCALL DELAY5MS 
      MOV   A,#38H
      LCALL LCDWCN
      LCALL DELAY5MS
      MOV   A,#38H
      LCALL LCDWCN
      LCALL DELAY5MS
      MOV   A,#38H
      LCALL LCDWCN
      MOV   A,#38H
      LCALL LCDWC
      MOV   A,#08H
      LCALL LCDWC
      MOV   A,#01H
      LCALL LCDWC
      MOV   A,#06H
      LCALL LCDWC
      MOV   A,#0CH
      LCALL LCDWC
      RET
;------------------------------LCD 写地址指令--------------------------------------------------------
LCDPOS:PUSH ACC
       ANL   XPOS,#0FH
       ANL   YPOS,#01H
       MOV   A,YPOS
       CJNE  A,#00,LPS_LAY
       MOV   A,XPOS
       LJMP  LPS_LAX
LPS_LAY:MOV A,XPOS
       ADD   A,#40H
LPS_LAX:ORL A,#80H
      LCALL LCDWC
       POP   ACC
       RET       
LCDWC:LCALL WAITIDLE
;----------------------------------LCD write not check,写指令------------------------
LCDWCN:CLR   RS
       CLR   RW
       MOV   P1,A
       SETB  E
       NOP
       CLR   E
       RET
;--------------------------LCD busy check,wait till not busy(读状态,判断是否忙)-----------------------------------
WAITIDLE:
         PUSH  ACC
         MOV   P1,#0FFH
         CLR   RS
         SETB  RW
         SETB  E
WTD_PA:  NOP
         JB    P1.7,WTD_PA
         CLR   E
         POP   ACC
         RET
;--------------------------LCD WRITE TATA(写数据)----------------------------------------
LCDWD:   LCALL WAITIDLE
         MOV   P1,A
         CLR   RW
         SETB  RS
         SETB  E
         NOP
         CLR   E
         RET
;----------------------------DELAY---------------------------------
DELAY5MS:MOV R5,#5
    DL2: MOV R6,#250
    DL1: NOP
         NOP
         DJNZ R6,DL1
         DJNZ R5,DL2
         RET

DELAY400MS:
        MOV     R5,#20              ;延时子程序(400MS)
DL4_PA: MOV     R6,#100
DL4_PB: MOV     R7,#100
        DJNZ    R7,$
        DJNZ    R6,DL4_PB
        DJNZ    R5,DL4_PA
        RET

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -