?? nzf.asm
字號:
COM EQU 50H
DAT EQU 51H
TC0 EQU 52H ;定時器計數單元
REST0 EQU 54H ;存放通道0轉換結果
AIN0 EQU 00H ;通道0
LGAT EQU 33H ;量程轉換門限
ADCADD EQU 0F6FFH ;ADC0808 地址
RS EQU P2.1 ;LCD 寄存器選擇信號
RW EQU P2.2 ;LCD 讀/寫選擇信號
E EQU P2.3 ;LCD 使能信號
EV EQU 196 ;<5V時每個間隔的電壓值數量級為10^-4
MAXV EQU 255 ;最大數字量
;--------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BT0
ORG 0030H
MAIN: LCALL WPAD
MOV SP,#60H ;設置堆棧起始位置
LCALL INT ;對顯示器進行初始化
MOV 30H,#30h ;顯示電壓值初始化為 ------
MOV 31H,#0A5H ;-
MOV 32H,#30H ;-
MOV 33H,#30H ;-
MOV 34H,#30h ;-
MOV 35H,#30H ;-
MOV R7 ,#30H ;
LCALL N1 ;顯示出"Voltage = "
MOV REST0,#00H ;轉換結果為00
;--------------------------------------
;定時器初始化
;**************************************
MOV TMOD,#00H ;T0工作方式0
MOV TH0,#0CH ;定時 5ms ,fosc=12MHz時,為0C78H fosc=6MHz 時為 163CH
MOV TL0,#78H
SETB TR0 ;啟動T0
MOV TC0,#14H ;定時 100ms 采樣一次 28H=40
MOV IE,#82H ;開定時中斷
MOV A,#AIN0
MOV DPTR,#ADCADD
MOVX @DPTR,A
;--------------------------------------
;程序循環等待部分
;**************************************
LP: MOV R7,#30H ;顯示緩沖區首地址
LCALL DISPLAY ;調用顯示
SJMP LP ;循環顯示
;主程序結束
;--------------------------------------
;定時器中斷服務程序,讀取轉換結果并轉換為顯示值
;**************************************
BT0: MOV TH0,#0CH ;定時 5ms ,fosc=12MHz時,為0C78H fosc=6MHz 時為 163CH
MOV TL0,#78H
PUSH PSW
MOV PSW,#08H ;中斷中使用寄存器 1
DEC TC0 ;中斷中計數單元都-1
MOV A,TC0 ;如果 0 單元為 0 ,則采集 0 通道數據
CJNE A,#00H,CST0
MOV TC0,#28H ;200ms轉換一次
MOV DPTR,#ADCADD ;讀取通道0轉換結果
MOVX A,@DPTR
MOV REST0,A
;轉到數據轉換程序
MOV DPTR,#ADCADD ;啟動下一次通道0的轉換
MOV A,#AIN0
MOVX @DPTR,A
SJMP V2SHOW
CST0: LJMP REI ;前面跳轉到此接力
;---轉換結果為電壓值
V2SHOW: MOV A,REST0
UIN0: MOV B,#EV
MUL AB
MOV R2,B
MOV R3,A
;---------將二進制轉換為十進制
B2BCD: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#24 ;24bit 即 3 字節
LOOP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP
;------------------------------
;根據轉換結果選擇量程
MOV A,#LGAT
MOV B,REST0
SUBB A,B
JNC LOWM ;轉小量程
;大量程轉換程序
SMV: MOV DPTR,#DTAB ;將轉換結果放到顯示緩沖區
MOV A,R4 ;得到最高位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 30H,A
MOV 31H,#02EH ;小數點
MOV A,R5 ;得到小數點后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R6 ;得到小數點后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
LJMP DCOUV ;轉到啟動 A/D 轉換程序
;小量程轉換程序
LOWM: MOV DPTR,#DTAB ;將轉換結果放到顯示緩沖區
MOV 30H,#02EH ;最高位顯示小數點
MOV A,R5 ;得到小數點后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 31H,A
MOV A,R6 ;得到小數點后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R6
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
DCOUV: MOV A,REST0
MOV A,#AIN0
MOV DPTR,#ADCADD
MOVX @DPTR,A
MOV 35H,#'V' ;單位
REI: POP PSW
RETI
DTAB: DB "0123456789"
;--------二進制轉換位十進制
;中斷服務程序結果
;--------------------------------------
;LCD 顯示相關程序
;**************************************
DISPLAY: ;顯示
MOV COM,#08AH ;開始顯示的地址
LCALL PR1
MOV R1,#06H ;要顯示的數據個數
MOV R0,#30H ;要顯示數據的首地址
L: MOV DAT,@R0
LCALL PR2
INC R0 ;指向要顯示的下一個數據
DJNZ R1,L ;未顯示完,則顯示下一個
RET
;--------------------------------------
;逐字輸入方式演示程序段
;**************************************
N1: MOV COM,#01H ;清屏
LCALL PR1
MOV COM,#06H ;寫入數據后 AC 自動加 1
LCALL PR1
MOV COM,#080H ;開始顯示的 LCD RAM 地址
LCALL PR1
MOV DPTR,#TAB
MOV R2,#10H ;要顯示的字符數
MOV R3,#00H
WRIN: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,WRIN
MOV COM,#0C0H ;顯示首地址
LCALL PR1
MOV DPTR,#STAB ;顯示數據首地址
MOV R2,#10H ;17個數據
MOV R3,#00H ;要顯示的數據位
SL:
MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,SL
;以上是固定顯示標志
MOV COM,#0C0H ;設置第2行DDRAM地址
LCALL PR1 ;寫入
MOV R4,#11H ;第2行共17個字符
LCALL WP1
WPAD: MOV COM,#40H ;設置CGRAM首地址為0
LCALL PR1 ;寫入CGRAM首地址
MOV R4,#32 ;3個漢字共32字節子模數據
MOV DPTR,#ZIMO ;指向字模首地址
WP1: CLR A
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2 ;寫入1字節字模數據
INC DPTR
DJNZ R4,WP1
RET
ZIMO: DB 04H,0CH,0EH,10H,1FH,04H,04H,00H;“牛”
DB 01H,05H,03H,01H,03H,05H,02H,00H,10H,14H,18H,10H,18H,14H,1CH,00H;“兆”
DB 04H,04H,1FH,0EH,1FH,04H,04H,00H;“豐”
RET
STAB: DB "200500729 ",00H,01H,02H,03H
TAB: DB "Voltage = "
;--------------------------------------
;LCD 間接控制方式下的初始化程序
;**************************************
INT: LCALL DELAY
MOV COM,#38H ;設置功能: 8位數據,5X8字體
LCALL PR1
MOV COM,#01H
LCALL PR1
MOV COM,#06H
LCALL PR1
MOV COM,#0EH
LCALL PR1
RET
;--------------------------------------
;延時程序
;**************************************
DELAY: MOV R6,#0FH
MOV R7,#00H
DELAY1: NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET
;--------------------------------------
;LCD 間接控制方式的驅動程序
;**************************************
;--------1.讀 BF 和 AC 值
PR0: PUSH ACC
MOV P0,#0FFH ;P0復位,準備讀。
CLR RS ;RS=0
SETB E ;E=1
LCALL DELAY
MOV COM,P0 ;讀 BF 和 AC6-4 值
CLR E ;E=0
POP ACC
RET
;--------2.寫指令代碼程序
PR1: PUSH ACC
CLR RS
SETB RW
PR11: MOV P0,#0FFH
SETB E
LCALL DELAY
NOP
MOV A,P0
CLR E
JB ACC.7,PR11
CLR RW
MOV P0,COM
SETB E
CLR E
POP ACC
RET
;--------3.寫顯示數據程序
PR2: PUSH ACC
CLR RS
SETB RW
PR21: MOV P0,#0FFH
SETB E
LCALL DELAY
MOV A,P0
CLR E
JB ACC.7,PR21
SETB RS
CLR RW
MOV P0,DAT
SETB E
CLR E
POP ACC
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -