?? adc0832-1602lcd.asm
字號:
AD_CLK EQU P1.0 ;ADC0832 時(shí)鐘端
AD_DAT EQU P1.1 ;ADC0832 數(shù)據(jù)端
AD_CS EQU P3.4 ;ADC0832 片選信號
LCD_RS EQU P2.0 ;LCD 數(shù)據(jù)/命令選擇端
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轉(zhuǎn)換
CALL AD_CHULI ;數(shù)據(jù)處理
CALL LCD_CONV ;數(shù)據(jù)顯示
JMP START1
;====================================================
; LCD 初始化設(shè)置
;====================================================
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點(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
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
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
;---------------------------------------------------
;在 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
;=================================================
;ASCII 轉(zhuǎn)換并在第二行顯示數(shù)字子程序
;=================================================
LCD_CONV:
MOV A,R4 ;加載數(shù)據(jù)
MOV LCD_X,#10 ;設(shè)置位置
CALL SHOW_DIG2A ;顯示數(shù)據(jù)
INC LCD_X ;設(shè)置位置
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2 ;顯示小數(shù)點(diǎn)
MOV A,R5 ;加載數(shù)據(jù)
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG2B ;顯示數(shù)據(jù)
RET
;---------------------------------------
;整數(shù)部分轉(zhuǎn)換為ASCII碼,送顯示
;只顯示一位數(shù)
;---------------------------------------
SHOW_DIG2A:
MOV B,#16
DIV AB
MOV A,B ;只取整數(shù)部分的個(gè)位
ADD A,#30H ;轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;地址變量送B
CALL LCDP2 ;送顯示
RET
;---------------------------------------
;小數(shù)部分轉(zhuǎn)換為ASCII碼,送顯示
;顯示兩位數(shù)
;---------------------------------------
SHOW_DIG2B:
MOV B,#16
DIV AB
ADD A,#30H ;轉(zhuǎn)換為ASCII碼
PUSH B
MOV B,LCD_X ;地址變量送B
CALL LCDP2 ;送顯示
POP B
MOV A,B
ADD A,#30H ;轉(zhuǎn)換為ASCII碼
INC LCD_X
MOV B,LCD_X ;地址變量送B
CALL LCDP2 ;送顯示
RET
;=========================================================
;AD0832 初始化與AD轉(zhuǎn)換子程序
;(A)=AD轉(zhuǎn)換值
;=========================================================
AD_CONV:
SETB AD_CS ;一個(gè)轉(zhuǎn)換周期開始
CLR AD_CLK
CLR AD_CS ;CS置0,片選有效
SETB AD_DAT ;DI置1,起始位
NOP
SETB AD_CLK ;第一個(gè)脈沖
CLR AD_DAT ;在負(fù)跳變之前加一個(gè)DI反轉(zhuǎn)操作
CLR AD_CLK
SETB AD_DAT ;DI置1,設(shè)為單通道
NOP
SETB AD_CLK ;第二個(gè)脈沖
CLR AD_DAT
CLR AD_CLK
CLR AD_DAT ;DI置0,選擇通道0
NOP
SETB AD_CLK ;第三個(gè)脈沖
SETB AD_DAT
CLR AD_CLK
NOP
SETB AD_CLK ; 第四個(gè)脈沖
MOV R1,#08H ;計(jì)數(shù)器初值,讀取8位數(shù)據(jù),
AD_READ: CLR AD_CLK ;下降沿
MOV C,AD_DAT ;讀取DO端數(shù)據(jù)
RLC A ;C移入A,高位在前
SETB AD_CLK ;下一個(gè)脈沖
DJNZ R1,AD_READ ;沒讀完繼續(xù)
SETB AD_CS
RET
;====================================================
;AD轉(zhuǎn)換值處理子程序
;入口:(A) =AD轉(zhuǎn)換值
;出口:處理后的數(shù)據(jù) (R4)=高位,(R5)=低位
;====================================================
AD_CHULI:
CLR C
MOV R5,#00H ;十進(jìn)制轉(zhuǎn)換的低位寄存器
MOV R4,#00H ;十進(jìn)制轉(zhuǎn)換的高位寄存器
MOV R3,#08H ;十進(jìn)制調(diào)整的次數(shù)
AD_CHULI1:
RLC A
MOV R2,A ;送 R2 保存
MOV A,R5 ;(R5)乘2加C
ADDC A,R5
DA A ;做十進(jìn)制調(diào)整
MOV R5,A ;結(jié)果存回R5
MOV A,R4 ;(R4)乘2加C
ADDC A,R4
MOV R4,A ;結(jié)果存回R4
MOV A,R2
DJNZ R3,AD_CHULI1 ;是否轉(zhuǎn)換完?
MOV A,R5 ;(R5)乘2
ADD A,R5
DA A
MOV R5,A ;結(jié)果存回R5
MOV A,R4
ADDC A,R4 ;(R4)乘2加C
DA A
MOV R4,A ;結(jié)果存回R4
RET
;---------------------------------------------------
END ;結(jié)束
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -