標(biāo)題:
單片機(jī)KS0074電壓表,電流表源程序(液晶顯示)
[打印本頁]
作者:
speachkone
時(shí)間:
2018-4-9 17:59
標(biāo)題:
單片機(jī)KS0074電壓表,電流表源程序(液晶顯示)
單片機(jī)控制KS0074實(shí)現(xiàn)電壓表,電流表功能的源碼如下:
;引腳為:1VCC,2VCC,3GND,4BLA,5DB7,6DB6,7DB5,8DB4,9E,10RW,11RS,12V0,13GND,14GND,15VCC.實(shí)際上,可任用其中一個(gè)VCC引腳和一個(gè)GND引腳。
;KS0074有8線并行、4線并行和2線串行輸入方式,但set1602默認(rèn)的輸入方式為4數(shù)據(jù)總線并行輸入方式
;V0引腳應(yīng)通過串接800歐左右電阻后接VCC(5V)�;蛘撸赩CC和GND之間串接一個(gè)5~10可調(diào)電位器,滑動(dòng)端接V0,利用調(diào)節(jié)滑動(dòng)端控制LCD顯示對比度。
;BLA輸入電壓應(yīng)為3.3V,可通過串接合適電阻后接VCC(5V),避免高溫?zé)龎腖CD。
;---------------------------------------------------------------------------------------------------------------------
;以下為硬件連接要求
DB4 equ p0.4
DB5 equ p0.5
DB6 equ p0.6
DB7 equ p0.7
RS EQU P2.5
RW EQU P2.6
E EQU P2.7
RCOMDATE equ 70H;作為讀取的BF相關(guān)指令信息的暫存單元
WCOMdate equ 71H;作為擬寫入指令代碼的暫存單元
RLCDDATE Equ 72H;作為讀取LCD相關(guān)顯示代碼或信息的暫存單元
WLCDDATe EQU 73H;作為擬寫入LCD顯示信息的暫存單元
;-------------------------------------------------------------------------------------------------------
P1ASF EQU 9DH ;P1口設(shè)置寄存器
ADC_CONTOR EQU 0BCH ;ADC控制寄存器
ADC_RES EQU 0BDH ;ADC輸出高8位
ADC_RESL EQU 0BEH ;ADC低8為輸出
AUXR1 EQU 0A2H ;設(shè)置寄存器
IJISHU EQU 30H ;電流比較次數(shù)計(jì)數(shù)
UJISHU EQU 31H ;電壓比較次數(shù)計(jì)數(shù)
IL EQU 32H ;電流低位
IH EQU 33H ;電流高位
UL EQU 34H ;電壓低位
UH EQU 35H ;電壓高位
ORG 0000H
LJMP START
ORG 002BH
START:
MOV P1ASF,#00000011B ;開啟P1.0和P1.1作為AD的輸入端口
MOV AUXR1,#04H ;設(shè)置AD輸出方式
MOV SP,#5FH ;設(shè)置棧底
MOV IJISHU,#00H
MOV UJISHU,#00H
;×××××××××××××××××××××××××
LCD:
MOV SP,#80H
;------------------------- -------------------------------------------------------------
;首先,開機(jī)或復(fù)位后,應(yīng)進(jìn)行4數(shù)據(jù)總線和LCD初始化,將默認(rèn)的8位數(shù)據(jù)接口改為4位。
;---------------------------------------------------------------------------------------------------------------------
;開機(jī)或復(fù)位后,至少應(yīng)等待20MS以上
LCALL Delay1MS
LCALL Delay1MS
;第一步功能設(shè)置,設(shè)為4位數(shù)據(jù)總線方式輸入(DL=0)
MOV WCOMDATE,#20H
LCALL INPUTCOMMAND;輸入指令0010XXXX(低四位忽略)
;第二步功能設(shè)置,在保持4位數(shù)據(jù)總線輸入方式下設(shè)為兩行模式(輸入指令00101XXX)
MOV WCOMDATE,#28H;設(shè)成2行顯示
LCALL INPUTCOMMAND;輸入指令00101XXX
;第三步顯示開關(guān)設(shè)置
MOV WCOMDATE,#0CH;設(shè)成顯示開,而光標(biāo)開和光標(biāo)閃爍關(guān)
LCALL INPUTCOMMAND;輸入指令00001111
;第四步清屏
MOV WCOMDATE,#01H;
LCALL INPUTCOMMAND;輸入指令00000001
LCALL DELAY1MS;輸入功能設(shè)置指令需延遲1.53MS以上(除歸位指令和本指令執(zhí)行時(shí)間為1.53MS,其余指令執(zhí)行時(shí)間均不足0.1MS)
;第五步輸入模式設(shè)置
MOV WCOMDATE,#06H;
LCALL INPUTCOMMAND;輸入指令00000110
;- ------------------------------------------------------------------------------------------------------------------
;然后,將逆序顯示變更為正常顯示(即使用KS0074的鏡向功能)
;--------------------------------------------------------------------------------------------------------------------
;第一步,功能設(shè)置指令,使RE=1
MOV WCOMDATE,#2CH;
LCALL INPUTCOMMAND;輸入指令00101100
;第二步,輸入模式設(shè)置指令,使BID=1(逆序顯示)
MOV WCOMDATE,#07H;
LCALL INPUTCOMMAND;輸入指令00000111
;第三步,功能設(shè)置指令,使RE=0,以便后續(xù)應(yīng)用時(shí)可使用正常指令
MOV WCOMDATE,#28H;
LCALL INPUTCOMMAND;輸入指令00101000
;-----------------------------------------------------------------------------------------------------------------
;第一步,顯示第一行的固定字符(40H~4EH,起始位址40H),測試要求全部顯示出來
MOV WCOMDATE,#2CH;功能設(shè)置指令,使RE=1,以執(zhí)行擴(kuò)充命令
LCALL INPUTCOMMAND;輸入指令00101100
MOV WCOMDATE,#40H;設(shè)SEGRAM地址(格式為01XXABCD,起始地址為40H)
LCALL INPUTCOMMAND;輸入指令40H
;(1)顯示第一個(gè)段碼字符即信號強(qiáng)度標(biāo)志,默認(rèn)為不顯示
MOV WLCDDATe,#20H;40H控制第一個(gè)字符的大部分段碼位
LCALL INPUTDATACODE
MOV WLCDDATe,#20H;41H控制第一個(gè)字符中除40H控制段碼外的其它位
LCALL INPUTDATACODE
MOV WLCDDATe,#20H;42H無用
LCALL INPUTDATACODE
MOV WLCDDATe,#20H;43H無用
LCALL INPUTDATACODE
;(2)顯示第二個(gè)段碼字符即電量顯示符號,默認(rèn)顯示滿電量
MOV WLCDDATe,#0FFH;44H控制全部電量顯示段碼位,對應(yīng)關(guān)系應(yīng)進(jìn)一步測試
LCALL INPUTDATACODE
;(3)顯示第三個(gè)段碼字符主菜單標(biāo)志符,默認(rèn)顯示主菜單符號
MOV WLCDDATe,#20H;45H控制全部主菜單顯示段碼位
LCALL INPUTDATACODE
MOV WLCDDATe,#00H;46H無用
LCALL INPUTDATACODE
MOV WLCDDATe,#00H;47H無用
LCALL INPUTDATACODE
MOV WLCDDATe,#00H;48H無用
LCALL INPUTDATACODE
;(4)顯示第四個(gè)段碼字符即鬧鈴符號,默認(rèn)不顯示
MOV WLCDDATe,#20H;49H控制鬧鈴所有段碼位
LCALL INPUTDATACODE
MOV WLCDDATe,#20H;4A無用
LCALL INPUTDATACODE
;(5)顯示第五個(gè)段碼字符打開修箋(書本)符號,默認(rèn)不顯示
MOV WLCDDATe,#0FFH;4BH控制該符號全部段碼
LCALL INPUTDATACODE
MOV WLCDDATe,#20H;4CH無用
LCALL INPUTDATACODE
;(6)顯示第六個(gè)段碼字符,默認(rèn)顯示
MOV WLCDDATe,#20H;4DH控制該符號全部段碼
LCALL INPUTDATACODE
MOV WLCDDATe,#00H;4EH無用
LCALL INPUTDATACODE
;(7)顯示第七個(gè)段碼字符即接聽電話符號,默認(rèn)顯示
MOV WLCDDATe,#20H;55H控制該符號全部段碼
LCALL INPUTDATACODE
MOV WCOMDATE,#28H;功能設(shè)置指令,使RE=0,恢復(fù)正常命令狀態(tài)
LCALL INPUTCOMMAND
;輸入指令00101000
MOV WCOMDATE,#80H;設(shè)置DDRAM地址,該行起始80H
LCALL INPUTCOMMAND
MOV WLCDDATe,#"Q"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"Q"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#":"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"2"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"8"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"7"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"0"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"5"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"5"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"5"
LCALL INPUTDATACODE
LCALL DELAY100MS
MOV WLCDDATe,#"3"
LCALL INPUTDATACODE
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
MOV WCOMDATE,#01H;
LCALL INPUTCOMMAND;輸入指令00000001
MAIN:
MOV ADC_CONTOR,#11001001B ;開啟P1.1的AD轉(zhuǎn)換,電流
LCALL AD ;調(diào)用AD子程序
MOV A,ADC_RES
CJNE A,IH,MAINI
MOV A,ADC_RESL
CJNE A,IL,MAINI
MOV IJISHU,#00H
SJMP MAINI1
MAINI: INC IJISHU
MOV A,#20
CJNE A,IJISHU,MAINI1
MOV IJISHU,#00H
MOV IH,ADC_RES ;保存電流數(shù)據(jù)
MOV IL,ADC_RESL
MAINI1: MOV 0AH,IH
MOV 0BH,IL
LCALL TO10
MOV 0CH,18H
MOV 0DH,19H
MOV 0EH,1AH
MOV A,0AH
RRC A
MOV 0AH,A
MOV A,0BH
RRC A
MOV 0BH,A
MOV A,0AH
RRC A
MOV A,0BH
RRC A
MOV 09H,A ;09H保存8位電流數(shù)據(jù)
MOV ADC_CONTOR,#11001000B ;開啟P1.0的AD轉(zhuǎn)換 電壓
LCALL AD ;調(diào)用AD子程序
MOV A,ADC_RES
CJNE A,UH,MAINU
MOV A,ADC_RESL
CJNE A,UL,MAINU
MOV UJISHU,#00H
SJMP MAINU1
MAINU: INC UJISHU
MOV A,#20
CJNE A,UJISHU,MAINU1
MOV UJISHU,#00H
MOV UH,ADC_RES ;保存電壓數(shù)據(jù)
MOV UL,ADC_RESL
MAINU1: MOV 0AH,UH
MOV 0BH,UL
LCALL TO10
MOV 10H,18H
MOV 11H,19H
MOV 12H,1AH
MOV A,0AH
RRC A
MOV 0AH,A
MOV A,0BH
RRC A
MOV 0BH,A
MOV A,0AH
RRC A
MOV A,0BH
RRC A
MOV 08H,A ;08H保存8位電壓數(shù)據(jù)
MOV B,09H
MUL AB
MOV R2,B
MOV R3,A
MOV R4,#61H ;/25000
MOV R5,#0A8H
LCALL DIVD
MOV A,R7
ADD A,#30H
MOV 13H,A
MOV R4,#09H
MOV R5,#0C4H ;/2500
LCALL DIVD
MOV A,R7
ADD A,#30H
MOV 14H,A
MOV R4,#00H
MOV R5,#250 ;/250
LCALL DIVD
MOV A,R7
ADD A,#30H
MOV 15H,A
MOV R4,#00H
MOV R5,#25 ;/25
LCALL DIVD
MOV A,R7
ADD A,#30H
MOV 16H,A
MOV A,R3
CLR C
RLC A
CLR C
RLC A
MOV R3,A
MOV R5,#10
LCALL DIVD
MOV A,R7
ADD A,#30H
MOV 17H,A
LCALL XIANSHI
LJMP MAIN
;×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
;AD轉(zhuǎn)換子程序
;×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
AD: MOV A,ADC_CONTOR
JNB 0E4H,AD
CLR 0E4H
MOV ADC_CONTOR,A
;×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
;二-十進(jìn)制轉(zhuǎn)換子程序,同時(shí)加便宜量完成1602的0-9字模地址的轉(zhuǎn)換 輸出結(jié)果18H 19H 1AH
;×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
TO10: MOV R2,0AH
MOV R3,0BH
MOV R4,#0
MOV R5,#2
LCALL DIVD
MOV A,R6
MOV R2,A
MOV A,R7
MOV R3,A
MOV R4,#00H
MOV R5,#100
LCALL DIVD
MOV 18H,R7
MOV A,#30H
ADD A,18H
MOV 18H,A
MOV R5,#10
LCALL DIVD
MOV 19H,R7
MOV A,#30H
ADD A,19H
MOV 19H,A
MOV 1AH,R3
MOV A,#30H
ADD A,1AH
MOV 1AH,A
RET
;×××××××××××××××××××××××××××××××××××××××××××××××××××
;雙字節(jié)除法運(yùn)算子程序
;入口條件: 被除數(shù)在R2、R3、除數(shù)在R4、R5中,商在R6、R7中。R1用于計(jì)數(shù)位移量
;出口信息: 余數(shù)在R2、R3中,雙字節(jié)商在R4、R5中,OV=1 時(shí)溢出。
;影響資源: PSW、A、R1~R7
;××××××××××××××××××××××××××××××××××××××××××××××××××××××××
DIVD:PUSH PSW
PUSH ACC
MOV R1,#00H ;計(jì)數(shù)器清零
MOV R6,#00H
MOV R7,#00H
LCALL SUBBD ;判斷夠不夠減
JC DIVDE
DIVD1: MOV A,R4
JB ACC.7,DIVD3 ;判斷最高位是不是1
CLR C ;除數(shù)左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
INC R1 ;左移計(jì)數(shù)器計(jì)數(shù)
LCALL SUBBD ;比較左移后夠不夠減
JNC DIVD1 ;夠減轉(zhuǎn)移,不夠減繼續(xù)
LCALL DIVDR ;除數(shù)右移一位
DEC R1 ;右移了,所以要-1
DIVD3: CLR C
MOV A,R3 ;開始減法
SUBB A,R5
MOV R3,A
MOV A,R2
SUBB A,R4
MOV R2,A
INC R7
DIVD4: CJNE R1,#00H,DIVD5 ;判斷是不是到最后一位了
SJMP DIVDE
DIVD5: LCALL DIVDR ;除數(shù)右移一位
MOV A,R7
CLR C
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R1 ;位置計(jì)數(shù)器-1
LCALL SUBBD ;比較夠不夠減
JC DIVD4
SJMP DIVD3
SUBBD: CLR C ;判斷夠不夠減子程序
MOV A,R3
SUBB A,R5
MOV A,R2
SUBB A,R4
RET
DIVDR: CLR C
MOV A,R4
RRC A
MOV R4,A
MOV A,R5
RRC A
MOV R5,A
RET
DIVDE: SETB OV
POP ACC
POP PSW
RET
XIANSHI:
;第二步,在第二行(起始位址為80H)顯示“2013-05-15”
MOV WCOMDATE,#80H;設(shè)置DDRAM地址,該行起始80H
LCALL INPUTCOMMAND
MOV A,#30H
CJNE A,10H,DYXY
MOV WLCDDATe,#20H
SJMP DYXY1
DYXY: MOV WLCDDATe,10H ;電壓最高位顯示0時(shí)消隱
DYXY1: LCALL INPUTDATACODE
MOV WLCDDATe,11H
LCALL INPUTDATACODE
MOV WLCDDATe,#2EH
LCALL INPUTDATACODE
MOV WLCDDATe,12H
LCALL INPUTDATACODE
MOV WLCDDATe,#56H
LCALL INPUTDATACODE
MOV WLCDDATe,#20H ;功率部分(13H,14H,15H,16H,17H對應(yīng)功率的5個(gè)數(shù)值)
LCALL INPUTDATACODE ; MOV P
MOV WLCDDATe,#20H
LCALL INPUTDATACODE
MOV WLCDDATe,#20H
LCALL INPUTDATACODE
MOV WLCDDATe,#20H
LCALL INPUTDATACODE
MOV WLCDDATe,13H
LCALL INPUTDATACODE
MOV WLCDDATe,14H
LCALL INPUTDATACODE
MOV WLCDDATe,15H
LCALL INPUTDATACODE
MOV WLCDDATe,#2EH
LCALL INPUTDATACODE
MOV WLCDDATe,16H
LCALL INPUTDATACODE
MOV WLCDDATe,17H
LCALL INPUTDATACODE
MOV WLCDDATe,#57H
LCALL INPUTDATACODE
;第三步,在第三行
;電流部分(0CH,0DH,0EH對應(yīng)電流的3個(gè)數(shù)值)
MOV WCOMDATE,#90H;設(shè)置DDRAM地址
LCALL INPUTCOMMAND
MOV WLCDDATe,0CH
LCALL INPUTDATACODE
MOV WLCDDATe,#"."
LCALL INPUTDATACODE
MOV WLCDDATe,0DH
LCALL INPUTDATACODE
MOV WLCDDATe,0EH
LCALL INPUTDATACODE
MOV WLCDDATe,#"A"
LCALL INPUTDATACODE
RET
SJMP $
;讀BF并判斷狀態(tài)子程序
;直到LCD空閑時(shí)退出本程序
;------------------------------------------------------------------------------------------------------------------
READBFAC:
PUSH ACC
BFWAIT:
SETB DB4;將4位數(shù)據(jù)線設(shè)置到讀有效狀態(tài)
SETB DB5
SETB DB6
SETB DB7
CLR RS;設(shè)置成讀BF及AC值操作狀態(tài)
SETB RW
SETB E;第一次讀,使LCD將BF及AC值的高4位信息釋放到數(shù)據(jù)總線上。
MOV C,DB7
MOV ACC.7,C
CLR E;高半字節(jié)讀取完成
CLR RW
SETB DB4;將4位數(shù)據(jù)線設(shè)置到讀有效狀態(tài)
SETB DB5
SETB DB6
SETB DB7
SETB RW
SETB E;第二次讀,使LCD將BF及AC值的低4位信息釋放到數(shù)據(jù)總線上。
CLR E;第二次讀取完成
JB ACC.7,BFWAIT;LCD忙碌時(shí)繼續(xù)等待并監(jiān)控,空閑時(shí)執(zhí)行下面指令
POP ACC
RET
;-------------------------------------------------------------------------------------------------------------------
;輸入指令子程序INPUTCOMMAND
;擬寫指令代碼存放在WCOMDATE中
;-------------------------------------------------------------------------------------------------------------------
INPUTCOMMAND:
PUSH ACC
;首先,判斷LCD是否空閑并視具體情況處理
LCALL READBFAC
;然后,為寫指令代碼作好準(zhǔn)備
MOV A,WCOMDATE;將擬寫指令代碼取到A中
;再后,將擬寫指令代碼的高4位寫入LCD
CLR RS;設(shè)置成寫指令狀態(tài)
CLR RW
SETB E
MOV C,ACC.7;將高4位送出
MOV DB7,C
MOV C,ACC.6
MOV DB6,C
MOV C,ACC.5
MOV DB5,C
MOV C,ACC.4
MOV DB4,C
CLR E
SETB RW
CLR RW
;最后,將擬寫指令代碼的低4位寫入LCD
SETB E
MOV C,ACC.3;將低4位送出
MOV DB7,C
MOV C,ACC.2
MOV DB6,C
MOV C,ACC.1
MOV DB5,C
MOV C,ACC.0
MOV DB4,C
CLR E;E的下降沿執(zhí)行上述指令,將低4位寫入LCD
LCALL DELAY1ms
POP ACC
RET
;------------------------------------------------------------------------------------------------------------------
;寫顯示數(shù)據(jù)子程序INPUTDATACODE
;擬寫數(shù)據(jù)代碼存放在WLCDDATA中
;------------------------------------------------------------------------------------------------------------------
INPUTDATACODE:
PUSH ACC
;首先,判斷LCD是否空閑并視具體情況處理
LCALL READBFAC
;然后,為寫顯示數(shù)據(jù)作好準(zhǔn)備
MOV A,WLCDDATE;將擬寫顯示數(shù)據(jù)取到A中
;第三,將擬寫數(shù)據(jù)代碼的高4位寫入LCD的DDRAM
SETB RS;設(shè)置成寫顯示數(shù)據(jù)狀態(tài)
clr rw
setb E
MOV C,ACC.7;將高4位送出
MOV DB7,C
MOV C,ACC.6
MOV DB6,C
MOV C,ACC.5
MOV DB5,C
MOV C,ACC.4
MOV DB4,C
clr E
setb RW
CLR RW
;最后,將擬寫數(shù)據(jù)代碼的低4位寫入LCD的DDRAM
SETB E
MOV C,ACC.3;將低4位送出
MOV DB7,C
MOV C,ACC.2
MOV DB6,C
MOV C,ACC.1
MOV DB5,C
MOV C,ACC.0
MOV DB4,C
CLR E
LCALL DELAY1ms
POP ACC
RET
;---------------------------------------------------------------------------------------------------------------------
;延時(shí)子程序DELAY1MS:針對32MHZ晶振編程,延時(shí)不少1MS
DELAY1MS:
MOV r6,#22H
DELAY1ms1:MOV R7,#064H
DELAY1ms2: NOP
DJNZ R7,DELAY1ms2
DJNZ R6,DELAY1ms1
NOP
RET
DELAY100MS: ;@12.000MHz
PUSH 30H
PUSH 31H
PUSH 32H
MOV 30H,#4
MOV 31H,#166
MOV 32H,#206
NEXT:
DJNZ 32H,NEXT
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 32H
POP 31H
POP 30H
RET
;---------------------------------------------------------------------------------------------------------------------
END
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1