1602液晶初始化程序匯編_第1頁
1602液晶初始化程序匯編_第2頁
1602液晶初始化程序匯編_第3頁
1602液晶初始化程序匯編_第4頁
1602液晶初始化程序匯編_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、原創(chuàng) 1602 液晶初始化程序 (2007-12-22 18:10:40)標(biāo)簽:1602液晶it/ 科技匯編語言液晶初始化,顯示數(shù)字,按秒計(jì)數(shù)RS EQU P2.0RW EQU P2.1E EQU P2.2IN_0 EQU P0SECL EQU 40H; 秒低位SECH EQU 41H; 秒高位MH1 EQU 42H; 冒號(hào)MINL EQU 43H; 分低位MINH EQU 44H; 分高位MH2 EQU 45H; 冒號(hào)HOURL EQU 46H; 時(shí)低位HOURH EQU 47H; 時(shí)高位ORG 0000HAJMP STARTORG 000BHAJMP INTT_0START:MOV SP,

2、#70HMOV R2,#20ACALL INIT_LCDMOV R5,#00HMOV IN_0,#84HACALL ENABLEMOV TH0,#3fHMOV TL0,#0b0HMOV TMOD,#01HACALL SJCZSTART1:SETB EASETB ET0; 初始化液晶; 寫入顯示起始地址(第一行第五個(gè)位置;50MSSETB TR0LCALL WDATAAJMP START1 時(shí)間初值 *SJCZ: MOV 40H,#8顯示初值是 08:08:08MOV 41H,#0MOV 42H,#10MOV 43H,#8MOV 44H,#0MOV 45H,#10MOV 46H,#8MOV 47

3、H,#0RET ;*T0 定時(shí)器中斷 * INTT_0: PUSH ACCMOV R2,#20MOV HOURH,#0MOV TL0,#0b0H MOV TH0,#3fH DJNZ R2,TTINC SECL MOV A,SECL CJNE A,#0AH,TT INC SECH MOV SECL,#0 MOV A,SECH CJNE A,#06H,TT MOV SECH,#0 INC MINL MOV A,MINL CJNE A,#0AH,TT MOV MINL,#0 INC MINH MOV A,MINH CJNE A,#06H,TT MOV MINH,#0INC HOURL MOV A,H

4、OURL CJNE A,#04H,TT2 MOV A,HOURH CJNE A,#02H,TT1 MOV HOURL,#0AJMP TT; 送定時(shí)初值; 秒記數(shù),到 60S 就清 0; 分記數(shù),到 60 分請(qǐng) 0時(shí)記數(shù),到 24 時(shí)清 0TT2: CJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT1: MOV A,HOURLCJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT:POP ACCRETI; 寫入顯示起始地址(第;* 液晶初始化 *INIT_LCD:CALL DELAYL啟動(dòng)MOV IN_0,#01HACA

5、LL ENABLEMOV IN_0,#38H點(diǎn)陣ACALL ENABLEMOV IN_0,#0FH閃爍ACALL ENABLEMOV IN_0,#06HACALL ENABLEMOV IN_0,#0C0H 一個(gè)位置)ACALL ENABLERET;* 寫數(shù)據(jù)程序 *WDATA: MOV IN_0,#84H; 延時(shí) 20ms, 等待 LCD完成電源的; 清屏并光標(biāo)復(fù)位; 設(shè)置顯示模式 :8 位 2 行 5x7; 顯示器開、 光標(biāo)開、 光標(biāo)允許; 文字不動(dòng),光標(biāo)自動(dòng)右移; 寫入顯示起始地址(第二行第一行第五個(gè)位置ACALL ENABLEMOV R1,#8MOV R0,#47HWDATA1: MOV

