痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
樓主: antlu

求助: 74HC595 與 1602 的糾葛

  [複製鏈接]
發表於 2013-12-20 12:02:24 | 顯示全部樓層
antlu 發表於 2013-12-20 05:35 AM static/image/common/back.gif
YSC大 LEGION大 OLDHAN大 XAOLABA大 IMCRAZY大:
清晨5:30 今天有事起的早!!平常都是10:00請床,匆匆之間使用 ...

大大加油

如果還是亂碼的話, 最好先來用這個試試看, 純 KEIL 4 的, 51的, 不加595.
http://www.embeddedcraft.org/lcd4bit.html#code

順便DUMP一下他的 CHAR ROM, 有可能你看到的"亂碼" 是希臘字母或其他西歐字母, 或者是特別的字符, 並非純英文字母編碼. 不過一般44780的 A-Z, a-z 都是用ASCII CODE, 不過俺看過有特別訂做而不是ASCII-7的或ASCII-8編碼的, 都用44780控制方式.

成功後, 再加595, 這樣會比較容易除錯, 也可以確認會不會是 CONTROLLER CHIP 的影響, 因為以前試過初始化不同的LCM會有些巧妙, 尤其是4BIT MODE. 有的100%兼容44780, 有的有小小差別.
發表於 2013-12-20 20:31:12 | 顯示全部樓層
imcrazy 發表於 2013-12-20 02:28 AM static/image/common/back.gif
我講的週期不是說instruction cycle啦!! 指的是shift 1 bit到595的週期時間....

共要幾個instruction cy ...

10週期..那也才10us而已,其實只是看到這一頭霧水而己
畢竟應該不是這種算法的,但週不週期的這也都是題外話了,
剩下的也只能動手實際作一下,大概就能知道問題在那了
發表於 2013-12-20 20:33:29 | 顯示全部樓層
antlu 發表於 2013-12-20 05:35 AM static/image/common/back.gif
YSC大 LEGION大 OLDHAN大 XAOLABA大 IMCRAZY大:
清晨5:30 今天有事起的早!!平常都是10:00請床,匆匆之間使用 ...

這個還是請antlu大你再努力一些,到最後不行時再給我完整一點的資料
用你的資料去作修改,或許就能找到問題在那個點上,應該不是太大的問題
 樓主| 發表於 2013-12-20 22:28:37 | 顯示全部樓層
本帖最後由 antlu 於 2013-12-21 12:59 AM 編輯

595LCM.png
legion 發表於 2013-12-20 08:33 PM static/image/common/back.gif
這個還是請antlu大你再努力一些,到最後不行時再給我完整一點的資料
用你的資料去作修改,或許就能找到問題 ...


LEGION大:
  OK!!  沒問題我會再接再厲!! 這次若可以搞定,那時序的問題就不會是難事了!!


發表於 2013-12-21 09:11:16 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-21 11:21 AM 編輯

是不是圖畫錯了,LCM第1腳是Vcc,第3腳才是Vss。
------------------------------------
是我搞錯了,第1腳是Vss沒錯。

 樓主| 發表於 2013-12-21 10:06:48 | 顯示全部樓層
ysc 發表於 2013-12-21 09:11 AM static/image/common/back.gif
是不是圖畫錯了,LCM第1腳是Vcc,第3腳才是Vss。

YSC大:
   LCM 有遇見過 PIN2腳接GND的但我的經驗大部分是接 PIN1 GND   PIN2 VCC
發表於 2013-12-21 11:13:05 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-21 11:22 AM 編輯
antlu 發表於 2013-12-21 10:06 AM static/image/common/back.gif
YSC大:
   LCM 有遇見過 PIN2腳接GND的但我的經驗大部分是接 PIN1 GND   PIN2 VCC


是我搞錯了,第1腳是VSS沒錯。

不過有個好消息,這個實驗我用組合語言做出來了,HC595接線方式與訊號傳送順序
都模擬您的C程式,一開始也是失敗!

後來試著改變各種不同的時序,發現問題出在HC595 LATCH訊號,這訊號若改成經常為LOW,
要鎖住時發出->HI->LOW,這樣就OK了。

CLOCK訊號是比較沒影響,不過最好還是經常為LOW,動作時再->HI->LOW。

