stm32 lcd19264驅動程序無法顯示,背光亮了,但是文字沒法顯示


求問哪里出了問題,難道是我的硬件連接錯了嗎?求高手指正!!!

頭文件:
#include "stm32f4xx_conf.h"        
#include "stdint.h"
#include "stm32f4xx.h"
#include "stdint.h"
#ifndef __LCD_DRIVER_H
#define __LCD_DRIVER_H


#define LCD_RS  GPIOB, GPIO_Pin_0// PB.0
#define LCD_E   GPIOB, GPIO_Pin_1// PB.1 
#define LCD_CS1 GPIOB, GPIO_Pin_2// PB.2
#define LCD_RST GPIOB, GPIO_Pin_3// PB.3
#define LCD_CS2 GPIOB, GPIO_Pin_4// PB.4 
#define LCD_CS3 GPIOB, GPIO_Pin_5// PB.5
#define LCD_RW  GPIOB, GPIO_Pin_6// PB.6
#define LCD_DATA_IN(x)  GPIOE->IDR=(GPIOE->IDR&0x807F)|((x & 0x00FF)<<7) //PE7~14,作為數據線
#define LCD_DATA_OUT(x)  GPIOE->ODR=(GPIOE->ODR&0x807F)|((x & 0x00FF)<<7) //PE7~14,作為數據線
#define LCD_PAGE_ADDR 0xb8 
#define LCD_COL_ADDR  0x40    

void wtcom(void);
void Locatexy(void);
void SelectChip1(void);
void SelectChip2(void);
void SelectChip3(void);
void WriteCommandL( unsigned char CommandByte );
void WriteCommandM( unsigned char CommandByte );
void WriteCommandR( unsigned char CommandByte );
void LcmClear( void );
void LcmInit( void );
void LcmPutDots( unsigned char DotByte );
void LcmPutHeng( unsigned char DotByte );
void LcmPutBMP( unsigned char *puts );
void LcmPutHz(unsigned char Col_x,unsigned char Page_y,unsigned char *puts );

#endif

驅動程序:
#include "Lcd_Driver.h"
#include "delay.h"
//function all         函數定義=========================

unsigned int Page;     //頁 地址
unsigned int Col;   //列 地址
void LCDPortSet(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;                        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 // 最高輸入速率50MHz
  GPIO_Init(GPIOE, &GPIO_InitStructure);                                 // 選擇E端口,連接數據線

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|
        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        GPIO_SetBits(GPIOB, GPIO_Pin_0);
        GPIO_SetBits(GPIOB, GPIO_Pin_1);
        GPIO_SetBits(GPIOB, GPIO_Pin_2);
        GPIO_SetBits(GPIOB, GPIO_Pin_3);
        GPIO_SetBits(GPIOB, GPIO_Pin_4);
        GPIO_SetBits(GPIOB, GPIO_Pin_5);
        GPIO_SetBits(GPIOB, GPIO_Pin_6);
}

void SelectChip1(void) //選擇第1屏
{
        GPIO_ResetBits(LCD_CS1);
        GPIO_SetBits(LCD_CS2);
        GPIO_SetBits(LCD_CS3);
        wtcom();
}

void SelectChip2(void) //選擇第2屏
{
        GPIO_SetBits(LCD_CS1);
        GPIO_ResetBits(LCD_CS2);
        GPIO_SetBits(LCD_CS3);
        wtcom();
}
void SelectChip3(void) //選擇第3屏

        GPIO_SetBits(LCD_CS1);
        GPIO_SetBits(LCD_CS2);
        GPIO_ResetBits(LCD_CS3);  
        wtcom();
}

void wtcom(void)
{
                                //BUSY_CS=0;  //堅鴻測試架增加指令,控制P0.7輸入輸出
        GPIO_ResetBits(LCD_RS);  //RS = 0;         //指令
        GPIO_SetBits(LCD_RW);//RW = 1;
        //P0 = 0xFF;      //輸出0xff以便讀取正確
        GPIO_SetBits(LCD_E);//E  = 1;
        Delay(200);
        //while(P0 & 0x80);       //Status Read Bit7 = BUSY
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
        //GPIO_SetBits(LCD_CS);//BUSY_CS=1;
}

/********************************************************/
/*根據設定的坐標數據,定位LCM上的下一個操作單元位置     */
/********************************************************/
void Locatexy(void)
{
        
        unsigned char x,y;
        switch (Col&0xc0)       /*  col.and.0xC0        */
        {                       /*條件分支執行          */
          case 0:                                 {SelectChip1();break;}/*左區  */
          case 0x40:      {SelectChip2();break;}/*中區  */
          case 0x80:      {SelectChip3();break;}/*右區  */
        }
        x = Col&0x3F|0x40;      /* col.and.0x3f.or.Set Y Address*/
        y = Page&0x07|0xB8;     /* row.and.0x07.or.set Page     */
        wtcom();                /* waitting for enable  */
        GPIO_ResetBits(LCD_RS);//RS = 0;                 //指令
        GPIO_ResetBits(LCD_RW);//RW = 0;                 //寫
        LCD_DATA_OUT(y);                 //設置頁面地址
        GPIO_SetBits(LCD_E);//E  = 1;
        Delay(200);
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
        wtcom();                /*  waitting for enable */
        GPIO_ResetBits(LCD_RS);//RS = 0;
        GPIO_ResetBits(LCD_RW);//RW = 0;
        LCD_DATA_OUT(x);                 //設置列地址
        GPIO_SetBits(LCD_E);//E  = 1;
        Delay(200);
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
}

/***************************/
/*寫指令                   */
/***************************/
void WriteCommandL( unsigned char CommandByte )
{
        SelectChip1();
        //P1 = CommandByte;
        GPIO_ResetBits(LCD_RS);//RS = 0;         //指令
        GPIO_ResetBits(LCD_RW);//RW = 0;
                                LCD_DATA_OUT(CommandByte);
        GPIO_SetBits(LCD_E);//E  = 1;
        Delay(200);
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
}

void WriteCommandM( unsigned char CommandByte )
{
        SelectChip2();
       //P1 = CommandByte;
        GPIO_ResetBits(LCD_RS);//RS = 0;         //指令
        GPIO_ResetBits(LCD_RW);//RW = 0;
                                LCD_DATA_OUT(CommandByte);
        GPIO_SetBits(LCD_E);//E  = 1;
        Delay(200);
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
}

void WriteCommandR( unsigned char CommandByte )
{
                                SelectChip3();
        //P1 = CommandByte;
        GPIO_ResetBits(LCD_RS);//RS = 0;         //指令
        GPIO_ResetBits(LCD_RW);//RW = 0;
                                LCD_DATA_OUT(CommandByte);
        GPIO_SetBits(LCD_E);//E  = 1;
        Delay(200);
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
}

/***************************/
/*讀數據                   */
/***************************/
unsigned char ReadData( void )
{
                                unsigned char DataByte;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|
        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_PuPd = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        Locatexy();     /*坐標定位,返回時保留分區狀態不變      */
        GPIO_SetBits(LCD_RS);//RS = 1;         /*數據輸出*/
        GPIO_SetBits(LCD_RW);//RW = 1;         /*讀入  */
        LCD_DATA_OUT(0xFF);//P1 = 0xFF;              //輸出0xff以便讀取正確
        GPIO_SetBits(LCD_E);//E  = 1;         /*讀入到LCM*/
        Delay(200);
        DataByte=LCD_DATA_OUT(0xFF);//DataByte = P1;  /*數據讀出到數據口P1 */
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|
        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        return DataByte;
}


/***************************/
/*寫數據                   */
/***************************/
void WriteData( unsigned char DataByte )
{
        Locatexy();     /*坐標定位,返回時保留分區狀態不變      */
        GPIO_SetBits(LCD_RS);//RS = 1;         /*數據輸出*/
        GPIO_ResetBits(LCD_RW);//RW = 0;         /*寫輸出  */
        Delay(200);
        LCD_DATA_OUT(DataByte);  /*數據輸出到數據口 */
        GPIO_SetBits(LCD_E);//E  = 1;         /*寫入到LCM*/
        Delay(200);
        GPIO_ResetBits(LCD_E);//E  = 0;
        Delay(200);
}

void LcmClear( void )
{
        Page = 0;
        Col  = 0;
        for(Page=0;Page<8;Page++)
                for(Col=0;Col<192;Col++)
                        WriteData(0x00);
}

void LcmInit( void )
{
        WriteCommandL(0x3f);    //開顯示
        WriteCommandM(0x3f);
        WriteCommandR(0x3f);

        WriteCommandL(0xc0);    //設置起始地址=0
        WriteCommandM(0xc0);
        WriteCommandR(0xc0);

        WriteCommandL(0x3f);    //開顯示
        WriteCommandM(0x3f);
        WriteCommandR(0x3f);

        LcmClear();
        Col = 0;
        Page= 0;
        Locatexy();
}

void LcmPutDots( unsigned char DotByte )
{
        Page = 0;
        Col  = 0;
        for(Page=0;Page<8;Page++)
        {
                for(Col=0;Col<100;Col++)
                {
                        WriteData( DotByte );
                        DotByte = ~DotByte;
                }
        }
}

void LcmPutHeng( unsigned char DotByte )
{
        Page = 0;
        Col  = 0;
        for(Page=0;Page<8;Page++)
        {
                for(Col=0;Col<192;Col++)
                {
                        WriteData( DotByte );
                }
        }
}

void LcmPutBMP( unsigned char *puts )
{
        unsigned int X=0;
        Page = 0;
        Col  = 0;
        for(Page=0;Page<8;Page++)
        {
                for(Col=0;Col<192;Col++)
                {
                        WriteData( puts[X] );
                        X++;
                }
        }
}

void LcmPutHz(unsigned char Col_x,unsigned char Page_y,unsigned char *puts )
{
        unsigned int X=0;
        for(Page=Page_y;Page<2+Page_y;Page++)
        {
            for(Col=Col_x;Col<16+Col_x;Col++)
             {
             WriteData( puts[X] );
             X++;
             }
          }
}

3 个解决方案

#1


我用的是stm32F407的開發板

#2


在線等!!!!!

#3


頂一個,求助~

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com