6、 A,R0MOV DPTR,#TABLEMOVC A,A+DPTRMOV IN_0,ASETB RSCLR RWCLR EACALL CHECKBUSYSETB EDEC R0忙檢測寫入數(shù)據(jù)DJNZ R1,WDATA1MOV R1,#8RET顯示字母表 *TABLE:DB 30H,31H,32H,33H,34H,35H;0 1 2 3 4 5DB 36H,37H,38H,39H,3AH,80H,2EH;6 7 8 9 :空格 .寫指令 *ENABLE: CLR RS ; 寫入控制命令的子程序CLR RWCLR EACALL CHECKBUSYSETB ERET;* 程序忙檢測 *CHECKBU

7、SY:MOV IN_0,#0FFHCLR RS SETB RW CLR E NOP SETB EJB P0.7,CHECKBUSY 環(huán)等待RET; 判斷液晶顯示器是否忙的子程序; 如果 P1.7 為高電平表示忙就循延時(shí)程序 *DELAY:MOV R6,#50DEL: MOV R7,#48DJNZ R7,$DJNZ R6,DELRETDELAYL: MOV R7,#100; 長延時(shí) 20msD1: MOV R6,#98DJNZ R6,$ DJNZ R7,D1 RET END 51單片機(jī)的 1602沒做過,只做過其他的控制。做過 PIC,不過寫51的也不難, 熟悉一下指令集就行了, 思路都是一樣的

8、,大體上,單片機(jī)的任務(wù)就是把 AD 結(jié)果讀出來放到一個(gè)寄存器中,然后向 1602 中送 數(shù),時(shí)序是這樣:寫地址使能開 送地址數(shù) 寫地址使能關(guān) 寫數(shù)據(jù)使能開 送 AD 結(jié)果() 也就是數(shù)據(jù)) 寫數(shù)據(jù)使能關(guān), 破折號(hào)處需要加 3-5毫秒的延時(shí)。 具體 1602的寄存器地址和硬件的接 線形式在它的 PDF 上有,這個(gè)你得自己去查查,因?yàn)?1602有好幾種,地址有所差異。需要的話我看改 天給你調(diào)個(gè)程序上來。補(bǔ)充: 查表可以,用間接尋址還是很方便的。以前的思路也許可以給你參考一下,我當(dāng)時(shí)的做法是把轉(zhuǎn)換結(jié)果按 權(quán)值做除法,也就是比如 254 ,先除以 100得到 2,余數(shù)送臨時(shí)寄存器,再用余數(shù)除以 10,

9、得到5 ,還有余數(shù) 4,然后將這三個(gè)數(shù)分別送進(jìn) 1602 就行了。畢竟 1602 只是個(gè)字符屏,我覺得這種做法可取。這種做法做過 12864 顯示的三相表,用于顯示各種電力參數(shù)。不過遺憾的是 PIC 的中檔單片機(jī)沒有乘法器,所以連乘除 法指令都沒有,用累加的辦法非常慢,我用倍加的辦法寫了函數(shù)。好在它內(nèi)置AD,就當(dāng)時(shí)的應(yīng)用來講,精度還是可以滿足設(shè)計(jì)要求的。順便請(qǐng)教你的電壓基準(zhǔn)一般用什么芯片?我一直沒找到合適的,好的都太貴 也沒必要。補(bǔ)充:用除法沒問題,我就這么做的,當(dāng)時(shí)用的是PIC16F877A ,它沒有除法,要是用 51 就方便了,一個(gè) DIV 就解決了而且還快。補(bǔ)充:好的。稍等一會(huì)。我寫寫。

10、補(bǔ)充: ;P1口為數(shù)據(jù) ;P2.0 為 RS ;P2.1 為 RW ;P2.2 為 E ;P0為 AD 轉(zhuǎn)換結(jié)果輸入 ;P3.1 為 AD 使能位,假設(shè)高電平有效 ;P3.2 為 AD 等待,假設(shè)低電平為等待結(jié)束res100 equ 0x20 ; 百位結(jié)果 res10 equ 0x21 ; 十位結(jié)果 res1 equ 0x22 ; 個(gè)位結(jié)果org 0x00nopnop ajmp main; 主程序 ;main:lcall initial mainloop:lcall ADconvert mov B,#0x64 div AB lcall data_convert mov res100,A ; 得