4BITLCD.jpg
發表於 2013-12-21 12:17:11 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-21 12:19 PM 編輯
antlu 發表於 2013-12-21 10:06 AM static/image/common/back.gif
YSC大:
   LCM 有遇見過 PIN2腳接GND的但我的經驗大部分是接 PIN1 GND   PIN2 VCC


附上程式:
$MOD52
$TITLE(SBC-51 4 BIT LED TEST)
$OBJECT
$NOSYMBOLS
$PAGEWIDTH(80)
;
D_595        EQU        P1.4
CK_595        EQU        P1.5
E_595        EQU        P1.6
;--------------------------------------
        CSEG        AT        0H
        ORG        0        ;RESET
        JMP        START
;--------------------------------------
START:
        CLR        EA                ;DIS INT
        ORL        8EH,#1                ;DIS ALE
        MOV        PSW,#0
;
        MOV        R0,#1
CLR_RAM:
        MOV        @R0,#0
        INC        R0
        MOV        A,R0
        JNZ        CLR_RAM
;
        MOV        SP,#80H
        MOV        A,#0FFH
        MOV        P1,A
        MOV        P2,A
        MOV        P3,A
;
        CLR        E_595
        CLR        CK_595
        CALL        INI_LCD
;
MAIN:
        MOV        DPTR,#LINE1
        ACALL        DS_MSG
;
        MOV        A,#0C0H
        ACALL        WR_COM
;
        MOV        DPTR,#LINE2
        ACALL        DS_MSG
;
LOOP:
        SJMP        LOOP
;
DS_MSG:
        CLR        A
        MOVC        A,@A+DPTR
        JNZ        DS_MSG2
        RET
DS_MSG2:
        ACALL        WR_DATA
        INC        DPTR
        SJMP        DS_MSG
;
LINE1:
        DB        '    HELLO PIGOO',0
LINE2:
        DB        '4 BIT LCD WITH HC595',0
;------------------------------------------------
INI_LCD:
;
        CLR        A
        ACALL        W_595
        ACALL        LCD_DLY
        ACALL        LCD_DLY
;
        MOV        A,#30H
        ACALL        WR_INIT
        MOV        A,#30H
        ACALL        WR_INIT
        MOV        A,#30H
        ACALL        WR_INIT
        MOV        A,#20H
        ACALL        WR_INIT
        MOV        A,#28H
        ACALL        WR_COM
        MOV        A,#0CH
        ACALL        WR_COM
        MOV        A,#01H
        ACALL        WR_COM
        MOV        A,#06H
        ACALL        WR_COM
        MOV        A,#80H
        ACALL        WR_COM
        RET
;
WR_INIT:
        ACALL        WR_COM1
        SJMP        LCD_DLY
;
WR_COM:
        PUSH        ACC
        ACALL        WR_COM1
        POP        ACC
        SWAP        A
        ACALL        WR_COM1
LCD_DLY:
        MOV        R3,#20
LCD_DLY1:
        MOV        R2,#0
        DJNZ        R2,$
        DJNZ        R3,LCD_DLY1
        RET
;
WR_COM1:
        ANL        A,#0F0H
        SETB        ACC.3
        ACALL        W_595
        CLR        ACC.3
        ACALL        W_595
        RET
;
WR_DATA:
        PUSH        ACC
        ACALL        WR_DATA1
        POP        ACC
        SWAP        A
        ACALL        WR_DATA1
        MOV        R3,#4
        SJMP        LCD_DLY1
;
WR_DATA1:
        ANL        A,#0F0H
        ORL        A,#0AH
        ACALL        W_595
        CLR        ACC.3
        ACALL        W_595
        RET
;
W_595:
        PUSH        ACC
        MOV        R7,#8
W_595_1:
        RLC        A
        MOV        D_595,C
        SETB        CK_595
        CLR        CK_595
        DJNZ        R7,W_595_1
;
        SETB        E_595
        CLR        E_595
        POP        ACC
        RET
;---------------------------------------------------
        END

 樓主| 發表於 2013-12-21 12:59:58 | 顯示全部樓層
ysc 發表於 2013-12-21 11:13 AM static/image/common/back.gif
是我搞錯了,第1腳是VSS沒錯。

不過有個好消息,這個實驗我用組合語言做出來了,HC595接線方式與訊號傳 ...

YSC大;
     感恩喔!!
     我不會組合語言也沒有相關的工具,您提供的寶貴信息我會努力測試,今天已經做了二個小時了,LED 測試送出的動作LED都會亮!! 表示接線上面應該沒問題!! 再次感謝!!
