痞酷網_PIGOO

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

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

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

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

謝謝!
查看: 14309|回復: 65

求助: 74HC595 與 1602 的糾葛

  [複製鏈接]
發表於 2013-12-17 17:40:11 | 顯示全部樓層 |閱讀模式
請各位先進幫忙看看!! 我已經摸索了幾天了!!
我使用 74HC595 去控制 LCM的顯示 ,一只神功已經失敗了!! 只好轉到3指神功!

P2^0 --- 74HC595 CLOCK
P2^1 --- 74HC595 LATCH
P2^2 --- 74HC595 DATA  
  
可以送出去顯示七段顯示,但是送到 LCM的時候就不行了!!

74HC595-- BIT 1 --- 1602 R/S  命令與資料
74HC595-- BIT 3 --- 1602 Enable
74HC595-- BIT 4 --- 1602 BIT4
74HC595-- BIT 5 --- 1602 BIT5
74HC595-- BIT 6 --- 1602 BIT6
74HC595-- BIT 7 --- 1602 BIT7

沒有接 R/W 是因為 網路上也沒有接,還有 74HC595只有輸出沒有讀入, 這樣一來LCM 的 BUSY 狀態就沒辦法知道了,我不知道網路的高手如何解決?

我的程式如下,請大家幫忙找找問題,感恩喔!! 感恩喔!!


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


//-------------------------- 595 send to LCM 命令-------------------
void LCD_Write_Com(char com) // 4bit mode {
{
unsigned char D595,Tcom;

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


//-------------------------- 595 send to LCM 資料-------------------
void LCD_Write_Data(char Data)  // 4bit mode {
{
unsigned char D595,Tdata;
  Tdata=Data & 0xf0;//指令 或 資料 放入Tcom中
D595=Tdata|0x08;//RS bit=0 EN bit=1
Send595(D595);//送到 74HC595
D595=D595&0xf7;
Send595(D595);//EN_CLR

Data<<=4;
//Tdata=Data & 0xf0;
D595=Data|0x08;//RS bit=0 EN bit=1
Send595(D595);
D595=D595&0xf7;
Send595(D595);//EN_CLR
DelayMs(1);
}
發表於 2013-12-17 18:37:22 | 顯示全部樓層
小弟還是不行,所以只能找資料,

成功了!4根IO口线驱动1602,带PWM调光。

 樓主| 發表於 2013-12-18 00:26:51 | 顯示全部樓層
本帖最後由 antlu 於 2013-12-18 02:05 AM 編輯
fatzeros 發表於 2013-12-17 06:37 PM static/image/common/back.gif
小弟還是不行,所以只能找資料,

成功了!4根IO口线驱动1602,带PWM调光。


F大:
  程式研究中!! 不太了解ㄋㄟ!!
發表於 2013-12-18 01:24:36 | 顯示全部樓層
1. 初始化程序?
2. R/W是否有接地電位?
3. 無法檢查BUSY,所以要注意送給LCD的指令間隔,要確保HD44780(LCD 控制晶片)有足夠的指令執行時間。

R/W直接0V與不檢查BUSY我也是常常這樣用,使用上並沒問題。
 樓主| 發表於 2013-12-18 02:09:33 | 顯示全部樓層
本帖最後由 antlu 於 2013-12-18 02:12 AM 編輯
ysc 發表於 2013-12-18 01:24 AM static/image/common/back.gif
1. 初始化程序?
2. R/W是否有接地電位?
3. 無法檢查BUSY,所以要注意送給LCD的指令間隔,要確保HD44780(L ...


YSC大:
    以前的程序都是使用併列方式(沒有使用 74595)顯示都正常,包刮4BIT方式,我目前增加了 74HC595的串列輸出以及會影響到的 指令寫 & 資料寫 這兩個部分!!

1.時間上面把 DELAY 增加了10MS
2.  R/W 有接地!
3. 有初始化程序
     void main(void)
{
LCD_Init();
LCD_Clear();
....
發表於 2013-12-18 13:32:45 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-18 04:02 PM 編輯
antlu 發表於 2013-12-18 02:09 AM static/image/common/back.gif
YSC大:
    以前的程序都是使用併列方式(沒有使用 74595)顯示都正常,包刮4BIT方式,我目前增加了 74HC595 ...


剛剛午休再看了一下程式,順便偷偷學阿乾大的C.......,阿乾大C寫得不錯啊!蠻結構化的。

有個重大發現,應該是問題所在了......真是大水沖倒龍王廟啊,
那就是您將 Write_Com 跟 Write_Data 搞顛倒了,
寫入命令 RS 要為 0 ,寫入資料 RS 要為 1,問題就是這麼簡單。


 樓主| 發表於 2013-12-18 16:17:21 | 顯示全部樓層
ysc 發表於 2013-12-18 01:32 PM static/image/common/back.gif
剛剛午休再看了一下程式,順便偷偷學阿乾大的C.......,阿乾大C寫得不錯啊!蠻結構化的。

有個重大發現 ...

ysc大:
   那我改改看囉!謝謝提醒!!
發表於 2013-12-19 00:07:34 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-19 12:13 AM 編輯
antlu 發表於 2013-12-18 04:17 PM static/image/common/back.gif
ysc大:
   那我改改看囉!謝謝提醒!!


相較於74HC595這種基礎邏輯IC的反應速度,51系列單晶片可說都是慢烏龜,以軟體產生脈波應該不必加NOP指令,我這樣使用很久了,而且是使用組合語言,在24M XTAL狀況下,將Clk或latch設定成0下一個指令馬上設定成1,長期下來595工作得很正常。

 樓主| 發表於 2013-12-19 01:33:58 | 顯示全部樓層
ysc 發表於 2013-12-19 12:07 AM static/image/common/back.gif
相較於74HC595這種基礎邏輯IC的反應速度,51系列單晶片可說都是慢烏龜,以軟體產生脈波應該不必加NOP指令 ...

YSC大:
  請問您是用 74HC595 推動 LCM嗎?  我今天雖然改了程式但是仍然沒有成功!! 改了很多地方都沒有用!! 我看了網路上有人有成功的案例 (F大)但是他說速度很慢,我一直覺得 是不是 串到並的動作中 時間耗掉太多還是有其他因素, 假如您有用 74HC595推動 LCM 可否把相關的程式 (組合語言也可以)讓我參考一下! 感恩!
發表於 2013-12-19 03:53:53 | 顯示全部樓層
阿乾大:
您先看看以下的,先照做,等了解原理之後,再照自己的意思下去試.
8051 74HC595 LCD C語言.
發表於 2013-12-19 09:47:15 | 顯示全部樓層
antlu 發表於 2013-12-19 01:33 AM static/image/common/back.gif
YSC大:
  請問您是用 74HC595 推動 LCM嗎?  我今天雖然改了程式但是仍然沒有成功!! 改了很多地方都沒有用 ...

我沒有使用595推LCM,但對LCM而言資料是否使用595方式送入並不知道,只要時序對了並沒差別。

發表於 2013-12-19 12:26:28 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-19 12:41 PM 編輯
antlu 發表於 2013-12-19 01:33 AM static/image/common/back.gif
YSC大:
  請問您是用 74HC595 推動 LCM嗎?  我今天雖然改了程式但是仍然沒有成功!! 改了很多地方都沒有用 ...


由於您 LCD_Init() 沒貼出來,以下只是猜測.......

問題應該出在初始化程序,初始化成 4 bit 模式時,一開始幾個指令只需要傳送 DB7-DB4,DB3-DB0 不要傳送,也就是其實一開始是 8 bit 模式,只是將 DB3-DB0 忽略,請參考以下 4 bit 初始化流程,紅框內還在 8 bit 模式,只需要傳送一次命令,紅框以下才變成 4 bit 模式:

44780.jpg

LCD_Init() 若也是呼叫 LCD_Write_Com,那就會有問題。


發表於 2013-12-19 12:41:44 | 顯示全部樓層
資料送 0h ~0fh 用邏輯筆察看資料是否有正常,
單獨送 EN, RS 0/1 看 595 pin 上是否如實送出?
如果都正常那就是時序的問題再看一次 data,
一般都是太快所導致,
還有每個命令所需時間不同,
別任何命令資料通通 10mS 延遲,
系統會變得很慢.
 樓主| 發表於 2013-12-19 16:07:44 | 顯示全部樓層
ysc 發表於 2013-12-19 12:26 PM static/image/common/back.gif
由於您 LCD_Init() 沒貼出來,以下只是猜測.......

問題應該出在初始化程序,初始化成 4 bit 模式時,一 ...

YSC大:
   初始化以前有碰到過 8/4BIT 問題後還解決了 0X28 4BIT MODE
void LCD_Init(void)
{
   LCD_Write_Com(0x28);    /*4bit mode*/
   DelayMs(5);
   LCD_Write_Com(0x28);
   DelayMs(5);
   LCD_Write_Com(0x28);
   DelayMs(5);
   LCD_Write_Com(0x28);  
   LCD_Write_Com(0x08);    /*?F?ü?×??*/
   LCD_Write_Com(0x01);    /*?F?ü2M?ì*/
   LCD_Write_Com(0x06);    /*?F?ü?ú?á2??e?|?m*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*?F?ü…{¤??ú?á?|?m*/
   }
發表於 2013-12-19 17:15:58 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-19 05:18 PM 編輯
antlu 發表於 2013-12-19 04:07 PM static/image/common/back.gif
YSC大:
   初始化以前有碰到過 8/4BIT 問題後還解決了 0X28 4BIT MODE
void LCD_Init(void)


那這樣會有問題.....請仔細看我貼的流程圖,一開始在紅框內還是 8 bit 模式,這階段命令不必分兩次送,您一樣呼叫 LCD_Write_Com ,會導致一開始就當作 4 bit 模式,一個指令分上下兩部分分開送,低階的 4 bit 會被誤認是另一個命令。

您以前用 0X28 應該是腳位對應的關係,初始化時 LCD DB7-DB4 必須為 0011。

請注意 LCD_Write_Com 每呼叫一次,會將命令碼分上下兩部分分開傳送,這在 4 bit 模式是正確的,但在初始化階段反而是錯誤的。

 樓主| 發表於 2013-12-19 19:59:11 | 顯示全部樓層
oldhan 發表於 2013-12-19 12:41 PM static/image/common/back.gif
資料送 0h ~0fh 用邏輯筆察看資料是否有正常,
單獨送 EN, RS 0/1 看 595 pin 上是否如實送出?
如果都正常那 ...

oldhan大:
   我用他推動顯示 7段顯示器會正常運作!! 我也猜想應該是 時序的問題!
發表於 2013-12-19 20:17:53 | 顯示全部樓層
本帖最後由 oldhan 於 2013-12-20 12:04 AM 編輯
antlu 發表於 2013-12-19 07:59 PM static/image/common/back.gif
oldhan大:
   我用他推動顯示 7段顯示器會正常運作!! 我也猜想應該是 時序的問題! ...


文字型 LCM 大多是用 Hitichi HD44780 的規格下去做,
大部份不會用這顆..(猜的),
Timeing 如果按 Hitichi 的 LCM 規格 coding 的剛剛好會有相容性問題,
這牌子 LCM 可以換個牌子 LCM 就黑屏不驅動
要稍微加大一些.

剛看了一下程式 ysc 大說的很有可能是 init 程式的問題.
發表於 2013-12-19 21:27:53 | 顯示全部樓層
antlu大
595去推LCM應該沒什麼問題的,
至於慢也是應該的,即使以4BIT來作,原本並列輸出時
HI-4BIT+CMD,加上LOW-4BIT+CMD也只是兩次動作
改成595就變成由串列位移轉成並列又來個HI-LOW那就變成要慢多少倍
其實也想過一種方式,就用你那棵15F204EA替代595作串轉並變成LCM的驅動用
拉出1腳作串列輸入,後面推LCM就直接8BIT輸出,設好協定就成了一指神功了
速度就看傳輸的BPS來決定了,變成RS232模式來驅動LCM
另若現行模式真的弄不出來的話,再把接線圖及完整程式給我一下
星期天晚上應該有空可以玩一下,應該也不是太大的問題
發表於 2013-12-19 22:11:16 | 顯示全部樓層
legion 發表於 2013-12-19 09:27 PM static/image/common/back.gif
antlu大
595去推LCM應該沒什麼問題的,
至於慢也是應該的,即使以4BIT來作,原本並列輸出時
至於慢也是應該的,即使以4BIT來作,原本並列輸出時
HI-4BIT+CMD,加上LOW-4BIT+CMD也只是兩次動作
改成595就變成由串列位移轉成並列又來個HI-LOW那就變成要慢多少倍

問題是595傳輸HI-LOW shift in 可以全速執行呀.....
74hc595標準值差不多是100Mhz........你就算用很慢的MCU ex.8Mhz .....執行一個shift-in也是慢的離譜要1 us好了.....8個bits shift再加上load之類的....給你10週期好了.......那也才10us而已........能慢多少???  反正1602之類的controler都很慢,MCU都是在Loop空等很久才能再下指令........所以也可以說沒時間差吧...
 樓主| 發表於 2013-12-19 22:18:21 | 顯示全部樓層
ysc 發表於 2013-12-19 05:15 PM static/image/common/back.gif
那這樣會有問題.....請仔細看我貼的流程圖,一開始在紅框內還是 8 bit 模式,這階段命令不必分兩次送,您 ...

YSC大:
   http://www.adafruit.com/datasheets/TC1602A-01T.pdf
   這個LCM裡面提到的好像是相反,一開始 低的4BIT 都沒用到,直到起始完成之後才分家的!! (不知道我有沒有看錯!) 我以前使用的4BIT 控制也是如此!
 樓主| 發表於 2013-12-19 22:22:18 | 顯示全部樓層
legion 發表於 2013-12-19 09:27 PM static/image/common/back.gif
antlu大
595去推LCM應該沒什麼問題的,
至於慢也是應該的,即使以4BIT來作,原本並列輸出時

LEGION大:
  線路週六傳給你,感謝!! 我主要是練習使用 74HC595 推動 LCM !!

#include<reg52.h>   
#include <intrins.h> //use nop  
//#include <delay.h>
#define DataPort P2
//sbit Oser = P1^0;
//bit SER;
        unsigned char DISP;
        unsigned char code Seg [10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};

        //-----------------------------------------
sbit SER = P1^2;// 74hc595 control
sbit Latch = P1^1;
sbit Clk = P1^0;
char displayword[16];
void Send595(unsigned char Dat) ;//output data to D/A converter through the serial mode       
       
        //------------------------------------------------
       
/*------------------------------------------------
delay us
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
delay ms
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
   DelayUs2x(245);
   DelayUs2x(245);
}
}

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

         Latch=1;
  
}


//-------------------------- 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
D596=com|0x08;//EN=1
Send595(D596);         
D596=D596 & 0xf7;//EN=0
Send595(D596);// 輸出
}



void LCD_Write_Data(char Data) // 4bit mode
{
unsigned char D595=0;
        Send595(0x02);//RS=1
       

Send595(0x0a);////EN=1送到 74HC595  
       
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);// 輸出
}

/*------------------------------------------------
                2M?ì¨???
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              ?à¤J|r2?|ê¨???
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     
        }
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
while (*s)
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}
/*------------------------------------------------
              ?à¤J|r2?¨???
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
LCD_Write_Data( Data);  
}


/*------------------------------------------------
            initial LCM
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x28);    /*4bit mode*/
   DelayMs(5);
   LCD_Write_Com(0x28);
   DelayMs(5);
   LCD_Write_Com(0x28);
   DelayMs(5);
   LCD_Write_Com(0x28);  
   LCD_Write_Com(0x08);    /*/*显示关闭*/*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);   /*显示光标移动设置*/  
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }






void main(void)
{
       
        DelayMs(100);
LCD_Init();
LCD_Clear();

//DISP=0x0f;
while(1)
{

        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]= 'o';
        displayword[12]= 'o';
        displayword[13]='d';
        displayword[14]='9';
        displayword[15]='8';

LCD_Write_String(0,0, displayword);


DelayMs(250);
LCD_Write_String(0,1, "A");
DelayMs(250);
DelayMs(250);
LCD_Write_String(0,0, "1");
DelayMs(250);

LCD_Clear();

       

}
}

發表於 2013-12-19 22:30:06 | 顯示全部樓層
本帖最後由 xiaolaba 於 2013-12-19 11:45 PM 編輯

大大有沒有看過 LCM 是哪種的 CONTROLLER CHip


這個看起來靠譜的, 不過俺沒有595, 所以沒試過, 你要自己寫個 main(), 測一下
http://www.51hei.com/mcu/1360.html

原理這個寫得比較詳細, 不過他用 PIC, 不是51
http://www.electronics-lab.com/projects/mcu/015/


俺以前用過, 記得是寫 3個 CMD 0x20, 然後再 0x28的, 初始化成功的. 但是看你的是給他寫 3個 CMD 0x28, 然後再 0x28. 不知道是不是這個原因. 也可能不同的 lcm 用不同的 CONTROLLER CHIP.

下面這個 INIT_44780 抄來給你參考

  1. void Initialize_LCD(){
  2. Delay_50ms();
  3. Write_LCD_Cmd(0x20); // Wake-Up Sequence
  4. Delay_50ms();
  5. Write_LCD_Cmd(0x20);
  6. Delay_50ms();
  7. Write_LCD_Cmd(0x20);
  8. Delay_50ms();
  9. Write_LCD_Cmd(0x28); // 4-bits, 2 lines, 5x7 font
  10. Delay_50ms();
  11. Write_LCD_Cmd(0x0C); // Display ON, No cursors
  12. Delay_50ms();
  13. Write_LCD_Cmd(0x06); // Entry mode- Auto-increment, No Display shifting
  14. Delay_50ms();
  15. Write_LCD_Cmd(0x01);
  16. Delay_50ms();
  17. }

複製代碼
發表於 2013-12-19 23:38:19 | 顯示全部樓層
imcrazy 發表於 2013-12-19 10:11 PM static/image/common/back.gif
問題是595傳輸HI-LOW shift in 可以全速執行呀.....
74hc595標準值差不多是100Mhz........你就算用很慢 ...

嗯,該怎麼說,是沒用過595去作這種事,所以單純用想像的,倒沒去想太多
不過8個bits shift再加上load之類的是不可能只用10個週期的
用組合語言也作不到10個週期,更別說用C在編譯後會變成什麼,
但這倒不是什麼重點,一切都只是LCM在拖時間
只是看到有人有提供作法,該作者強調連DELAY都用不到,好奇而己
發表於 2013-12-19 23:43:45 | 顯示全部樓層
antlu 發表於 2013-12-19 10:22 PM static/image/common/back.gif
LEGION大:
  線路週六傳給你,感謝!! 我主要是練習使用 74HC595 推動 LCM !!

主要是antlu大你要自己去實作,
能解決是最好的辦法,也能弄清問題在那
真的作不出來時再幫你作一次看看,
應該是不用花太多時間的
倒是對想到改成用rs232模式,個人比較有興趣一些,但這是題外話了
還是麻煩antlu大你再努力一下了
發表於 2013-12-19 23:49:56 | 顯示全部樓層
xiaolaba 發表於 2013-12-19 10:30 PM static/image/common/back.gif
大大有沒有看過 LCM 是哪種的 CONTROLLER CHip

下面這個看了一下,應該是可以的
http://www.51hei.com/mcu/1360.html
但是使用的腳數就不只使用3個而己,
RS和EN都另外拉出來使用了,至少要使用到5個BIT操作
發表於 2013-12-20 00:12:07 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-20 12:16 AM 編輯
antlu 發表於 2013-12-19 10:18 PM static/image/common/back.gif
YSC大:
   http://www.adafruit.com/datasheets/TC1602A-01T.pdf
   這個LCM裡面提到的好像是相反,一開始 ...


您看到的跟我說的都一樣,並沒有相反........

一開始初始化時只管DB7-DB4,剩下的DB3-DB0忽略,但不是BIT 7-BIT 4先送一次,接著馬上又送BIT 3-BIT 0。

您再看清楚 4 bit 初始化流程,我貼的跟您提供的都一樣,初始化時BIT 3-BIT 0不要送進去。

可能我解釋得不好讓您無法理解,其他大大若看得懂請幫忙解釋一下,這應該是個很簡單的問題啊。

發表於 2013-12-20 00:22:09 | 顯示全部樓層
antlu 發表於 2013-12-19 10:18 PM static/image/common/back.gif
一開始 低的4BIT 都沒用到,直到起始完成之後才分家的!!  ...


這就是答案啦,一開始低的 4 BIT 沒用到,但您的程式有用到啊,高的 4 BIT 送出之後,又馬上送出低的 4 BIT,這會讓第二次送出的低 4 BIT 被誤認是另一個指令。
發表於 2013-12-20 00:36:02 | 顯示全部樓層
本帖最後由 ysc 於 2013-12-20 01:11 AM 編輯
antlu 發表於 2013-12-19 10:22 PM static/image/common/back.gif
LEGION大:
  線路週六傳給你,感謝!! 我主要是練習使用 74HC595 推動 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(0x28);  
   LCD_Write_Com(0x28);

   LCD_Write_Com(0x08);    /*/*显示关闭*/*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);   /*显示光标移动设置*/  
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }



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);
}


