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

📄 pcf8591-da-lcd1602-asm.asm

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

;*******************************************************************
;*                                                                 *
;* ME500单片机开发系统演示程序 - PCF8591 D/A CONVERTER             *
;*                                                                 *
;* LCD1602 显示                                                    *
;*                                                                 *
;*   K2-D/A CHOOSE                                                *
;* K3-ENTER  K4-EXIT                                               *
;*                                                                 *
;* 版本: 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  6FH       ;LCD 地址变量
          LCD_DATA  EQU   P0     ;LCD 数据端口

          DACOM    EQU   40H     ;D/A的控制命令
;==========================================================

            ORG  0000H
            JMP  MAIN
            ORG  0030H

;==========================================================
MAIN:
            MOV  SP,#70H
            MOV  P0,#0FFH
            MOV  P2,#0FFH
            LCALL  SET_LCD1          ;显示启动画面
            MOV  R5,#50
START:
            LCALL  DELAY             ;延时5s
            DJNZ  R5,START
START1:
            LCALL  SET_LCD2          ;显示工作画面
START2:
            JB  K2,START2
            LCALL  BEEP_BL
            JNB  K2,$
            LCALL  DA_OUT
            JMP  START1

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

;D/A 转换子程序

;==========================================================
DA_OUT:
            LCALL  SET_LCD4
            CLR  20H.1            ;K4健(退出)有效标志
;----------------------------------------------------------
;正弦波输出
;----------------------------------------------------------
SINE1:
            JNB K2,SQUARE0
            JB  K3,SINE1
            LCALL  BEEP_BL
SINE2:
            JB  20H.1,SINE_END
            ACALL  SINE
            JMP  SINE2
SINE_END:
            CLR  20H.1
            RET
;----------------------------------------------------------
;方波输出
;----------------------------------------------------------
SQUARE0:
            MOV  DPTR,#INFOA   ;指针指到显示信息9
            MOV  A,#2          ;显示在第二行
            CALL  LCD_SHOW
            LCALL  BEEP_BL
            JNB  K2,$
SQUARE1:
            JNB K2,TRIANGLE0
            JB  K3,SQUARE1
            LCALL  BEEP_BL
SQUARE2:
            JB  20H.1,SQUARE_END
            LCALL  SQUARE
            JMP  SQUARE2
SQUARE_END:
            CLR  20H.1
            RET
;----------------------------------------------------------
;三角波输出
;----------------------------------------------------------
TRIANGLE0:
            MOV  DPTR,#INFOB   ;指针指到显示信息A
            MOV  A,#2          ;显示在第二行
            CALL  LCD_SHOW
            LCALL  BEEP_BL
            JNB  K2,$
TRIANGLE1:
            JNB  K2,ECHELON0
            JB   K3,TRIANGLE1
            LCALL  BEEP_BL
TRIANGLE2:
            JB  20H.1,TRIANGLE_END
            LCALL  TRIANGLE
            JMP  TRIANGLE2
TRIANGLE_END:
            CLR  20H.1
            RET
;----------------------------------------------------------
;梯形波输出
;----------------------------------------------------------
ECHELON0:
            MOV  DPTR,#INFOC   ;指针指到显示信息B
            MOV  A,#2          ;显示在第二行
            CALL  LCD_SHOW
            LCALL  BEEP_BL
            JNB K2,$
ECHELON1:
            JNB K2,SAWTOOTH0
            JB  K3,ECHELON1
            LCALL  BEEP_BL
ECHELON2:
            JB  20H.1,ECHELON_END
            LCALL  ECHELON
            JMP  ECHELON2
ECHELON_END:
            CLR  20H.1
            RET
;----------------------------------------------------------
;锯齿波输出
;----------------------------------------------------------
SAWTOOTH0:
            MOV  DPTR,#INFOD   ;指针指到显示信息C
            MOV  A,#2          ;显示在第二行
            CALL  LCD_SHOW
            LCALL  BEEP_BL
            JNB  K2,$
SAWTOOTH1:
            JNB  K2,DA_OUT_END
            JB  K3,SAWTOOTH1
            LCALL  BEEP_BL
            JNB  K2,$
SAWTOOTH2:
            JB  20H.1,SAW_END
            LCALL  SAWTOOTH
            JMP  SAWTOOTH2
SAW_END:
            CLR  20H.1
            RET
DA_OUT_END:
            LCALL  BEEP_BL
            JMP  DA_OUT

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

;  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  "  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 " K2: D/A CHOOSE ",0  ;LCD 第一行显示信息

INFO4:  DB "K3:ENTER K4:EXIT",0  ;LCD 第二行显示信息

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

INFO7:  DB " D/A  CONVERTER ",0  ;LCD 第一行显示信息

INFO9:  DB "   SINE  WAVE   ",0  ;LCD 第二行显示信息   正弦波

INFOA:  DB "  SQUARE  WAVE  ",0  ;LCD 第二行显示信息   方波

INFOB:  DB " TRIANGLE  WAVE ",0  ;LCD 第二行显示信息

INFOC:  DB "  ECHELON WAVE  ",0  ;LCD 第二行显示信息

INFOD:  DB " SAWTOOTH  WAVE ",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
;==========================================================
;延时5MS                                                  =
;==========================================================
DELAY1:
          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

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

;在 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

;====================================================================
;蜂鸣器响一声子程序
;====================================================================
BEEP_BL:
         MOV  R6,#100
DEL1:
         LCALL  DEL2
         CPL  BEEP
         DJNZ  R6,DEL1
         LCALL  DEL4
         RET
DEL2:
         MOV  R7,#180
DEL3:
         NOP
         DJNZ  R7,DEL3
         RET

⌨️ 快捷键说明

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