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

📄 miao.asm

📁 LCD1602显示秒表.功能描述:K3为控制按键.第一次按下时,开始计时
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         MOV  SEC,#0          ;秒、分、时单元清零
         MOV  MIN,#0
         MOV  HOUR,#0
 TT:     POP  ACC
         RETI

;--------------------------------------------------------
;时间数据转换为 ASCII 码并显示
;--------------------------------------------------------
CONV:
          MOV  A,HOUR        ;加载小时数据
          MOV  LCD_X,#5      ;设置位置
          CALL  SHOW_DIG2    ;显示数据
          INC  LCD_X         ;
          MOV  A,#':'        ;显示“:”
          MOV  B,LCD_X       ;
          CALL  LCDP2        ;
          MOV  A,MIN         ;加载分钟数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG2    ;显示数据
          INC  LCD_X         ;
          MOV  A,#':'        ;显示“:”
          MOV  B,LCD_X       ;
          CALL  LCDP2        ;
          MOV  A,SEC         ;加载秒数数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG2    ;显示数据
          INC  LCD_X         ;
          MOV  A,#':'        ;显示“:”
          MOV  B,LCD_X       ;
          CALL  LCDP2        ;
          MOV  A,SEC0        ;加载秒数数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG2
          RET
;--------------------------------------------------------
;在LCD1602的第二行显示数字
;--------------------------------------------------------
SHOW_DIG2:
          MOV  B,#10         ;设置被除数
          DIV  AB            ;结果A存商数,B存余数
          ADD  A,#30H        ;A为十位数,转换为字符
          PUSH  B            ;B放入堆栈暂存
          MOV  B,LCD_X       ;设置 LCD 显示的位置
          CALL  LCDP2        ;由 LCD 显示出来
          POP  B             ;
          MOV  A,B           ;B为个位数
          ADD  A,#30H        ;转换为字符
          INC  LCD_X         ;LCD 显示位置加1
          MOV  B,LCD_X       ;设置 LCD 显示的位置
          CALL  LCDP2        ;由 LCD 显示出来
          RET
;--------------------------------------------------------
;在LCD的第二行显示字符
;--------------------------------------------------------
LCDP2:
         PUSH  ACC          ;入栈保护
         MOV  A,B           ;设置显示地址
         ADD  A,#0C0H       ;设置LCD的第二行地址
         CALL  WCOM         ;写入命令
         POP  ACC           ;由堆栈取出A
         CALL  WDATA        ;写入数据
         RET
;--------------------------------------------------------
;在LCD的第一行或第二行显示字符
;--------------------------------------------------------
LCD_PRINT:
          CJNE  A,#1,LINE2  ;判断是否为第一行
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        ;写入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由信息区取出字符
          CJNE  A,#0,LC1    ;判断是否为结束码
          RET
  LC1:    CALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          JMP  FILL         ;继续填入字符
          RET
;--------------------------------------------------------
;清除 LCD 指定行的字符
;“空白”的ASCII代码为20H。
;--------------------------------------------------------
CLR_LINE:
          MOV  R0,#24
   CL1:   MOV  A,#20H       ;' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET

;--------------------------------------------------------
;写控制指令子程序

;写控制指令到LCD
;传入参数: ACC(要写入的指令)
;RS=L,RW=L,E=高脉冲,D0-D7=指令码 。
;--------------------------------------------------------
WCOM:
          ACALL  CHECKBUSY
WCOM_NC:
          MOV  P0,A         ;写入指令
          CLR  LCD_EN
          NOP
          NOP
          CLR LCD_RS
          CLR LCD_RW
          SETB LCD_EN
          ACALL DEL_250
          CLR  LCD_EN
          RET
;--------------------------------------------------------
;写数据子程序

;写显示数据到LCD
;传入参数: ACC(要写入的数据)
;RS=H,RW=L,E=高脉冲,D0-D7=数据码 。
;--------------------------------------------------------
WDATA:
          ACALL  CHECKBUSY
          MOV  P0,A         ;写入数据
          CLR  LCD_EN
          NOP
          NOP
          SETB  LCD_RS
          CLR   LCD_RW
          SETB  LCD_EN
          CALL  DEL_250
          CLR  LCD_EN
          RET

 DEL_250:
          MOV  R7,#125      ;延时250微秒
          DJNZ  R7,$
          RET
;--------------------------------------------------------
;检测LCD控制器忙碌状态

;正常读写操作之前必须检测LCD控制器状态
;BUSY FLAG(P0.7)=1时,忙,不能接收MCU送来的指令和数据。
;BUSY FLAG(P0.7)=0时,闲,能够接收MCU送来的指令和数据。
;读数据时
;RS=L,RW=H,E=H,输出:D0-D7=数据
;--------------------------------------------------------
CHECKBUSY:
          PUSH  ACC
          MOV  P0,#0FFH           ;置P0口为输入状态
          CLR  LCD_EN
          NOP
          NOP
          SETB  LCD_RW
          CLR  LCD_RS
          SETB  LCD_EN
BUSYLOOP:
          NOP
          JB P0.7,BUSYLOOP
          CLR  LCD_EN
          POP  ACC
          RET

;--------------------------------------------------------
;蜂鸣器响一声子程序
;驱动交流蜂鸣器
;--------------------------------------------------------
BEEP_BL:
         MOV  R6,#150
 BL1:    CALL  BL2
         CPL  BEEP
         DJNZ  R6,BL1
         CALL  DELAY5MS
         CALL  DELAY5MS
         CALL  DELAY5MS
         RET

 BL2:    MOV  R7,#180
 BL3:    NOP
         DJNZ  R7,BL3
         RET
;--------------------------------------------------------
;延时5MS子程序
;--------------------------------------------------------
DELAY5MS:
         MOV  R6,#25
DEL1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DEL1
         RET
;--------------------------------------------------------

MADJ:   DB  " BEGIN COUNT  1 ",0
MADJ1:  DB  " PAUSE COUNT  2 ",0
MADJ2:  DB  " BEGIN COUNT  3 ",0
MADJ3:  DB  " PAUSE COUNT  4 ",0

;--------------------------------------------------------
;第二行滚动显示网址子程序
;--------------------------------------------------------
MENU:
          MOV A,#06H         ;移动光标(光标加1)
          CALL  WCOM
          CALL  DELAY5MS
        
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM
          MOV  DPTR,#CHAR
          
FILL1:    CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由信息区取出字符
          CJNE  A,#0,LC2    ;判断是否为结束码
          RET
          
  LC2:    CALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          CALL  DELAY100
          CALL  DELAY100
          JMP  FILL1         ;继续填入字符
          RET
CHAR:
      DB  " www.saxmcu.com ",0
;--------------------------------------------------
;延时100MS子程序
;--------------------------------------------------
DELAY100:                      
          MOV r7,#200
 DL1:     MOV r6,#250
 DL2:     DJNZ R6,DL2
          DJNZ R7,DL1
          RET         
;--------------------------------------------------          
         END



⌨️ 快捷键说明

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