請注意 LCD_Init 第四個LCD_Write_Init(0x28) 之後馬上要接著 LCD_Write_Com(0x28),從這裡開始就是重複兩次的4 bit傳送。

LCD_Write_Init <------只送出高位 4 bit。
LCD_Write_Com <-------先送出高位 4bit,再送低位 4 bit。


發表於 2013-12-20 02:28:04 | 顯示全部樓層
legion 發表於 2013-12-19 11:38 PM static/image/common/back.gif
嗯,該怎麼說,是沒用過595去作這種事,所以單純用想像的,倒沒去想太多
不過8個bits shift再加上load之類的 ...

我講的週期不是說instruction cycle啦!! 指的是shift 1 bit到595的週期時間....

共要幾個instruction cycle都可以算出來啦......STC又是1T....有表可以查指令時間

LCD 1602執行一個指令大都要40us....但我是有遇過更龜的....當然更快的也有啦...
 樓主| 發表於 2013-12-20 05:35:52 | 顯示全部樓層
YSC大 LEGION大 OLDHAN大 XAOLABA大 IMCRAZY大:
清晨5:30 今天有事起的早!!平常都是10:00請床,匆匆之間使用 STC15F204EA (1T MCU) 先試了一下 YSC改的程式,結果"跟先前的依樣跑出亂碼",抱歉各位先進,晚上應該也沒有時間驗證,明天在戰了!! 感恩!!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2024-12-23 05:11 PM , Processed in 0.108653 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.