?? pcf8591-lcd1602-4ch-xianshi.asm
字號(hào):
;*******************************************************************
;* *
;* ME500單片機(jī)開發(fā)系統(tǒng)演示程序 - PCF8591 四路電壓 *
;* *
;* LCD1602 顯示輸入通道與電壓值 *
;* 參考電壓接至5V電源 *
;* 最小輸出電壓:0.00V 最大輸出電壓:5.00V 分辨率:0.02V *
;* *
;* *
;* 版本: V1.0 (2006/11/20) *
;* 作者: gguoqing (Email: gguoqing@willar.com) *
;* 網(wǎng)站: www.willar.com(偉納電子) www.mcusj.com(偉納單片機(jī)世界) *
;* 郵箱: support@willar.com *
;* *
;*【版權(quán)】Copyright(C)偉納電子 www.willar.com All Rights Reserved *
;*【聲明】此程序僅用于學(xué)習(xí)與參考,引用請(qǐng)注明版權(quán)和作者信息! *
;* *
;*******************************************************************
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時(shí)鐘線
SDA EQU P1.3 ;PCF8591數(shù)據(jù)線
LCD_RS EQU P2.0 ;LCD 數(shù)據(jù)/命令選擇端
LCD_RW EQU P2.1 ;LCD 讀/寫選擇端
LCD_EN EQU P2.2 ;LCD 使能信號(hào)
LCD_X EQU 4FH ;LCD 地址變量
LCD_DATA EQU P0 ;LCD 數(shù)據(jù)端口
AD_DATA EQU 40H ;A/D轉(zhuǎn)換值存儲(chǔ)單元首地址(用4個(gè)單元)
DISSTART EQU 45H ;顯示單元首地址(用3個(gè)單元)
AD_TEMP EQU 49H ;AD轉(zhuǎn)換值臨時(shí)存放單元
;==========================================================
ORG 0000H
JMP START
ORG 0030H
;==========================================================
START:
MOV SP,#70H
MOV A,#00H
MOV AD_DATA,A ;A/D轉(zhuǎn)換值存儲(chǔ)單元清零
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 ;延時(shí)10s
DJNZ R5,START1
LCALL SET_LCD2
START2:
MOV R2,#04H ;進(jìn)行四路轉(zhuǎn)換
LCALL PCF_AD ;開始A/D轉(zhuǎn)換
MOV AD_TEMP,AD_DATA+1 ;顯示通道0輸入電壓值
CALL TUNBCD
MOV LCD_X,#2 ;設(shè)置顯示位置
LCALL LCD_CONV1
MOV AD_TEMP,AD_DATA+2 ;顯示通道1輸入電壓值
CALL TUNBCD
MOV LCD_X,#11 ;設(shè)置顯示位置
LCALL LCD_CONV1
MOV AD_TEMP,AD_DATA+3 ;顯示通道2輸入電壓值
CALL TUNBCD
MOV LCD_X,#2 ;設(shè)置顯示位置
LCALL LCD_CONV2
MOV AD_TEMP,AD_DATA ;顯示通道3輸入電壓值
CALL TUNBCD
MOV LCD_X,#11 ;設(shè)置顯示位置
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 ;延時(shí)15ms,等待LCD供電穩(wěn)定
CALL DELAY1
CALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點(diǎn)陣
CALL WCOM
CALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點(diǎn)陣
CALL WCOM
CALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點(diǎn)陣
CALL WCOM
CALL DELAY1
MOV A,#0CH ;開顯示,關(guān)光標(biāo),
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 顯示屏
CALL WCOM
CALL DELAY1
RET
;==========================================================
DELAY1: ;延時(shí)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 ;設(shè)置 LCD 的第一行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#80H ;設(shè)置 LCD 的第一行地址
CALL WCOM ;寫入命令
JMP FILL
LINE2:
MOV A,#0C0H ;設(shè)置 LCD 的第二行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#0C0H ;設(shè)置 LCD 的第二行地址
CALL WCOM
FILL:
CLR A ;填入字符
MOVC A,@A+DPTR ;由消息區(qū)取出字符
CJNE A,#0,LC1 ;判斷是否為結(jié)束碼
RET
LC1:
CALL WDATA ;寫入數(shù)據(jù)
INC DPTR ;指針加1
JMP FILL ;繼續(xù)填入字符
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
;==========================================================
;寫數(shù)據(jù)使能子程序
;RS=H,RW=L,D0-D7=數(shù)據(jù),E=高脈沖
;==========================================================
WDATA:
MOV P0,A
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
DELAY0:
MOV R7,#250 ;延時(shí)500微秒
DJNZ R7,$
RET
;==========================================================
;ASCII 轉(zhuǎn)換并在第二行顯示數(shù)字子程序
;==========================================================
LCD_CONV1:
MOV A,DISSTART+2 ;加載數(shù)據(jù)
CALL SHOW_DIG1 ;顯示數(shù)據(jù)
INC LCD_X ;設(shè)置位置
MOV A,#'.'
MOV B,LCD_X
CALL LCDP1 ;顯示小數(shù)點(diǎn)
MOV A,DISSTART+1 ;加載數(shù)據(jù)
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG1 ;顯示數(shù)據(jù)
MOV A,DISSTART ;加載數(shù)據(jù)
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG1 ;顯示數(shù)據(jù)
RET
LCD_CONV2:
MOV A,DISSTART+2 ;加載數(shù)據(jù)
; MOV LCD_X,#10 ;設(shè)置位置
CALL SHOW_DIG2 ;顯示數(shù)據(jù)
INC LCD_X ;設(shè)置位置
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2 ;顯示小數(shù)點(diǎn)
MOV A,DISSTART+1 ;加載數(shù)據(jù)
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG2 ;顯示數(shù)據(jù)
MOV A,DISSTART ;加載數(shù)據(jù)
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG2 ;顯示數(shù)據(jù)
RET
;==========================================================
;數(shù)據(jù)轉(zhuǎn)換為ASCII碼,送顯示
;==========================================================
SHOW_DIG2:
ADD A,#30H ;轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;地址變量送B
CALL LCDP2 ;送顯示
RET
SHOW_DIG1:
ADD A,#30H ;轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;地址變量送B
CALL LCDP1 ;送顯示
RET
;==========================================================
;在 LCD 第一行指定位置顯示字符
;(A)=ASCII 數(shù)據(jù), (B)=位置變量
;==========================================================
LCDP1:
PUSH ACC ;入棧保護(hù)A
MOV A,B ;設(shè)置顯示地址
ADD A,#80H ;設(shè)置LCD的第一行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數(shù)據(jù)
RET
;==========================================================
;在 LCD 第二行指定位置顯示字符
;(A)=ASCII 數(shù)據(jù), (B)=位置變量
;==========================================================
LCDP2:
PUSH ACC ;入棧保護(hù)A
MOV A,B ;設(shè)置顯示地址
ADD A,#0C0H ;設(shè)置LCD的第二行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數(shù)據(jù)
RET
;====================================================================
;顯示數(shù)據(jù)轉(zhuǎn)為三位BCD碼子程序
;顯示數(shù)據(jù)轉(zhuǎn)為三位BCD碼存入DISSTART+2、
;DISSTART+1、DISSTART(最大值5.00V)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -