天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產品競爭力

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

菜鳥學PIC單片機(一)

更新時間: 2019-03-22
閱讀量:2987

深圳市英銳恩科技有限公司(www.yyfdt.com)為單片機技術服務\開發設計和產品代理商,授權MDT(麥肯 MICON)單片機A級代理商,MICROCHIP產品全系列單片機與模擬器件授權推廣商。同時A級代理分銷NOVACAP、Syfer、Voltronics精密可調電容、DLI寬帶隔直微波電容,專注分銷AIC沛亨半導體(電源管理IC)、IR(場效應管)。
如:
MDT10P53(完全兼容PIC12C508A、PIC12C509A,PIC12F508、PIC12F509,直接替換,不要任何硬軟與軟件修改)
特性:ROM:1K,腳位:8PIN,I/O:6PIN,內置振蕩4M,復位時間極快.2V,低電壓工作.低功耗,溫度范圍寬。

MDT10P55(完全兼容PIC16C505、PIC16F505,媲美EMC78P156,直接替換,不要任何硬軟與軟件修改)
特性:ROM:1K,腳位:14PIN,I/O:12PIN,內置振蕩4M,復位時間極快.2V,低電壓工作.低功耗,溫度范圍寬。

菜鳥學PIC單片機(一):TS1620字符型液晶模塊驅動程序編寫苦與樂

   小弟學習PIC16F87X系列單片機已持續半個月了,遇到的困難還是比較多的,幸好單位的圖書館里還有一些相關的書籍,加之購買了第三方的ICD,因此學習起來還是比較充實的。
   雖說如此,但在單位里找不到志同道合者一起來琢磨她,不過這里卻有許多熱心的站友。

   今后,小弟打算將自己的一些學習心得和疑問寫出來,與論壇里和我一樣的初學者一起進步,并殷切希望能得到前輩的指點,  

   小弟寫的第一個程序是控制三位八段數碼管的顯示,還沒來得及總結,今天下午調試和總結了一下LCD的驅動程序,遇到了很多困難,但也有點小小的收獲,拿出來晾晾,大家盡管扔磚,小弟開卡車兜著...


    TS1620字符型液晶模塊驅動程序編寫苦樂

該LCM的控制器為HD47780,其引腳功能如下:

Pin  1    2    3     4   5    6   7~17      15     16
功能 GND VDD   VO   RS   RW   E   DB0~7      BL+    BL-

說明:
RS:數據/命令選擇,用來選擇DB0~7輸入的是顯示數據還是控制字信息,(H/L)
RW:讀寫選擇,(H/L),在延遲時間足夠的情況下,一般不用讀LCM忙信號,常接地。

E: 使能端,控制DB0~7的數據/命令的寫入或者讀取,上升或下降沿有效。
VO:LCD偏壓信號,用來對調整對比度,一般接10K電位器/電阻到地。
DB0~7:數據I/O,可選擇8位數據或者4位數據(分兩次傳輸)。
BL+:背光電源正輸入 +5V DV。
BL-:背光電源地。
VDD:電源正 +5V DC。
GND:電源地。
編寫驅動:
  流程:
上電LCM自動復位—清屏—設置顯示模式—開顯示和光標設置—設置顯示的起始位置—顯示字符ASCII碼輸入顯示。
  注意事項:
1.    LCM屬于慢顯示器件,其上電后復位的時間比較長,因此,可在系統初始化過程中最后初始化LCM;或者在初始化之前調用20~50ms的延遲子程序。并且,如果系統不需要通過延遲來等待LCM完成每一個操作的話,那么應檢測(讀)LCM忙標志,若不忙(該標志為低電平),那么指令能得到執行,否則指令失效。
2.    由于E輸入的使能是上升沿有效還是下降沿有效存在爭議,該問題在調試中將遇到,還沒來得及分析,愿意與大家一起分析。
3.    有時候LCM所顯示的結果并不遵循我們原來的意愿,此時,需先檢查程序中,初始化功能是否完成,尤其是在不檢測忙標志的初始化程序中更要注意,可適當延長延遲時間或者重復初始化指令,另外,也要檢查硬件連線是否有錯。
4.      如果與LCM的引腳相連的端口,需注意該端口是否為普通數字端口,比如本例程中,RA口應先設置成普通數字端口。起初我沒有如此設置,結果軟件仿真模式下始終發現對RA口的操作均不能從SFR觀察窗口中發現任何變化...
5.      由于我所用的demo板電路圖上,其LCM模塊是由RA和RC來控制的,因此,為了能觀察運行結果,程序中依然采用RA和RC來控制LCM。

下面給出一個例程,該例程在小弟用的仿真器和demo板上通過,同時給出調試現象:

1)關于E的使能的問題,如果對LCM 的E輸入腳進行復位置位(先復位或先置位結果均一樣)操作時中間的延時過短或者過長的話,均會出現一些問題:
過短:5ms,運行正常,但在debug中復位后,會有部分字符殘留
特短:3個nop指令,運行后無任何輸出
較長:200ms,運行正常,但debug復位后,所有字符均殘留
一般:50ms,顯示正常,復位后無字符殘留

前輩們能分析一下么?

2)由于采用的顯示模式是16字x2行,發現,如果字符表_table1或者_table2中,偽指令dt定義的字符個數如果小于16的話,那么在該行字符的末尾會出現一些其他的字符,小弟這里出現的是 “||”,后用空格填充至16字符具體原因愿意與大家一起分析。

3) 該程序采用ICD模式調試燒寫,運行正常之后,小弟打算脫機運行,即不燒入調試代碼,但燒寫過程老是停在 programming ID處,取消ID燒入,那么燒寫過程就停在programming program,并且,ICD 就出現 連接錯誤的提示,需重新更改ICD模式至SIM模式下,此時發現ICD的連接指示燈不再閃爍,連接正常了。
(可能問題描述得不夠準確,下次再重現故障,詳細說明...)

4) 另外一個有趣的問題是,PIC16系列的指令系統中應該沒有movfw這一指令,但是,在mplab中,卻發現,諸如movfw value ;(value為一自定義的寄存器變量)卻能通過編譯,而且,功能似乎等同 movf value,W  小弟感到納悶(小弟用的是mplab 5.7full版,該第三方的ICD能直接使用在該版本下..

請前輩指點,如果能談談自己這些年來學習PIC單片機所走過的路就更好了:)


;****************************************************
    list        p=16f877    
    #include        

;定義保護現場用寄存器
w_temp        EQU    0x71        
status_temp    EQU    0x72        
pclath_temp    EQU    0x73

;定義主程序用寄存器
count       EQU     0x74          ; 定義計數寄存器地址
tmp1        EQU     0x75           ; 定義臨時寄存器地址    
x    EQU    0x76        ; 延時子程序外循環計數器
y    EQU    0x77        ; 延時子程序內循環計數器            

;定義LCM控制位常量
RS         EQU     1        ; LCD寄存器選擇信號腳定義在RA.1腳
RW         EQU     2            ; LCD讀/寫信號腳定義在RA.2腳
E          EQU     3            ; LCD片選信號腳定義在RA.3腳


;***該段e文注釋的程序為模板內容
    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            ;設置RA口全部為普通數字IO口
      clrf    TRISA
      clrf    TRISC        ; 定義RA口,RC口全部為輸出
      bcf    STATUS,RP0

  call  _delay          ;調用廷時,剛上電LCD復位不一定有PIC快

      movlw 01H
      movwf PORTC             ; 清屏
      call  _enable        

      movlw 38H
      movwf PORTC             ; 8位數據,16字x2行,5x7點陣
      call  _enable

      movlw 0CH               ; 顯示器開、光標不閃
      movwf PORTC
     call  _enable

      movlw 06H               ; 文字不動,光標自動右移
      movwf PORTC
      call  _enable

      movlw 80H

movwf PORTC             ; 第一行顯示位置
     call  _enable


      call  _write1       ; 調用送第一行數子程序"  www.21ic.com  "

      movlw 0C0H
      movwf PORTC             ; 第二行的位置
      call  _enable

      call  _write2       ; 調用送第二行數子程序"best wish to you"

      goto  $
  
;***********************
_write1
     clrf  count          ;送第一行數字程序
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                 ;送第二行數子程序

 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                 ;送數據到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         ;地址偏移量加當前PC值
        dt "  www.21ic.com  "
        retlw 00H
;-------------------- ----------------------------------
_table2                      ;取第一行的顯示碼best wish to you
        addwf PCL         ;地址偏移量加當前PC值                                                 
        dt    "best wish to you"

  retlw 00H
;********************************************************
;延時子程序
_delay   
        movlw    0x3c        ;晶振為4 Mhz,延時50ms
        movwf    x
loop_x        
        movlw    0xff
        movwf    y
loop_y        
        decfsz    y
        goto     loop_y
        decfsz    x
        goto      loop_x
        
        return

        end                   ;源程序結束

联系我们: 沾益县| 惠东县| 阜阳市| 万州区| 龙江县| 大荔县| 万源市| 射阳县| 香河县| 岗巴县| 莆田市| 德惠市| 老河口市| 永吉县| 阜城县| 炉霍县| 华宁县| 太保市| 和平县| 苏尼特右旗| 房山区| 普格县| 临江市| 青铜峡市| 菏泽市| 综艺| 林西县| 贡山| 茌平县| 黔东| 日喀则市| 融水| 张家川| 鄂托克旗| 连州市| 遵义县| 廊坊市| 夏津县| 雷山县| 鲁甸县| 井研县|