|
stm32f103c8t6單片機(jī),lcd12864液晶顯示屏
用st-link下載程序后,顯示屏不顯示“welcome” (程序要求顯示welcome)
有大佬幫忙解答一下嗎? 謝謝!
接線:
#define LCD_GPIO GPIOA
#define LCD_EN PAout(2)
#define LCD_RW PAout(1)
#define LCD_RS PAout(0
下面是lcd12864.c函數(shù)
#include "lcd12864.h"
void delay20ms()
{
unsigned int i = 50;
while(i)
{
i = i - 1;
}
}
void LCD12864_int(void)
{
GPIO_Configuration();
// the initial delay time i make it all the same
//初始化命令之間的延時(shí)所有定義為最長(zhǎng)延時(shí),20ms 手冊(cè)上說是10 ms
//這個(gè)延時(shí)可能會(huì)有點(diǎn)怪,我是為了后面還有作用,測(cè)試他的極限延時(shí),
send_cmd(0x34) ;
delay20ms();
send_cmd(0x30) ;
delay20ms();
send_cmd(0x0c) ;
delay20ms();
send_cmd(0x01) ;
delay20ms();
send_cmd(0x06) ;
delay20ms();
}
//指定在液晶的哪一行顯示
void LCD12864_Pos(unsigned char x, unsigned char y)
{
unsigned char pos = 0;
send_cmd(0x30); //這里是最重要的 //,不同的功能切換的時(shí)候事先一定要聲明是在哪個(gè)模式下的命令
if(x == 0)
x = 0x80;
else if(x == 1)
x = 0x90;
else if(x == 2)
x = 0x88;
else if(x == 3)
x = 0x98;
pos = x + y;
send_cmd(pos);
}
//顯示一個(gè)數(shù)據(jù)函數(shù)
void show_word(unsigned char ch)
{
unsigned char data; //發(fā)送數(shù)據(jù),也是要分三個(gè)字節(jié)來發(fā)送,注意這次是fa開頭,是發(fā)送,且發(fā)送的是數(shù)據(jù)的意思
LCD_RS=1;
data = ch;
spi_function(0x0fa);
spi_function(data & 0xf0);
spi_function( (data << 4) & 0xf0);
LCD_RS=0;
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = LCD_EN | LCD_RW | LCD_RS ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_GPIO, &GPIO_InitStructure);
GPIO_SetBits(LCD_GPIO, LCD_EN | LCD_RW | LCD_RS); // turn off all led
}
//其實(shí)這貨是不是100us,我是沒算過,隨便給它個(gè)數(shù)值,讓他自己玩兒去。
void delay100us(void)
{
unsigned int i = 50;
while(i)
{
i = i - 1;
}
}
void spi_function(unsigned char del)
{
unsigned char i = 8 , data;
data = del;
LCD_EN=1; //每次發(fā)送的數(shù)據(jù)或者命令的話,都先拉高時(shí)鐘線和數(shù)據(jù)線
LCD_RW=1;
delay100us();
while(i)
{
if(data & 0x80)
LCD_RW=1;
else
LCD_RW=0;
delay100us();
LCD_EN = 0; //時(shí)鐘線拉高,延時(shí)一段時(shí)間再拉低,拉低意味著數(shù)據(jù)線上的數(shù)據(jù)要被12864鎖存了
delay100us();
delay100us();
LCD_EN=1;
delay100us();
data = data << 1;
i = i -1;
}
}
void send_cmd(unsigned char com) //發(fā)送命令,分三個(gè)字節(jié)發(fā)送,注意第一個(gè)字節(jié)哦,f8,是指發(fā)送動(dòng)作,且是發(fā)送命令
{
unsigned char data;
LCD_RS=1;
data = com;
spi_function(0x0f8);
spi_function(data & 0xf0);
spi_function( (data << 4) & 0xf0);
LCD_RS=0;
}
void LCD12864_write(unsigned char cmd,unsigned char dat)
{
unsigned char data; //發(fā)送數(shù)據(jù),也是要分三個(gè)字節(jié)來發(fā)送,注意這次是fa開頭,是發(fā)送,且發(fā)送的是數(shù)據(jù)的意思
LCD_RS=1;
data = dat;
if(cmd!=0) spi_function(0x0fa);
else spi_function(0x0f8);
spi_function(data & 0xf0);
spi_function( (data << 4) & 0xf0);
LCD_RS=0;
}
void LCD12864_writebyte(unsigned char *prointer)
{
while(*prointer!='\0')
{
LCD12864_write(1,*prointer);
prointer++;
}
}
void LCD12864_clear(void)
{
send_cmd(0x01); //清屏指令
delay_ms(2);
}
|
|