專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)
深圳市英銳恩科技有限公司(m.nkfboao.cn)為單片機(jī)技術(shù)服務(wù)\開(kāi)發(fā)設(shè)計(jì)和產(chǎn)品代理商,授權(quán)MDT(麥肯 MICON)單片機(jī)A級(jí)代理商,MICROCHIP產(chǎn)品全系列單片機(jī)與模擬器件授權(quán)推廣商。同時(shí)A級(jí)代理分銷NOVACAP、Syfer、Voltronics精密可調(diào)電容、DLI寬帶隔直微波電容,專注分銷AIC沛亨半導(dǎo)體(電源管理IC)、IR(場(chǎng)效應(yīng)管)。
如:
MDT10P53(完全兼容PIC12C508A、PIC12C509A,PIC12F508、PIC12F509,直接替換,不要任何硬軟與軟件修改)
特性:ROM:1K,腳位:8PIN,I/O:6PIN,內(nèi)置振蕩4M,復(fù)位時(shí)間極快.2V,低電壓工作.低功耗,溫度范圍寬。
MDT10P55(完全兼容PIC16C505、PIC16F505,媲美EMC78P156,直接替換,不要任何硬軟與軟件修改)
特性:ROM:1K,腳位:14PIN,I/O:12PIN,內(nèi)置振蕩4M,復(fù)位時(shí)間極快.2V,低電壓工作.低功耗,溫度范圍寬。
菜鳥(niǎo)學(xué)PIC單片機(jī)(一):TS1620字符型液晶模塊驅(qū)動(dòng)程序編寫苦與樂(lè)
小弟學(xué)習(xí)PIC16F87X系列單片機(jī)已持續(xù)半個(gè)月了,遇到的困難還是比較多的,幸好單位的圖書館里還有一些相關(guān)的書籍,加之購(gòu)買了第三方的ICD,因此學(xué)習(xí)起來(lái)還是比較充實(shí)的。
雖說(shuō)如此,但在單位里找不到志同道合者一起來(lái)琢磨她,不過(guò)這里卻有許多熱心的站友。
今后,小弟打算將自己的一些學(xué)習(xí)心得和疑問(wèn)寫出來(lái),與論壇里和我一樣的初學(xué)者一起進(jìn)步,并殷切希望能得到前輩的指點(diǎn),
小弟寫的第一個(gè)程序是控制三位八段數(shù)碼管的顯示,還沒(méi)來(lái)得及總結(jié),今天下午調(diào)試和總結(jié)了一下LCD的驅(qū)動(dòng)程序,遇到了很多困難,但也有點(diǎn)小小的收獲,拿出來(lái)晾晾,大家盡管扔磚,小弟開(kāi)卡車兜著...
TS1620字符型液晶模塊驅(qū)動(dòng)程序編寫苦樂(lè)
該LCM的控制器為HD47780,其引腳功能如下:
Pin 1 2 3 4 5 6 7~17 15 16
功能 GND VDD VO RS RW E DB0~7 BL+ BL-
說(shuō)明:
RS:數(shù)據(jù)/命令選擇,用來(lái)選擇DB0~7輸入的是顯示數(shù)據(jù)還是控制字信息,(H/L)
RW:讀寫選擇,(H/L),在延遲時(shí)間足夠的情況下,一般不用讀LCM忙信號(hào),常接地。
E: 使能端,控制DB0~7的數(shù)據(jù)/命令的寫入或者讀取,上升或下降沿有效。
VO:LCD偏壓信號(hào),用來(lái)對(duì)調(diào)整對(duì)比度,一般接10K電位器/電阻到地。
DB0~7:數(shù)據(jù)I/O,可選擇8位數(shù)據(jù)或者4位數(shù)據(jù)(分兩次傳輸)。
BL+:背光電源正輸入 +5V DV。
BL-:背光電源地。
VDD:電源正 +5V DC。
GND:電源地。
編寫驅(qū)動(dòng):
流程:
上電LCM自動(dòng)復(fù)位—清屏—設(shè)置顯示模式—開(kāi)顯示和光標(biāo)設(shè)置—設(shè)置顯示的起始位置—顯示字符ASCII碼輸入顯示。
注意事項(xiàng):
1. LCM屬于慢顯示器件,其上電后復(fù)位的時(shí)間比較長(zhǎng),因此,可在系統(tǒng)初始化過(guò)程中最后初始化LCM;或者在初始化之前調(diào)用20~50ms的延遲子程序。并且,如果系統(tǒng)不需要通過(guò)延遲來(lái)等待LCM完成每一個(gè)操作的話,那么應(yīng)檢測(cè)(讀)LCM忙標(biāo)志,若不忙(該標(biāo)志為低電平),那么指令能得到執(zhí)行,否則指令失效。
2. 由于E輸入的使能是上升沿有效還是下降沿有效存在爭(zhēng)議,該問(wèn)題在調(diào)試中將遇到,還沒(méi)來(lái)得及分析,愿意與大家一起分析。
3. 有時(shí)候LCM所顯示的結(jié)果并不遵循我們?cè)瓉?lái)的意愿,此時(shí),需先檢查程序中,初始化功能是否完成,尤其是在不檢測(cè)忙標(biāo)志的初始化程序中更要注意,可適當(dāng)延長(zhǎng)延遲時(shí)間或者重復(fù)初始化指令,另外,也要檢查硬件連線是否有錯(cuò)。
4. 如果與LCM的引腳相連的端口,需注意該端口是否為普通數(shù)字端口,比如本例程中,RA口應(yīng)先設(shè)置成普通數(shù)字端口。起初我沒(méi)有如此設(shè)置,結(jié)果軟件仿真模式下始終發(fā)現(xiàn)對(duì)RA口的操作均不能從SFR觀察窗口中發(fā)現(xiàn)任何變化...
5. 由于我所用的demo板電路圖上,其LCM模塊是由RA和RC來(lái)控制的,因此,為了能觀察運(yùn)行結(jié)果,程序中依然采用RA和RC來(lái)控制LCM。
下面給出一個(gè)例程,該例程在小弟用的仿真器和demo板上通過(guò),同時(shí)給出調(diào)試現(xiàn)象:
1)關(guān)于E的使能的問(wèn)題,如果對(duì)LCM 的E輸入腳進(jìn)行復(fù)位置位(先復(fù)位或先置位結(jié)果均一樣)操作時(shí)中間的延時(shí)過(guò)短或者過(guò)長(zhǎng)的話,均會(huì)出現(xiàn)一些問(wèn)題:
過(guò)短:5ms,運(yùn)行正常,但在debug中復(fù)位后,會(huì)有部分字符殘留
特短:3個(gè)nop指令,運(yùn)行后無(wú)任何輸出
較長(zhǎng):200ms,運(yùn)行正常,但debug復(fù)位后,所有字符均殘留
一般:50ms,顯示正常,復(fù)位后無(wú)字符殘留
前輩們能分析一下么?
2)由于采用的顯示模式是16字x2行,發(fā)現(xiàn),如果字符表_table1或者_(dá)table2中,偽指令dt定義的字符個(gè)數(shù)如果小于16的話,那么在該行字符的末尾會(huì)出現(xiàn)一些其他的字符,小弟這里出現(xiàn)的是 “||”,后用空格填充至16字符具體原因愿意與大家一起分析。
3) 該程序采用ICD模式調(diào)試燒寫,運(yùn)行正常之后,小弟打算脫機(jī)運(yùn)行,即不燒入調(diào)試代碼,但燒寫過(guò)程老是停在 programming ID處,取消ID燒入,那么燒寫過(guò)程就停在programming program,并且,ICD 就出現(xiàn) 連接錯(cuò)誤的提示,需重新更改ICD模式至SIM模式下,此時(shí)發(fā)現(xiàn)ICD的連接指示燈不再閃爍,連接正常了。
(可能問(wèn)題描述得不夠準(zhǔn)確,下次再重現(xiàn)故障,詳細(xì)說(shuō)明...)
4) 另外一個(gè)有趣的問(wèn)題是,PIC16系列的指令系統(tǒng)中應(yīng)該沒(méi)有movfw這一指令,但是,在mplab中,卻發(fā)現(xiàn),諸如movfw value ;(value為一自定義的寄存器變量)卻能通過(guò)編譯,而且,功能似乎等同 movf value,W 小弟感到納悶(小弟用的是mplab 5.7full版,該第三方的ICD能直接使用在該版本下..
請(qǐng)前輩指點(diǎn),如果能談?wù)勛约哼@些年來(lái)學(xué)習(xí)PIC單片機(jī)所走過(guò)的路就更好了:)
;****************************************************
list p=16f877
#include
;定義保護(hù)現(xiàn)場(chǎng)用寄存器
w_temp EQU 0x71
status_temp EQU 0x72
pclath_temp EQU 0x73
;定義主程序用寄存器
count EQU 0x74 ; 定義計(jì)數(shù)寄存器地址
tmp1 EQU 0x75 ; 定義臨時(shí)寄存器地址
x EQU 0x76 ; 延時(shí)子程序外循環(huán)計(jì)數(shù)器
y EQU 0x77 ; 延時(shí)子程序內(nèi)循環(huán)計(jì)數(shù)器
;定義LCM控制位常量
RS EQU 1 ; LCD寄存器選擇信號(hào)腳定義在RA.1腳
RW EQU 2 ; LCD讀/寫信號(hào)腳定義在RA.2腳
E EQU 3 ; LCD片選信號(hào)腳定義在RA.3腳
;***該段e文注釋的程序?yàn)槟0鍍?nèi)容
org 0x000 ; processor reset vector
nop ; nop required for icd
goto main ; go to beginning of program
org 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;******************************
main
bsf STATUS,RP0
movlw 07H
movwf ADCON1 ;設(shè)置RA口全部為普通數(shù)字IO口
clrf TRISA
clrf TRISC ; 定義RA口,RC口全部為輸出
bcf STATUS,RP0
call _delay ;調(diào)用廷時(shí),剛上電LCD復(fù)位不一定有PIC快
movlw 01H
movwf PORTC ; 清屏
call _enable
movlw 38H
movwf PORTC ; 8位數(shù)據(jù),16字x2行,5x7點(diǎn)陣
call _enable
movlw 0CH ; 顯示器開(kāi)、光標(biāo)不閃
movwf PORTC
call _enable
movlw 06H ; 文字不動(dòng),光標(biāo)自動(dòng)右移
movwf PORTC
call _enable
movlw 80H
movwf PORTC ; 第一行顯示位置
call _enable
call _write1 ; 調(diào)用送第一行數(shù)子程序" www.21ic.com "
movlw 0C0H
movwf PORTC ; 第二行的位置
call _enable
call _write2 ; 調(diào)用送第二行數(shù)子程序"best wish to you"
goto $
;***********************
_write1
clrf count ;送第一行數(shù)字程序
again1
movf count,W
call _table1
movwf tmp1
call _write
incf count
movf tmp1,W
xorlw 00H
btfss STATUS,Z
goto again1
retlw 0
;*************************
_write2 ;送第二行數(shù)子程序
clrf count
again2
movf count,W
call _table2
movwf tmp1
call _write
incf count
movf tmp1,W
xorlw 00H
btfss STATUS,Z
goto again2
retlw 0
;**************************
_write ;送數(shù)據(jù)到LCD子程序
movwf PORTC
bsf PORTA,RS
bcf PORTA,RW
bcf PORTA,E
call _delay
bsf PORTA,E
retlw 0
;寫入控制命令的子程序
_enable
bcf PORTA,RS
bcf PORTA,RW
bcf PORTA,E
call _delay
bsf PORTA,E
retlw 0
;******************************************************
_table1 ;取第一行的顯示碼 www.21ic.com
addwf PCL ;地址偏移量加當(dāng)前PC值
dt " www.21ic.com "
retlw 00H
;-------------------- ----------------------------------
_table2 ;取第一行的顯示碼best wish to you
addwf PCL ;地址偏移量加當(dāng)前PC值
dt "best wish to you"
retlw 00H
;********************************************************
;延時(shí)子程序
_delay
movlw 0x3c ;晶振為4 Mhz,延時(shí)50ms
movwf x
loop_x
movlw 0xff
movwf y
loop_y
decfsz y
goto loop_y
decfsz x
goto loop_x
return
end ;源程序結(jié)束