11、到百位 mov A,B mov B,#0x0a div AB lcall data_convert mov res10,A ; 得到十位 mov A,B lcall data_convert mov res1,A ; 得到個(gè)位 lcall data_w ; 寫電壓數(shù)值 lcall delay1s ajmp mainloop; 數(shù)據(jù)轉(zhuǎn)換 ; data_convert:add A,#0x30 ret; 寫數(shù)據(jù) ; data_w:mov P1,#0x8a lcall enable_w mov A,res100 mov P1,Alcall enable_data ; 寫百位數(shù) mov P1,#0x8b

12、 lcall enable_w mov A,res10 mov P1,Alcall enable_data ; 寫十位數(shù) mov P1,#0x8c lcall enable_w mov A,res1 mov P1,Alcall enable_data ; 寫個(gè)位數(shù) ret;AD 轉(zhuǎn)換 ; ADconvert:setb P3.1wait:mov A,P3 ; 使能 AD 轉(zhuǎn)換 anl A,#00000100b ; 等待 AD 轉(zhuǎn)換結(jié)束 jnz wait ; 否則繼續(xù)等待 mov A,P0 ; 存放轉(zhuǎn)換結(jié)果 ret; 初始化 ;initial:mov P0,#00000000bnopmov P1,

13、#00000000bnopmov P2,#00000000bnopmov P3,#00000000bnoplcall initial_lcdret; 液晶初始化 ; 第一行顯示 Voltage: V; 第二行顯示 Current: A initial_lcd:lcall delay15ms mov P1,#0x38 lcall delay5ms mov P1,#0x38 lcall delay5ms mov P1,#0x38lcall delay15msmov P1,#0x38 ; 顯示模式設(shè)置為 16 字*2 行 lcall enable_wmov P1,#0x0c ; 不顯示光標(biāo)lcall

14、 enable_wmov P1,#0x06 ; 顯示方向正向且屏不移動(dòng) lcall enable_wmov P1,#0x01 ; 清屏lcall enable_w mov P1,#0x82 ; 第一行第三字 lcall enable_w mov P1,#0x56lcall enable_data ;V mov P1,#0x83 lcall enable_w mov P1,#0x6flcall enable_data ;omov P1,#0x84 lcall enable_w mov P1,#0x6c lcall enable_data ;lmov P1,#0x85lcall enable_wm

15、ov P1,#0x74lcall enable_data ;tmov P1,#0x86lcall enable_wmov P1,#0x61lcall enable_data ;amov P1,#0x87lcall enable_wmov P1,#0x67lcall enable_data ;gmov P1,#0x88lcall enable_wmov P1,#0x65lcall enable_data ;emov P1,#0x89lcall enable_wmov P1,#0x3alcall enable_data ;:mov P1,#0x8dlcall enable_wmov P1,#0x5

16、6lcall enable_data ;Vmov P1,#0xc2 ; 第二行第三字 lcall enable_w mov P1,#0x43 lcall enable_data ;Cmov P1,#0xc3lcall enable_wmov P1,#0x75lcall enable_data ;umov P1,#0xc4lcall enable_wmov P1,#0x72lcall enable_data ;rmov P1,#0xc5lcall enable_wmov P1,#0x72 lcall enable_data ;r mov P1,#0xc6 lcall enable_w mov P

17、1,#0x65 lcall enable_data ;e mov P1,#0xc7 lcall enable_w mov P1,#0x6e lcall enable_data ;n mov P1,#0xc8 lcall enable_w mov P1,#0x74 lcall enable_data ;t mov P1,#0xc9 lcall enable_w mov P1,#0x3a lcall enable_data ;: mov P1,#0xcd lcall enable_w mov P1,#0x41 lcall enable_data ;A ret; 寫地址使能 ; enable_w:m