發表於 2013-12-21 15:26:39 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-21 03:51 PM 編輯
antlu 發表於 2013-12-21 12:59 PM static/image/common/back.gif
YSC大;
     感恩喔!!
     我不會組合語言也沒有相關的工具,您提供的寶貴信息我會努力測試,今天已經做了 ...


貼出的組合語言程式是讓您參考寫入順序,只要時序一樣結果也應該相同。

根據自己實作經驗與網路搜尋到的範例程式,HC595 LATCH都是經常為LOW,
要鎖出去時才發出一個正向PULSE,各廠的時序圖也都是這樣寫。

將輸出595的程式改成這樣試試看:

void Send595(unsigned char Dat) //output data to D/A converter through the serial mode
{
         unsigned char i;
         for (i=0;i<8;i++)
         {
                 SER=Dat & 0x80;
                 _nop_();
        
                 Dat<<=1;
                 Clk=1; //先HI
                 _nop_();
                 Clk=0; //後LOW
        
         }
         Latch=1; //先HI
         _nop_();
         Latch=0; //後LOW
         _nop_();
}

也就是latch與clk平常都為LOW,動作時 -->HI-->LOW,
最好在主程式一開始也讓latch與clk為LOW。

試成功之後將1->0之間的 _nop_() 拿掉應該也會正常,我用組合語言寫的中間沒加上nop。

經過今天的實驗,很合理懷疑HC595 LATCH一直為1跟由1變0時會有規格書所沒寫出的動作細節.......

其實以前也有用HC595設計過產品,但都沒遇過怪問題,因為latch與clk都是採用Normal LOW的方式,這次為了阿乾大這問題才使用Normal HI的方式,也才發現這細節。



發表於 2013-12-21 16:06:33 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-21 04:08 PM 編輯
antlu 發表於 2013-12-21 12:59 PM static/image/common/back.gif
LED 測試送出的動作LED都會亮!! 表示接線上面應該沒問題!!...


眼見不一定為憑........很多細節眼睛是看不出來的,甚至較低階的儀器也不見得抓得到!

一開始用您的時序實驗失敗時,有寫一段測試程式,用示波器測量HC595每隻輸出腳,
確定每個Bit都有輸出到定位但還是不行,改成Normal LOW就ok了。

 樓主| 發表於 2013-12-21 16:27:11 | 顯示全部樓層
本帖最後由 antlu 於 2013-12-21 05:04 PM 編輯
ysc 發表於 2013-12-21 03:26 PM static/image/common/back.gif
貼出的組合語言程式是讓您參考寫入順序,只要時序一樣結果也應該相同。

根據自己實作經驗與網路搜尋到的 ...


YSC大:
   感謝協助!! 目前已經可以顯示出一些字母出來了!! 我會繼續努力!!
1.第一個字母漏掉
2.顯示 數字還不行
3.第二行不顯示
4.同樣程式在 1T MCU 15F204EA 不動作

displayword[0]='0';
        displayword[1]='1';
        displayword[2]='2';
        displayword[3]= '3';
        displayword[4]= '4';
        displayword[5]= '5';
        displayword[6]='6';
        displayword[7]='7';
        displayword[8]= '8';
        displayword[9]= '9';
        displayword[10]='A';
        displayword[11]= 'B';
        displayword[12]= 'C';
        displayword[13]='D';
        displayword[14]='E';
        displayword[15]='F';

DSC07685.JPG

displayword[0]='A';
        displayword[1]='N';
        displayword[2]='T';
        displayword[3]= 'L';
        displayword[4]= 'U';
        displayword[5]= 'M';
        displayword[6]='S';
        displayword[7]='2';
        displayword[8]= '3';
        displayword[9]= '@';
        displayword[10]='G';
        displayword[11]= 'M';
        displayword[12]= 'A';
        displayword[13]='I';
        displayword[14]='L';
        displayword[15]='.

DSC07684.JPG
發表於 2013-12-21 16:32:27 | 顯示全部樓層
antlu 發表於 2013-12-21 04:27 PM static/image/common/back.gif
YSC大:
   感謝協助!! 目前已經可以顯示出一些字母出來了!! 我會繼續努力!!
1.第一個字母漏掉

