单片机与0832 1602的电压表完整程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AD_CLK EQU P1.0 ;ADC0832 时钟端
AD_DAT EQU P1.1 ;ADC0832 数据端
AD_CS EQU P3.4 ;ADC0832 片选信号
LCD_RS EQU P2.0 ;LCD 数据/命令选择端
LCD_RW EQU P2.1 ;LCD 读/写选择端
LCD_EN EQU P2.2 ;LCD 使能信号
LCD_X EQU 20H ;LCD 地址变量
ORG 0000H
JMP START
;===================================================
START: MOV SP,#60H
MOV P0,#0FFH
MOV P2,#0FFH
CALL SET_LCD
START1: CALL AD_CONV ;AD转换
CALL AD_CHULI ;数据处理
CALL LCD_CONV ;数据显示
JMP START1
;====================================================
; LCD 初始化设置
;====================================================
SET_LCD:
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 "DIGITALVOLTMETER",0 ;LCD 第一行显示信息
INFO2: DB " VOLTAGE: V ",0 ;LCD 第二行显示信息
;-----------------------------------------------------
;-----------------------------------------------------
; LCD 接口初始化
;-----------------------------------------------------
INIT_LCD:
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
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
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)=位置变量
;---------------------------------------------------
LCDP2:
PUSH ACC ;入栈保护A
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;=================================================
;ASCII 转换并在第二行显示数字子程序
;=================================================
LCD_CONV:
MOV A,R4 ;加载数据
MOV LCD_X,#10 ;设置位置
CALL SHOW_DIG2A ;显示数据
INC LCD_X ;设置位置
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2 ;显示小数点
MOV A,R5 ;加载数据
INC LCD_X ;设置位置
CALL SHOW_DIG2B ;显示数据
RET
;---------------------------------------
;整数部分转换为ASCII码,送显示
;只显示一位数
;---------------------------------------
SHOW_DIG2A:
MOV B,#16
DIV AB
MOV A,B ;只取整数部分的个位
ADD A,#30H ;
转换为ASCII码
MOV B,LCD_X ;地址变量送B
CALL LCDP2 ;送显示
RET
;---------------------------------------
;小数部分转换为ASCII码,送显示
;显示两位数
;---------------------------------------
SHOW_DIG2B:
MOV B,#16
DIV AB
ADD A,#30H ;转换为ASCII码
PUSH B
MOV B,LCD_X ;地址变量送B
CALL LCDP2 ;送显示
POP B
MOV A,B
ADD A,#30H ;转换为ASCII码
INC LCD_X
MOV B,LCD_X ;地址变量送B
CALL LCDP2 ;送显示
RET
;=========================================================
;AD0832 初始化与AD转换子程序
;(A)=AD转换值
;=========================================================
AD_CONV:
SETB AD_CS ;一个转换周期开始
CLR AD_CLK
CLR AD_CS ;CS置0,片选有效
SETB AD_DAT ;DI置1,起始位
NOP
SETB AD_CLK ;第一个脉冲
CLR AD_DAT ;在负跳变之前加一个DI反转操作
CLR AD_CLK
SETB AD_DAT ;DI置1,设为单通道
NOP
SETB AD_CLK ;第二个脉冲
CLR AD_DAT
CLR AD_CLK
CLR AD_DAT ;DI置0,选择通道0
NOP
SETB AD_CLK ;第三个脉冲
SETB AD_DAT
CLR AD_CLK
NOP
SETB AD_CLK ; 第四个脉冲
MOV R1,#08H ;计数器初值,读取8位数据,
AD_READ: CLR AD_CLK ;下降沿
MOV C,AD_DAT ;读取DO端数据
RLC A ;C移入A,高位在前
SETB AD_CLK ;下一个脉冲
DJNZ R1,AD_READ ;没读完继续
SETB AD_CS
RET
;====================================================
;AD转换值处理子程序
;入口:(A) =AD转换值
;出口:处理后的数据 (R4)=高位,(R5)=低位
;====================================================
AD_CHULI:
CLR C
MOV R5,#00H ;十进制转换的低位寄存器
MOV R4,#00H ;十进制转换的高位寄存器
MOV R3,#08H ;十进制调整的次数
AD_CHULI1:
RLC A
MOV R2,A ;送 R2 保存
MOV A,R5 ;(R5)乘2加C
ADDC A,R5
DA A ;做十进制调整
MOV R5,A ;结果存回R5
MOV A,R4 ;(R4)乘2加C
ADDC A,R4
MOV R4,A ;结果存回R4
MOV A,R2
DJNZ R3,AD_CHULI1 ;是否转换完?
MOV A,R5 ;(R5)乘2
ADD A,R5
DA A
MOV R5,A ;结果存回R5
MOV A,R4
ADDC A,R4 ;(R4)乘2加C
DA A
MOV R4,A ;结果存回R4
RET
;---------------------------------------------------
END ;结束