18、ov P2,#00000000b lcall judgement setb P2.2 ret; 寫數(shù)據(jù)使能 ; enable_data:setb P2.0 clr P2.1 clr P2.2 lcall judgement setb P2.2 ret; 判忙 ; judgement:mov P1,#0xff clr P2.0 setb P2.1 clr P2.2 nop nopnopsetb P2.2jb P1.7,judgement ret; 延時(shí) 5毫秒 ; delay5ms:mov R6,#0x32delaymark:mov R7,#0x28djnz R7,$djnz R6,delaym

19、ark ret; 延時(shí) 15毫秒 ; delay15ms:mov R7,#0x64 delaylongmark:mov R6,#0x3cdjnz R6,$djnz R7,delaylongmark ret; 延時(shí) 1 秒; delay1s:mov R7,#0x64delaylongmark2:mov R6,#0x3cdjnz R6,$djnz R7,delaylongmark2 retend 這個(gè)程序我編譯過了沒有問題,不過硬件電路我還沒來得及試,現(xiàn)學(xué)現(xiàn)賣哈,上班還是有點(diǎn)忙的,讓你久 等啦。程序?qū)崿F(xiàn)的是:第一行: Voltage : V ,Voltage 前和 V 后面有兩個(gè)空格,也就是居中,

20、第二行是: Current : A ,格式也一樣也是居中,不過電流的我沒有給你寫,因?yàn)閷懫饋硪惨粯?,送?shù)操作都是一樣的 無非地址不一樣。 另外我沒用過 ADC0809 ,所以啟動(dòng) AD轉(zhuǎn)換的思路上我是參照 PIC的內(nèi)部 AD 轉(zhuǎn)換來的, 大體上是這樣: 使能 AD 轉(zhuǎn)換,判斷并等待 AD轉(zhuǎn)換結(jié)束, 取轉(zhuǎn)換結(jié)果并讀入保存。 如果0809只是一路 AD, 那么你可以再添加一片做雙路,這樣就可以同時(shí)檢測電流了。除法的個(gè)十百位結(jié)果我做了一下處理,直接 在真值上加了 30H ,這樣就可以直接當(dāng)作數(shù)據(jù)送入液晶,不必查表,其實(shí)那個(gè)小小的子程序只有一行,直 接寫進(jìn)主循環(huán)會(huì)更快, 畢竟 lcall 需要兩個(gè)機(jī)器

21、周期。 不過這樣看起來層次性好點(diǎn)。 請(qǐng)指教, 希望多多交流。 補(bǔ)充: 汗最后這個(gè)延時(shí) 1S 子程序里面的值我忘記改了,當(dāng)時(shí)直接復(fù)制的延時(shí)15毫秒的,你改改吧,否則理論上刷新會(huì)很快。事實(shí)上我估計(jì)得再加兩層延時(shí)才能到秒級(jí)。不好意思哈10單片機(jī)的 ADC0832 數(shù)字 LCD1602 電壓表程序SET_LCD:CLR LCD_ENCALL INIT_LCD ; 初始化 LCDCALL DELAY1MOV DPTR,#INFO1 ; 指針指到顯示信息 1MOV A,#1 ; 顯示在第一行CALL LCD_SHOWMOV DPTR,#INFO2 ; 指針指到顯示信息 2MOV A,#2 ; 顯示在第二行

22、CALL LCD_SHOWRETINFO1: DB DIGITALVOLTMETER,0 ;LCD 第一行顯示信息INFO2: DB VOLTAGE: V ,0 ;LCD第二行顯示信息; LCD 接口初始化INIT_LCD:MOV A,#38H ; 雙列顯示,字形 5*7 點(diǎn)陣CALL WCOMCALL DELAY1MOV A,#38H ; 雙列顯示,字形 5*7 點(diǎn)陣CALL WCOMCALL DELAY1MOV A,#38H ; 雙列顯示,字形 5*7 點(diǎn)陣CALL WCOMCALL DELAY1MOV A,#0CH ; 開顯示,關(guān)光標(biāo),CALL WCOMCALL DELAY1MOV A,