那應該是延遲時間不夠,LCM反應不過來。
發表於 2013-12-21 17:24:58 | 顯示全部樓層
antlu 發表於 2013-12-21 04:27 PM static/image/common/back.gif
YSC大:
   感謝協助!! 目前已經可以顯示出一些字母出來了!! 我會繼續努力!!
1.第一個字母漏掉

又往前邁進一步了,快成功了喔,加油!
發表於 2013-12-22 16:03:59 | 顯示全部樓層
legion 發表於 2013-12-20 08:31 PM static/image/common/back.gif
10週期..那也才10us而已,其實只是看到這一頭霧水而己
畢竟應該不是這種算法的,但週不週期的這也都是題外 ...

其實只是我在大概估算而已....說出那個感覺罷了.....表明不可能是用595後時間變很長...是原本時間的N倍....

因為每傳一個bit都還要運算....要shift...然後還要clock hi lo......8個bits就8次...在後還要load...那就是9次...額外多一次的時間就當做我沒估到的時間或是沒考慮到的....就10個週期吧.......然後想10個週期的時間會多少....有沒有可能超過達到N倍的時間.........算是一種快速粗略評估方式...因為精確時間根本不是非常重要......因為目的是在釐清改用595傳輸與並行傳輸顯示.......時間是差不了多少的...不會是N倍...
發表於 2013-12-22 16:15:21 | 顯示全部樓層
ysc 發表於 2013-12-21 03:26 PM static/image/common/back.gif
貼出的組合語言程式是讓您參考寫入順序,只要時序一樣結果也應該相同。

根據自己實作經驗與網路搜尋到的 ...
經過今天的實驗,很合理懷疑HC595 LATCH一直為1跟由1變0時會有規格書所沒寫出的動作細節.......

595規格書有啦...
595基本上就是shift register 再加上storage register....那也就是為什麼我比較喜歡595......
因為它傳輸時輸出是可不變的.........可傳輸完畢後....再完整load進來改變輸出......
595-1.PNG
595-2.PNG
發表於 2013-12-22 16:50:24 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-22 11:44 PM 編輯
imcrazy 發表於 2013-12-22 04:15 PM static/image/common/back.gif
595規格書有啦...
595基本上就是shift register 再加上storage register....那也就是為什麼我比較喜歡59 ...


前面說規格書沒寫的細節是指ST_CP一直為1時動作起來有點問題,各廠說明書都只寫ST_CP在正緣時將移位暫存器資料存到輸出暫存器,但平常是1或0都可以。

但以這個實驗來說卻有差異,ST_CP平常為1,動作時發出一個負向脈波(->0->1),資料傳送到LCM卻是錯誤的,若將ST_CP改為平常為0,動作時發出一個正向脈波(->1->0),傳送進入LCM的資料就會正確,各廠說明書時序圖也都是以正向脈波來舉例,但功能表文字說明非動作時卻打個X,表示1或0都不會影響動作。

由於這個實驗觸發LCM讀入的E訊號也包含在移位資料裡,兩次位移資料之間輸出腳若有極短暫時間的變動(如幾nS),這會引起LCM錯誤讀入,目前判斷ST_CP為1時輸入暫存器又在移位中,很可能會有這種狀況發生,若ST_CP平常在0就不會發生。

初步以LED或示波器觀測595輸出腳,不管ST_CP採用正向脈波或負向脈波觸發都能將資料正確送到相對輸出腳,但移位過程中會有何種差異就需要抓問題了,目前預計寫個測試程式,連續將0X55移入暫存器,分別觀測ST_CP為1跟為0時輸出會有何差異,若要觀測ST_CP負緣對輸出的影響那就有難度了......

發表於 2013-12-22 17:06:36 | 顯示全部樓層
這點非常重要,
要控制的腳是 level triggered or edge triggered,
Difference between Level Triggered and Edge Triggered:
http://electronicsgurukulam.blog ... -triggered-and.html
發表於 2013-12-22 17:27:01 | 顯示全部樓層
imcrazy 發表於 2013-12-22 04:03 PM static/image/common/back.gif
其實只是我在大概估算而已....說出那個感覺罷了.....表明不可能是用595後時間變很長...是原本時間的N倍.. ...

嗯,該怎麼說呢,其實時間週期上還會有很多外部因素的干擾
取出DATA進行移位,光CLK就要1個HI和1個LO,再加上外部的迴圈作增減
和單純只送1次DATA和CMD比起來時間上差異是蠻大的,
不過也因LCM本身很慢,倒也不用太糾結在這里
如果是換成在推TFT時,那倒是會讓人很在意的,
用595推TFT大概會瘋掉,不過推LCM就看每個人的需求不同,
順手就好,也就不用太去在意了
發表於 2013-12-22 17:28:44 | 顯示全部樓層
oldhan 發表於 2013-12-22 05:06 PM static/image/common/back.gif
這點非常重要,
要控制的腳是 level triggered or edge triggered,
Difference between Level Triggered and ...

常用的移位暫存器裡CD4094就是level triggered,STROBE PIN只要為1就會讓內外暫存器相通,為0就將資料鎖在輸出暫存器。

而74HC595則是edge triggered,而且是在正緣動作,各廠規格書上都只寫正緣會將資料鎖出去,其他狀態則是打X,表示Don't care,不會影響動作,但事實上卻不是如此。

雖然有這個小矛盾在,但只要依常規ST_CP以Normal LOW方式來使用,確定是沒問題的。

 樓主| 發表於 2013-12-22 17:55:37 | 顯示全部樓層
ysc 發表於 2013-12-22 05:28 PM static/image/common/back.gif
常用的移位暫存器裡CD4094就是level triggered,STROBE PIN只要為1就會讓內外暫存器相通,為0就將資料鎖 ...

YSC大:

   感激不盡!! 奮戰多日終於解決問題!! 付上一直不行的程式做為比對(不動作或動作不良的有些畫蛇添足)!!

//*******************************************
void Send595(unsigned char Dat) //output data to D/A converter through the serial mode
{
         unsigned char i;
           Clk=0;
           _nop_();
            Latch=0;//去掉會不顯示數字
                 _nop_();                                
         for (i=0;i<8;i++)
         {
     //           Clk=0;
                 SER=Dat & 0x80;
                                                                        _nop_();
                 Dat<<=1;
                                                 Clk=1;
                                              _nop_();
                                         Clk=0;
                                             _nop_();
                 }
                                                         
          Latch=1;
                                _nop_();
                // _nop_();//去掉會不顯示數字
         Latch=0;
                                 _nop_();
      // _nop_();//去掉會不顯示數字
}


//-------------------------- 595 send to LCM 命令-------------------
/*這版本不行
void LCD_Write_Com(char com) // 4bit mode {
{
unsigned char D596=0;
Send595(0);//RS=0
D596= D596|0x08;// EN=1 rs=0
Send595(D596);//送到 74HC595   
D596=com & 0xf8;//指令上4BIT放入D595中
Send595(D596);//增加rs單獨動作   
D596=D596 & 0xf7;//EN=0
Send595(D596);//輸出             
com<<=4;
        //Send595(0x80);// EN=1 rs=0應該錯了筆誤
        Send595(0x08);// EN=1 rs=0對了
D596=com|0x08;//EN=1
Send595(D596);         
D596=D596 & 0xf7;//EN=0
Send595(D596);// 輸出
        DelayMs(1);
}
*/
void LCD_Write_Com(char com) // 4bit mode
{//這版本可以 改自 LCD_Write_init
unsigned char D595,Tcom;

Tcom=com & 0xf0;//指令放入Tcom中
D595=Tcom|0x08;//RS=0 & EN bit=1
Send595(D595);//送到 74HC595        
D595=D595 & 0xf7;
Send595(D595);//EN_CLR
com<<=4;       
        Tcom=com & 0xf0;//指令放入Tcom中
D595=Tcom|0x08;//RS=0 & EN bit=1
Send595(D595);//送到 74HC595        
D595=D595 & 0xf7;
Send595(D595);//EN_CLR
       
DelayMs(1);
}
/*
void LCD_Write_Data(char Data) // 4bit mode
{
unsigned char D595=0;
Send595(0x02);//RS=1
//Send595(0x0a);//EN=1送到 74HC595  
D595=D595|0x0a;//---------new         add
Send595(D595);//-----------new add
        D595=Data & 0xfa;//資料上4BIT放入D595中 RS=1
        Send595(D595);//增加rs單獨動作
  D595=D595 & 0xf7;//EN=0
Send595(D595);//輸出      
Data<<=4;
Send595(0x0a);// rs=1 en=1       
D595=Data|0x0a;//EN=1+data
Send595(D595);         
D595=D595 & 0xf7;//EN=0
Send595(D595);// 輸出
        DelayMs(1);
}*/


