本帖最后由 街角的守候 于 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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>