STM32F407點亮LCM顯示字符無顯示

2019-03-23 17:51发布

本帖最后由 街角的守候 于 2017-1-19 09:47 编辑

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"



#define RS PBout(9)
#define RW PBout(13)
#define E PBout(14)
#define BF PBin(10)
#define D3 PBout(10)
#define D2 PBout(7)
#define D1 PBout(6)
#define D0 PBout(12)



void check_BF(void)   //檢測LCM繁忙標誌
{
         E=0;
         do
         {
           BF=1;
           RS=0;RW=1;E=1;
         }while(BF==1);
}
//---------------------------------------------------------------------------------



void LCM_WCMD(u8 x)             //對LCM寫命令
{                u8 a;
                u8 AA[4];
          check_BF();


            for (a=0;a<4;a++)
            {
            AA[a]=x&0x80;
                  x=x<<1;
             }
           D3=AA[0];  
           D2=AA[1];
           D1=AA[2];
           D0=AA[3];
         RS=0;RW=0;E=1;
           check_BF();

}




//----------------------------------------------------------------------------------





void LCM_WCHAR(u8 chardata)        //讓LCM顯示字符
{
                u8 i;
          u8 AA[4];
        check_BF();


            for (i=0;i<4;i++)
        {
            AA=chardata&0x80;
          chardata=chardata<<1;
        }
          D3=AA[0];           
           D2=AA[1];
           D1=AA[2];
           D0=AA[3];
          RS=1;RW=0;E=1;
        check_BF();
}
//-------------------------------------------------------------------



void LCM_Init(void)
{
        
        
    GPIO_InitTypeDef  GPIO_InitStructure;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//時能GPIOB時鐘


        //GPIO初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_9 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
        

//-------------LCM初始化----------------------
        LCM_WCMD(0x20);//功能設定,使用4bit ,一列顯示
        delay_ms(1);
        LCM_WCMD(0x80);
        delay_ms(1);
        
        
        LCM_WCMD(0x20);//功能設定,使用4bit ,一列顯示
        delay_ms(1);
        LCM_WCMD(0x80);
        delay_ms(1);
        
        
        LCM_WCMD(0x20);//功能設定,使用4bit ,一列顯示
        delay_ms(1);
        LCM_WCMD(0x80);
        delay_ms(1);
        
        
        LCM_WCMD(0x20);//功能設定,使用4bit ,一列顯示
        delay_ms(1);
        LCM_WCMD(0x80);
        delay_ms(1);
        
               
        LCM_WCMD(0x00);//關閉顯示功能
        delay_ms(1);
        LCM_WCMD(0x80);//關閉顯示功能
        delay_ms(1);
        
        LCM_WCMD(0x00);//清楚顯示幕
        delay_ms(1);
        LCM_WCMD(0x10);//清楚顯示幕
        delay_ms(10);
        
        
        
        LCM_WCMD(0x00);//設定輸入模式,位址遞增,關顯示幕
        delay_ms(1);
        LCM_WCMD(0x60);//設定輸入模式,位址遞增,關顯示幕
        delay_ms(1);
        
        LCM_WCMD(0x00);//顯示功能-開顯示幕-無遊標-遊標不閃
        delay_ms(1);
        LCM_WCMD(0xc0);
        delay_ms(1);
}
int main(void)
{
        u8 m;
        u8 BB[4]={0x50,0x4C,0x53,0x77};//0X50為P,0x4C為L,0X53為S,0X77為w

        delay_init(168);     //延時初始化
        uart_init(115200);        //串口初始化
        LED_Init();                //LED燈的初始化
         LCM_Init();           //LCM的初始化
         LED0=1;              //LED0暫時不亮


                        LCM_WCMD(0X80);// LCM的第一列地址
                        delay_ms(1);
                        LCM_WCMD(0X00);
                for(m=0;m<4;m++)
                {
                                LCM_WCHAR(BB[m]);   //取高四位的值發送至LCM
                                delay_ms(1);
                               LCM_WCHAR(BB[m]<<4);  //取低四位的值發送至LCM
                                delay_ms(1);
           }
                delay_ms(100);
                LED0=!LED0; //LED0翻轉,點亮


}

有兩點比較疑惑:1. #define BF PBin(10),#define D3 PBout(10)這兩個為同一PIN,當LCM_WCMD(0X80)的時候,D3則為                                      1,此時BF去檢測,BF不就一直處於繁忙檢測嗎?
                            2. 例如PBout(10)=0X40,是不是PBout(10)就是輸出為1,理論上非0則為1?但從JTAG調試看,對應                                    的PIN并沒有為1。以上代碼不知道是不是由於這兩個疑惑問題導致?幫忙check下,LCM是一直沒有顯示對應的字符,通過調試,發現寫命令,寫字符的函數有問題。但是不知道哪裡問題

----------------LCM的data sheet如下-----------------------------------------------------
http://download.eeworld.com.cn/detail/%E8%A1%97%E8%A7%92%E7%9A%84%E5%AE%88%E5%80%99/563484




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。