void LCD_Write_Data(char Data) // 4bit mode
{//新改版以 LCD_Write_Init改給 LCD_Write_Com(char com) 為範本
unsigned char D595,Tcom;

Tcom=Data & 0xf0;//指令放入Tcom中
D595=Tcom|0x0a;//RS=0 & EN bit=1
Send595(D595);//送到 74HC595        
D595=D595 & 0xf7;
Send595(D595);//EN_CLR
Data<<=4;       
        Tcom=Data & 0xf0;//指令放入Tcom中
D595=Tcom|0x0a;//RS=0 & EN bit=1
Send595(D595);//送到 74HC595        
D595=D595 & 0xf7;
Send595(D595);//EN_CLR
       
DelayMs(1);
}




void LCD_Write_Init(char com) // 4bit mode
{
unsigned char D595,Tcom;

Tcom=com & 0xf0;//指令放入Tcom中
D595=Tcom|0x08;//RS=0 & EN bit=1
Send595(D595);//送到 74HC595        
D595=D595 & 0xf7;
Send595(D595);//EN_CLR
DelayMs(1);
}

/*------------------------------------------------
            initial LCM
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Init(0x30);    //4bit mode
   DelayMs(5);
   LCD_Write_Init(0x30);
   DelayMs(5);
   LCD_Write_Init(0x30);
   DelayMs(5);
   LCD_Write_Init(0x20);  
           DelayMs(5);
   LCD_Write_Com(0x28);
           DelayMs(5);
         LCD_Write_Com(0x28);
   DelayMs(5);       
   LCD_Write_Com(0x08);    /*显示关闭*/
        DelayMs(2);
   LCD_Write_Com(0x01);    /*显示清屏*/
        DelayMs(2);
   LCD_Write_Com(0x06);   /*显示光标移动设置*/  
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }
發表於 2013-12-22 18:12:15 | 顯示全部樓層
antlu 發表於 2013-12-22 05:55 PM static/image/common/back.gif
YSC大:

   感激不盡!! 奮戰多日終於解決問題!! 付上一直不行的程式做為比對(不動作或動作不良的有些畫蛇 ...

恭喜啊,經過此番奮戰,相信功力又增加不少.......
拍張顯示出來的照片跟大家分享喜悅吧?

感謝阿乾大提出這問題讓大家腦力激盪,也讓我對LCM 4 BIT模式與HC595細節更加了解。


發表於 2013-12-22 18:21:08 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-22 06:27 PM 編輯
antlu 發表於 2013-12-22 05:55 PM static/image/common/back.gif
YSC大:

   感激不盡!! 奮戰多日終於解決問題!! 付上一直不行的程式做為比對(不動作或動作不良的有些畫蛇 ...


void Send595(unsigned char Dat) //output data to D/A converter through the serial mode
{
         unsigned char i;
           Clk=0;
           _nop_();
            Latch=0;//去掉會不顯示數字
                 _nop_();                                
         for (i=0;i<8;i++)
         {
     //           Clk=0;
                 SER=Dat & 0x80;
                                                                        _nop_();
                 Dat<<=1;
---------------------------------------------------------------------------------------
上面紅字那兩行最好放在主程式一開始的地方,開機後只執行一次就好,沒那行會不正常的原因是因為一開機輸出是1,那第一次LATCH就白做了(原本是1,輸出1還是1,無法產生正緣),要第二次後才會正常,所以輸出腳位與一些變數的初值在主程式一開始就要正確設定好。

放在Send595裡面當然也可以,只是每次呼叫都會重複做一次,每次執行完Send595 Clk與Latch一定是0,所以沒必要重複。

嚴格來說,HC595也要初始化,最好先輸出0到595,開機時595輸出狀態也是不定的。


 樓主| 發表於 2013-12-22 18:45:15 | 顯示全部樓層
ysc 發表於 2013-12-22 06:21 PM static/image/common/back.gif
void Send595(unsigned char Dat) //output data to D/A converter through the serial mode
{
          ...

YSC大:
   我先PO照片再整理一下程式看看可以刪掉哪一些!!  感謝!!

這是 2402的LCM 還附兩組紅綠燈 因為回收場人員 快手所以有的需要"微修" 接腳錯開半格但是使用常腳PIN 就OK了!!

DSC07686.JPG

DSC07687.JPG

DSC07688.JPG

發表於 2013-12-22 19:47:18 | 顯示全部樓層
antlu 發表於 2013-12-22 06:45 PM static/image/common/back.gif
YSC大:
   我先PO照片再整理一下程式看看可以刪掉哪一些!!  感謝!!

讚!
其實只要將595 Latch訊號改正了,剩下的都比較簡單,無法讓LCM讀取正確的資料,怎麼改都摸不著頭緒。

弄清楚之後,其實4 bit傳送也沒想像中難,昨天測試成功之後將初始化程式裡那三個送出0x30一個一個刪掉,都還能初始化成功,一般範例裡連送3個0x30是為了做軟體RESET,只要電源開機規格符合要求的規範(大部分電源供應器都達得到),電源送入之後LCM其實已經硬體RESET好了,不過為了能在各環境穩定使用與不同LCM相容性,還是保守的照規範作初始化。

發表於 2013-12-22 21:30:39 | 顯示全部樓層
ysc 發表於 2013-12-22 05:28 PM static/image/common/back.gif
常用的移位暫存器裡CD4094就是level triggered,STROBE PIN只要為1就會讓內外暫存器相通,為0就將資料鎖 ...
而74HC595則是edge triggered,而且是在正緣動作,各廠規格書上都只寫正緣會將資料鎖出去,其他狀態則是打X,表示Don't care,不會影響動作,但事實上卻不是如此。


真的嗎???
我一直把它當成rising edge trig.....所以一定都會先回low....所以都沒發現到你說的問題...

看來以後有機會要注意一下了.......

發表於 2013-12-22 22:03:21 | 顯示全部樓層
legion 發表於 2013-12-22 05:27 PM static/image/common/back.gif
嗯,該怎麼說呢,其實時間週期上還會有很多外部因素的干擾
取出DATA進行移位,光CLK就要1個HI和1個LO,再加上 ...
用595推TFT大概會瘋掉,不過推LCM就看每個人的需求不同,

老實說.....我個人比較懶......自己做玩具...如果沒速度上的要求....TFT我可能也會選擇串列的TFT..
因為只要焊幾條線而已.......pitch又大....

TFT一般是320x240 ...一個點大都要2個byte...算一算顯示速度應該還好啦...更新就局部更新吧....



======================================

其實用STC印象中好像可以用UART接腳發送吧......用模式0傳出....bit rate好像是system clock除以8還是12的.........就送個byte到register..它自動幫你串列傳出去....這樣CPU就比較沒那麼忙碌.....但會不會比較快就沒仔細研究了.............那要評估bit rate差多少才知道...
發表於 2013-12-22 22:35:26 | 顯示全部樓層
本帖最後由 legion 於 2013-12-22 10:36 PM 編輯
imcrazy 發表於 2013-12-22 10:03 PM static/image/common/back.gif
老實說.....我個人比較懶......自己做玩具...如果沒速度上的要求....TFT我可能也會選擇串列的TFT..
因為 ...


該怎麼說呢,用1T的51跑32MHZ時,TFT跑16BIT的DATA都覺得不夠快了
我想也應該沒人會用串列去跑,但這都是題外話就不用想太多了
一般都是有碰到時才會發現問題在那,單純作作玩具就因人而異了
 樓主| 發表於 2013-12-22 23:05:01 | 顯示全部樓層
ysc 發表於 2013-12-22 07:47 PM static/image/common/back.gif
讚!
其實只要將595 Latch訊號改正了,剩下的都比較簡單,無法讓LCM讀取正確的資料,怎麼改都摸不著頭緒 ...

YSC大:
  剛剛把 74HC595 的 CLK & LATCH 在 MIAN 程式時候就把他 設成 LOW 然後把 副程式的部分清掉,程式可以正常作用,真的很棒的建議!! LCD_Write_Init() 這一部分去掉就變亂碼!! 只是當初不知道為何,套裝程式都沒有這一部分...
發表於 2013-12-22 23:36:48 | 顯示全部樓層
imcrazy 發表於 2013-12-22 09:30 PM static/image/common/back.gif
真的嗎???
我一直把它當成rising edge trig.....所以一定都會先回low....所以都沒發現到你說的問題... ...

沒錯,也是跟您一樣一直都是用Normal LOW的方式都沒出過怪問題,是為了抓阿乾大的問題做實驗才發現的。

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-12-23 04:10 PM , Processed in 0.111006 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.