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

📄 receivedata.asm

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         CLR   MT_CK
         RET

;--------------------------------------------------------
;设置LCD初始化显示
;--------------------------------------------------------
SET_LCD1:
          MOV  DPTR,#LMESS1   ;指针指到显示信息1
          MOV  A,#1           ;显示在第一行
          CALL  LCD_PRINT
          RET
SET_LCD2:
          MOV  DPTR,#LMESS2   ;指针指到显示信息2
          MOV  A,#2           ;显示在第二行
          CALL  LCD_PRINT
          RET

LMESS1:
         DB  "  RECEIVE DTMF  ",0  ;LCD 第一行显示
LMESS2:
         DB  "NUM:            ",0  ;LCD 第二行显示

;--------------------------------------------------------
;LCD 初始化子程序

;8位数据传送方式,双行显示,字形5*7点阵。
;开显示,不显示光标。
;--------------------------------------------------------
INIT_LCD:
          CALL    DELAY5MS   ;延时15MS
          CALL    DELAY5MS
          CALL    DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵,8位数据。
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS
          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM_NC      ;不检测忙信号
          CALL  DELAY5MS

          MOV  A,#38H        ;双行显示,字形5*7点阵
          CALL  WCOM         ;检测忙信号
          CALL  DELAY5MS
          MOV  A,#0CH        ;开显示,不显示光标,光标不闪烁。
          CALL  WCOM
          CALL  DELAY5MS
          MOV  A,#01H        ;清除 LCD 显示屏
          CALL  WCOM
          CALL  DELAY5MS
          RET

; ------------------------------------------------
CONV1:
          MOV   A,@R0
          ANL   A,#0FH       ;取出低四位二进制数
        ; CJNE  A,#0AH,CONV2
        ; MOV  A,#00H
CONV2:
          PUSH  ACC          ;压入堆栈
          CLR   C            ;C=0
          SUBB  A,#0AH       ;减10
          POP   ACC          ;弹出堆栈
          JC    ASCII0       ;该数小于10,转ASCII0
          ADD   A,#07H       ;大于10的数加上37H
ASCII0:   ADD   A,#30H       ;小于10的数加上30H
          MOV   B,LCD_X
          CALL  LCDP2
          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
;---------------------------------------------------------
;延时50MS子程序
;---------------------------------------------------------
DELAY50MS:
  	  MOV  R6,#100
DEL2:     MOV  R7,#250
          DJNZ  R7,$
          DJNZ  R6,DEL2
          RET
;--------------------------------------------------------
;延时5MS子程序
;--------------------------------------------------------
DELAY5MS:
         MOV  R6,#25
DEL3:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DEL3
         RET
;===================================================
;
;蜂鸣器响一声子程序
;
;===================================================
BEEP_BL:
          MOV  R6,#100
  BL1:    CALL  DEX1
          CPL  BEEP               ;P3.7取反
          DJNZ  R6,BL1
          SETB  BEEP
          MOV  R5,#50
          CALL  DELAY
          RET
 DEX1:    MOV  R7,#150
 DEX2:    NOP
          DJNZ  R7,DEX2
          RET
DELAY:                            ;延时R5×10MS
          MOV  R6,#50
  D1:     MOV  R7,#100
          DJNZ  R7,$
          DJNZ  R6,D1
          DJNZ  R5,DELAY
          RET

;**********************************************************
         END

⌨️ 快捷键说明

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