單片機控制KS0074實現電壓表,電流表功能的源碼如下:
- ;引腳為:1VCC,2VCC,3GND,4BLA,5DB7,6DB6,7DB5,8DB4,9E,10RW,11RS,12V0,13GND,14GND,15VCC.實際上,可任用其中一個VCC引腳和一個GND引腳。
- ;KS0074有8線并行、4線并行和2線串行輸入方式,但set1602默認的輸入方式為4數據總線并行輸入方式
- ;V0引腳應通過串接800歐左右電阻后接VCC(5V)。或者,在VCC和GND之間串接一個5~10可調電位器,滑動端接V0,利用調節滑動端控制LCD顯示對比度。
- ;BLA輸入電壓應為3.3V,可通過串接合適電阻后接VCC(5V),避免高溫燒壞LCD。
- ;---------------------------------------------------------------------------------------------------------------------
- ;以下為硬件連接要求
- 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相關指令信息的暫存單元
- WCOMdate equ 71H;作為擬寫入指令代碼的暫存單元
- RLCDDATE Equ 72H;作為讀取LCD相關顯示代碼或信息的暫存單元
- WLCDDATe EQU 73H;作為擬寫入LCD顯示信息的暫存單元
- ;-------------------------------------------------------------------------------------------------------
- P1ASF EQU 9DH ;P1口設置寄存器
- ADC_CONTOR EQU 0BCH ;ADC控制寄存器
- ADC_RES EQU 0BDH ;ADC輸出高8位
- ADC_RESL EQU 0BEH ;ADC低8為輸出
- AUXR1 EQU 0A2H ;設置寄存器
- IJISHU EQU 30H ;電流比較次數計數
- UJISHU EQU 31H ;電壓比較次數計數
- 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 ;設置AD輸出方式
- MOV SP,#5FH ;設置棧底
- MOV IJISHU,#00H
- MOV UJISHU,#00H
- ;×××××××××××××××××××××××××
- LCD:
- MOV SP,#80H
- ;------------------------- -------------------------------------------------------------
- ;首先,開機或復位后,應進行4數據總線和LCD初始化,將默認的8位數據接口改為4位。
- ;---------------------------------------------------------------------------------------------------------------------
- ;開機或復位后,至少應等待20MS以上
- LCALL Delay1MS
- LCALL Delay1MS
- ;第一步功能設置,設為4位數據總線方式輸入(DL=0)
- MOV WCOMDATE,#20H
- LCALL INPUTCOMMAND;輸入指令0010XXXX(低四位忽略)
- ;第二步功能設置,在保持4位數據總線輸入方式下設為兩行模式(輸入指令00101XXX)
- MOV WCOMDATE,#28H;設成2行顯示
- LCALL INPUTCOMMAND;輸入指令00101XXX
- ;第三步顯示開關設置
- MOV WCOMDATE,#0CH;設成顯示開,而光標開和光標閃爍關
- LCALL INPUTCOMMAND;輸入指令00001111
- ;第四步清屏
- MOV WCOMDATE,#01H;
- LCALL INPUTCOMMAND;輸入指令00000001
- LCALL DELAY1MS;輸入功能設置指令需延遲1.53MS以上(除歸位指令和本指令執行時間為1.53MS,其余指令執行時間均不足0.1MS)
- ;第五步輸入模式設置
- MOV WCOMDATE,#06H;
- LCALL INPUTCOMMAND;輸入指令00000110
- ;- ------------------------------------------------------------------------------------------------------------------
- ;然后,將逆序顯示變更為正常顯示(即使用KS0074的鏡向功能)
- ;--------------------------------------------------------------------------------------------------------------------
- ;第一步,功能設置指令,使RE=1
- MOV WCOMDATE,#2CH;
- LCALL INPUTCOMMAND;輸入指令00101100
- ;第二步,輸入模式設置指令,使BID=1(逆序顯示)
- MOV WCOMDATE,#07H;
- LCALL INPUTCOMMAND;輸入指令00000111
- ;第三步,功能設置指令,使RE=0,以便后續應用時可使用正常指令
- MOV WCOMDATE,#28H;
- LCALL INPUTCOMMAND;輸入指令00101000
- ;-----------------------------------------------------------------------------------------------------------------
- ;第一步,顯示第一行的固定字符(40H~4EH,起始位址40H),測試要求全部顯示出來
- MOV WCOMDATE,#2CH;功能設置指令,使RE=1,以執行擴充命令
- LCALL INPUTCOMMAND;輸入指令00101100
- MOV WCOMDATE,#40H;設SEGRAM地址(格式為01XXABCD,起始地址為40H)
- LCALL INPUTCOMMAND;輸入指令40H
- ;(1)顯示第一個段碼字符即信號強度標志,默認為不顯示
- MOV WLCDDATe,#20H;40H控制第一個字符的大部分段碼位
- LCALL INPUTDATACODE
- MOV WLCDDATe,#20H;41H控制第一個字符中除40H控制段碼外的其它位
- LCALL INPUTDATACODE
- MOV WLCDDATe,#20H;42H無用
- LCALL INPUTDATACODE
- MOV WLCDDATe,#20H;43H無用
- LCALL INPUTDATACODE
- ;(2)顯示第二個段碼字符即電量顯示符號,默認顯示滿電量
- MOV WLCDDATe,#0FFH;44H控制全部電量顯示段碼位,對應關系應進一步測試
- LCALL INPUTDATACODE
- ;(3)顯示第三個段碼字符主菜單標志符,默認顯示主菜單符號
- 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)顯示第四個段碼字符即鬧鈴符號,默認不顯示
- MOV WLCDDATe,#20H;49H控制鬧鈴所有段碼位
- LCALL INPUTDATACODE
- MOV WLCDDATe,#20H;4A無用
- LCALL INPUTDATACODE
- ;(5)顯示第五個段碼字符打開修箋(書本)符號,默認不顯示
- MOV WLCDDATe,#0FFH;4BH控制該符號全部段碼
- LCALL INPUTDATACODE
- MOV WLCDDATe,#20H;4CH無用
- LCALL INPUTDATACODE
- ;(6)顯示第六個段碼字符,默認顯示
- MOV WLCDDATe,#20H;4DH控制該符號全部段碼
- LCALL INPUTDATACODE
- MOV WLCDDATe,#00H;4EH無用
- LCALL INPUTDATACODE
- ;(7)顯示第七個段碼字符即接聽電話符號,默認顯示
- MOV WLCDDATe,#20H;55H控制該符號全部段碼
- LCALL INPUTDATACODE
- MOV WCOMDATE,#28H;功能設置指令,使RE=0,恢復正常命令狀態
- LCALL INPUTCOMMAND
- ;輸入指令00101000
- MOV WCOMDATE,#80H;設置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轉換,電流
- LCALL AD ;調用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 ;保存電流數據
- 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位電流數據
- MOV ADC_CONTOR,#11001000B ;開啟P1.0的AD轉換 電壓
- LCALL AD ;調用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 ;保存電壓數據
- 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位電壓數據
- 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轉換子程序
- ;×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
- AD: MOV A,ADC_CONTOR
- JNB 0E4H,AD
- CLR 0E4H
- MOV ADC_CONTOR,A
- ;×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
- ;二-十進制轉換子程序,同時加便宜量完成1602的0-9字模地址的轉換 輸出結果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
- ;×××××××××××××××××××××××××××××××××××××××××××××××××××
- ;雙字節除法運算子程序
- ;入口條件: 被除數在R2、R3、除數在R4、R5中,商在R6、R7中。R1用于計數位移量
- ;出口信息: 余數在R2、R3中,雙字節商在R4、R5中,OV=1 時溢出。
- ;影響資源: PSW、A、R1~R7
- ;××××××××××××××××××××××××××××××××××××××××××××××××××××××××
- DIVD:PUSH PSW
- PUSH ACC
- MOV R1,#00H ;計數器清零
- MOV R6,#00H
- MOV R7,#00H
- LCALL SUBBD ;判斷夠不夠減
- JC DIVDE
- DIVD1: MOV A,R4
- JB ACC.7,DIVD3 ;判斷最高位是不是1
- CLR C ;除數左移一位
- MOV A,R5
- RLC A
- MOV R5,A
- MOV A,R4
- RLC A
- MOV R4,A
- INC R1 ;左移計數器計數
- LCALL SUBBD ;比較左移后夠不夠減
- JNC DIVD1 ;夠減轉移,不夠減繼續
- LCALL DIVDR ;除數右移一位
- 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 ;除數右移一位
- MOV A,R7
- CLR C
- RLC A
- MOV R7,A
- MOV A,R6
- RLC A
- MOV R6,A
- DEC R1 ;位置計數器-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;設置DDRAM地址,該行起始80H
- LCALL INPUTCOMMAND
- MOV A,#30H
- CJNE A,10H,DYXY
- MOV WLCDDATe,#20H
- SJMP DYXY1
- DYXY: MOV WLCDDATe,10H ;電壓最高位顯示0時消隱
- 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對應功率的5個數值)
- 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對應電流的3個數值)
- MOV WCOMDATE,#90H;設置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并判斷狀態子程序
- ;直到LCD空閑時退出本程序
- ;------------------------------------------------------------------------------------------------------------------
- READBFAC:
- PUSH ACC
- BFWAIT:
- SETB DB4;將4位數據線設置到讀有效狀態
- SETB DB5
- SETB DB6
- SETB DB7
- CLR RS;設置成讀BF及AC值操作狀態
- SETB RW
- SETB E;第一次讀,使LCD將BF及AC值的高4位信息釋放到數據總線上。
- MOV C,DB7
- MOV ACC.7,C
- CLR E;高半字節讀取完成
- CLR RW
- SETB DB4;將4位數據線設置到讀有效狀態
- SETB DB5
- SETB DB6
- SETB DB7
- SETB RW
- SETB E;第二次讀,使LCD將BF及AC值的低4位信息釋放到數據總線上。
- CLR E;第二次讀取完成
- JB ACC.7,BFWAIT;LCD忙碌時繼續等待并監控,空閑時執行下面指令
- POP ACC
- RET
- ;-------------------------------------------------------------------------------------------------------------------
- ;輸入指令子程序INPUTCOMMAND
- ;擬寫指令代碼存放在WCOMDATE中
- ;-------------------------------------------------------------------------------------------------------------------
- INPUTCOMMAND:
- PUSH ACC
- ;首先,判斷LCD是否空閑并視具體情況處理
- LCALL READBFAC
- ;然后,為寫指令代碼作好準備
- MOV A,WCOMDATE;將擬寫指令代碼取到A中
- ;再后,將擬寫指令代碼的高4位寫入LCD
- CLR RS;設置成寫指令狀態
- 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的下降沿執行上述指令,將低4位寫入LCD
- LCALL DELAY1ms
- POP ACC
- RET
- ;------------------------------------------------------------------------------------------------------------------
- ;寫顯示數據子程序INPUTDATACODE
- ;擬寫數據代碼存放在WLCDDATA中
- ;------------------------------------------------------------------------------------------------------------------
- INPUTDATACODE:
- PUSH ACC
- ;首先,判斷LCD是否空閑并視具體情況處理
- LCALL READBFAC
- ;然后,為寫顯示數據作好準備
- MOV A,WLCDDATE;將擬寫顯示數據取到A中
- ;第三,將擬寫數據代碼的高4位寫入LCD的DDRAM
- SETB RS;設置成寫顯示數據狀態
- 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的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
- ;---------------------------------------------------------------------------------------------------------------------
- ;延時子程序DELAY1MS:針對32MHZ晶振編程,延時不少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
復制代碼
|