23、#01H ; 清除 LCD 顯示屏CALL WCOMCALL DELAY1RETDELAY1: ; 延時(shí) 5MSMOV R6,#25DEL1: MOV R7,#100DJNZ R7,$DJNZ R6,DEL1RET11; 在 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 FILLLINE2: MOV

24、A,#0C0H ; 設(shè)置 LCD 的第二行地址CALL WCOM ; 寫入命令CALL CLR_LINE ; 清除該行字符數(shù)據(jù)MOV A,#0C0H ; 設(shè)置 LCD 的第二行地址CALL WCOMFILL: CLR A ; 填入字符MOVC A,A+DPTR ; 由消息區(qū)取出字符CJNE A,#0,LC1 ; 判斷是否為結(jié)束碼RETLC1: CALL WDATA ; 寫入數(shù)據(jù)INC DPTR ; 指針加 1JMP FILL ; 繼續(xù)填入字符RETCLR_LINE: ; 清除該行 LCD 的字符MOV R0,#24CL1: MOV A,# CALL WDATADJNZ R0,CL1RET ;

25、寫指令使能子程序;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 RET12;寫數(shù)據(jù)使能子程序;RS=H,RW=L,D0-D7= 數(shù)據(jù), E= 高脈沖WDATA:MOV P0,ASETB LCD_RSCLR LCD_RWSETB LCD_ENCALL DELAY0CLR LCD_ENRETDELAY0: MOV R7,#250 ; 延時(shí) 500微秒 DJNZ R7,$RET ;在 LCD 第二行指定位置顯示字符 ;(A)=ASCII 數(shù)據(jù) , (

26、B)=位置變量LCDP2:PUSH ACC ; 入棧保護(hù) AMOV A,B ; 設(shè)置顯示地址ADD A,#0C0H ; 設(shè)置 LCD 的第二行地址CALL WCOM ; 寫入命令POP ACC ; 由堆棧取出 ACALL 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_XCALL LCDP2 ; 顯示小數(shù)點(diǎn)MOV A,R5 ; 加載數(shù)據(jù)INC LCD_X ; 設(shè)置位置CA

27、LL SHOW_DIG2B ; 顯示數(shù)據(jù) RET ;整數(shù)部分轉(zhuǎn)換為 ASCII 碼,送顯示 ;只顯示一位數(shù)13SHOW_DIG2A:MOV B,#16DIV ABMOV 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,#16DIV ABADD A,#30H ; 轉(zhuǎn)換為 ASCII 碼PUSH BMOV B,LCD_X ; 地址變量送 BCALL LCDP2 ; 送顯示POP BMOV A,B

28、ADD A,#30H ; 轉(zhuǎn)換為 ASCII 碼INC LCD_XMOV B,LCD_X ; 地址變量送 BCALL LCDP2 ; 送顯示RET ;AD0832 初始化與 AD 轉(zhuǎn)換子程序;(A) AD 轉(zhuǎn)換值A(chǔ)D_CONV:SETB AD_CS ; 一個(gè)轉(zhuǎn)換周期開始CLR AD_CLKCLR AD_CS ;CS 置 0,片選有效SETB AD_DAT ;DI 置 1,起始位NOPSETB AD_CLK ; 第一個(gè)脈沖CLR AD_DAT ; 在負(fù)跳變之前加一個(gè) DI 反轉(zhuǎn)操作CLR AD_CLKSETB AD_DAT ;DI 置 1,設(shè)為單通道NOPSETB AD_CLK ; 第二個(gè)脈沖CLR AD_DAT14CLR AD_CLKCLR A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論