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

📄 pcf8591-lcd1602-4ch-xianshi.asm

📁 89S52单片机做的A/D,D/A的实验的源程序PCF8591 D/A CONVERTER */ /* */ /* LCD1602显示 */ /* 参考电压接至5V电源 */ /* 最小输出电
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;*******************************************************************
;*                                                                 *
;* ME500单片机开发系统演示程序 - PCF8591 四路电压                  *
;*                                                                 *
;* LCD1602 显示输入通道与电压值                                    *
;* 参考电压接至5V电源                                              *
;* 最小输出电压:0.00V  最大输出电压:5.00V  分辨率:0.02V         *                                     
;*                                                                 *
;*                                                                 *
;* 版本: V1.0 (2006/11/20)                                        *
;* 作者: gguoqing (Email: gguoqing@willar.com)                    *
;* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) *
;* 邮箱: support@willar.com                                       *
;*                                                                 *
;*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved  *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       *
;*                                                                 *
;*******************************************************************

          BEEP  EQU   P3.7       ;蜂鸣器
          K1    EQU   P1.4       ;K1键
          K2    EQU   P1.5       ;K2键
          K3    EQU   P1.6       ;K3键
          K4    EQU   P1.7       ;K4键

          SCL   EQU   P1.0       ;PCF8591时钟线
          SDA   EQU   P1.3       ;PCF8591数据线

          LCD_RS  EQU  P2.0      ;LCD 数据/命令选择端
          LCD_RW  EQU  P2.1      ;LCD 读/写选择端
          LCD_EN  EQU  P2.2      ;LCD 使能信号
          LCD_X   EQU  4FH       ;LCD 地址变量
          LCD_DATA  EQU   P0     ;LCD 数据端口

          AD_DATA   EQU   40H    ;A/D转换值存储单元首地址(用4个单元)
          DISSTART  EQU   45H    ;显示单元首地址(用3个单元)
          AD_TEMP   EQU   49H    ;AD转换值临时存放单元

;==========================================================

            ORG  0000H
            JMP  START
            ORG  0030H

;==========================================================
START:
            MOV  SP,#70H
            MOV  A,#00H
            MOV  AD_DATA,A           ;A/D转换值存储单元清零
            MOV  AD_DATA+1,A
            MOV  AD_DATA+2,A
            MOV  AD_DATA+3,A
            MOV  P0,#0FFH
            MOV  P2,#0FFH
            LCALL  SET_LCD1
            MOV  R5,#50
START1:
            LCALL  DELAY             ;延时10s
            DJNZ  R5,START1
            LCALL  SET_LCD2
START2:
            MOV  R2,#04H             ;进行四路转换
            LCALL  PCF_AD            ;开始A/D转换

            MOV  AD_TEMP,AD_DATA+1     ;显示通道0输入电压值
            CALL  TUNBCD
            MOV  LCD_X,#2           ;设置显示位置
            LCALL LCD_CONV1

            MOV  AD_TEMP,AD_DATA+2   ;显示通道1输入电压值
            CALL  TUNBCD
            MOV  LCD_X,#11           ;设置显示位置
            LCALL LCD_CONV1

            MOV  AD_TEMP,AD_DATA+3   ;显示通道2输入电压值
            CALL  TUNBCD
            MOV  LCD_X,#2            ;设置显示位置
            LCALL LCD_CONV2

            MOV  AD_TEMP,AD_DATA   ;显示通道3输入电压值
            CALL  TUNBCD
            MOV  LCD_X,#11           ;设置显示位置
            LCALL LCD_CONV2

            JMP  START2

;==========================================================

;  LCD 初始化显示子程序

;==========================================================

SET_LCD1:
          CLR  LCD_EN
          CALL  INIT_LCD     ;初始化 LCD
          CALL  DELAY1
          MOV  DPTR,#INFO1   ;指针指到显示信息1
          MOV  A,#1          ;显示在第一行
          CALL  LCD_SHOW
          MOV  DPTR,#INFO2   ;指针指到显示信息2
          MOV  A,#2          ;显示在第二行
          CALL  LCD_SHOW
          RET

INFO1:  DB  "    PCF-8591    ",0  ;LCD 第一行显示信息

INFO2:  DB  "AD-DA  CONVERTER",0  ;LCD 第二行显示信息


SET_LCD2:
          CLR  LCD_EN
          CALL  INIT_LCD     ;初始化 LCD
          CALL  DELAY1
          MOV  DPTR,#INFO3   ;指针指到显示信息1
          MOV  A,#1          ;显示在第一行
          CALL  LCD_SHOW
          MOV  DPTR,#INFO4   ;指针指到显示信息2
          MOV  A,#2          ;显示在第二行
          CALL  LCD_SHOW
          RET

INFO3:  DB "0_    V  1_    V",0  ;LCD 第一行显示信息

INFO4:  DB "2_    V  3_    V",0  ;LCD 第二行显示信息

;==========================================================

; LCD 接口初始化

;==========================================================
INIT_LCD:
          CALL  DELAY1    ;延时15ms,等待LCD供电稳定
          CALL  DELAY1
          CALL  DELAY1

          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#0CH     ;开显示,关光标,
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#01H     ;清除 LCD 显示屏
          CALL  WCOM
          CALL  DELAY1
          RET
;==========================================================
DELAY1:                    ;延时5MS
          MOV  R6,#25
  DEL:
          MOV  R7,#100
          DJNZ  R7,$
          DJNZ  R6,DEL
          RET
;==========================================================

;在LCD的第一行或第二行显示信息字符

;==========================================================
LCD_SHOW:

          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
;---------------------------------------------------------
CLR_LINE:                  ;清除该行 LCD 的字符
          MOV  R0,#24
   CL1:
          MOV  A,#' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;==========================================================

;写指令使能子程序
;RS=L,RW=L,D0-D7=指令码,E=高脉冲

;==========================================================
WCOM:
          MOV  P0,A
          CLR  LCD_RS
          CLR  LCD_RW
          SETB LCD_EN
          CALL  DELAY0
          CLR  LCD_EN
          RET
;==========================================================

;写数据使能子程序
;RS=H,RW=L,D0-D7=数据,E=高脉冲

;==========================================================
WDATA:
          MOV  P0,A
          SETB  LCD_RS
          CLR   LCD_RW
          SETB  LCD_EN
          CALL  DELAY0
          CLR   LCD_EN
          RET
DELAY0:
          MOV  R7,#250     ;延时500微秒
          DJNZ  R7,$
          RET

;==========================================================

;ASCII 转换并在第二行显示数字子程序

;==========================================================
LCD_CONV1:
          MOV  A,DISSTART+2  ;加载数据
          CALL  SHOW_DIG1   ;显示数据
          INC  LCD_X         ;设置位置
          MOV  A,#'.'
          MOV  B,LCD_X
          CALL  LCDP1        ;显示小数点
          MOV  A,DISSTART+1  ;加载数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG1   ;显示数据
          MOV  A,DISSTART    ;加载数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG1   ;显示数据
          RET
LCD_CONV2:
          MOV  A,DISSTART+2  ;加载数据
       ;   MOV  LCD_X,#10     ;设置位置
          CALL  SHOW_DIG2   ;显示数据
          INC  LCD_X         ;设置位置
          MOV  A,#'.'
          MOV  B,LCD_X
          CALL  LCDP2        ;显示小数点
          MOV  A,DISSTART+1  ;加载数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG2   ;显示数据
          MOV  A,DISSTART    ;加载数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG2   ;显示数据
          RET
;==========================================================

;数据转换为ASCII码,送显示

;==========================================================
SHOW_DIG2:
          ADD  A,#30H     ;转换为ASCII码
          MOV  B,LCD_X    ;地址变量送B
          CALL  LCDP2     ;送显示
          RET

SHOW_DIG1:
          ADD  A,#30H     ;转换为ASCII码
          MOV  B,LCD_X    ;地址变量送B
          CALL  LCDP1     ;送显示
          RET
;==========================================================

;在 LCD 第一行指定位置显示字符
;(A)=ASCII 数据, (B)=位置变量

;==========================================================
LCDP1:
          PUSH  ACC        ;入栈保护A
          MOV  A,B         ;设置显示地址
          ADD  A,#80H     ;设置LCD的第一行地址
          CALL  WCOM       ;写入命令
          POP  ACC         ;由堆栈取出A
          CALL  WDATA      ;写入数据
          RET
;==========================================================

;在 LCD 第二行指定位置显示字符
;(A)=ASCII 数据, (B)=位置变量

;==========================================================
LCDP2:
          PUSH  ACC        ;入栈保护A
          MOV  A,B         ;设置显示地址
          ADD  A,#0C0H     ;设置LCD的第二行地址
          CALL  WCOM       ;写入命令
          POP  ACC         ;由堆栈取出A
          CALL  WDATA      ;写入数据
          RET

;====================================================================
;显示数据转为三位BCD码子程序
;显示数据转为三位BCD码存入DISSTART+2、
;DISSTART+1、DISSTART(最大值5.00V)

⌨️ 快捷键说明

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