21ic问答首页 - 新人求解,STM32F103的LCD12864串行模式的问题
新人求解,STM32F103的LCD12864串行模式的问题
yiyanfenghua2022-10-04
如何定义,这程序是否有问题,问题出在那?
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LCD.h"
#define RST_0 GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define RST_1 GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define PSB_0 GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define PSB_1 GPIO_ResetBits(GPIOB,GPIO_Pin_14)
#define CS_0 GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define CS_1 GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define SID_0 GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define SID_1 GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define SCLK_0 GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define SCLK_1 GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据
void lcd12864_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SID_1;
SCLK_1;
}
void send_dat(u8 dat)
{
u8 i;
for(i = 0;i < 8;i++)
{
if((dat& 0x80)==0x80)
SID_1;
if((dat& 0x80)==0x00)
SID_0;
SCLK_0;
Delay_ms(50);
SCLK_1;
dat<<=1;
}
}
/*!
* @brief LCD写指令
* @param Cmd 要写入的指令
*/
void send_cmd(u8 Cmd )
{
Delay_ms(1);
send_dat(WRITE_CMD);
send_dat(Cmd&0xf0);
send_dat((Cmd&0x0f)<<4);
}
/*!
* @brief LCD写数据
* @param Dat 要写入的数据
*/
void write_char(u8 Dat )
{
Delay_ms(1);
send_dat(WRITE_DAT);
send_dat(Dat&0xf0);
send_dat((Dat&0x0f)<<4);
}
/*!
* @brief LCD初始化
* @param None
*/
void Lcd_Init(void)
{
RST_0;
Delay_ms(50);
RST_1;
Delay_ms(50);
CS_1;
Delay_ms(50);
send_cmd(0x30);
Delay_ms(1);
send_cmd(0x0c);
Delay_ms(1);
send_cmd(0x01);
Delay_ms(30);
send_cmd(0x02);
Delay_ms(30);
send_cmd(0x80);
PSB_0;
}
void lcd_addr(uint8_t y_add,uint8_t x_add)
{
switch(y_add)
{
case 1:
send_cmd(0x80|x_add);break;
case 2:
send_cmd(0x90|x_add);break;
case 3:
send_cmd(0x88|x_add);break;
case 4:
send_cmd(0x98|x_add);break;
default:break;
}
}
/*!
* @brief 显示字符或汉字
* @param x: row(0~3)
* @param y: line(0~7)
* @param str: 要显示的字符或汉字
*/
void LCD_Display_Words(uint8_t y_add,uint8_t x_add , char *str)
{
uint8_t i;
lcd_addr(y_add,x_add);
for(i=0;str!='\0';i++)
{
write_char(str);
}
}
/*!
* @brief 清屏函数
* @param None
*/
void LCD_Clear(void)
{
send_cmd(0x01);
Delay_ms(2);
}
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LCD.h"
#define RST_0 GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define RST_1 GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define PSB_0 GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define PSB_1 GPIO_ResetBits(GPIOB,GPIO_Pin_14)
#define CS_0 GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define CS_1 GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define SID_0 GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define SID_1 GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define SCLK_0 GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define SCLK_1 GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据
void lcd12864_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SID_1;
SCLK_1;
}
void send_dat(u8 dat)
{
u8 i;
for(i = 0;i < 8;i++)
{
if((dat& 0x80)==0x80)
SID_1;
if((dat& 0x80)==0x00)
SID_0;
SCLK_0;
Delay_ms(50);
SCLK_1;
dat<<=1;
}
}
/*!
* @brief LCD写指令
* @param Cmd 要写入的指令
*/
void send_cmd(u8 Cmd )
{
Delay_ms(1);
send_dat(WRITE_CMD);
send_dat(Cmd&0xf0);
send_dat((Cmd&0x0f)<<4);
}
/*!
* @brief LCD写数据
* @param Dat 要写入的数据
*/
void write_char(u8 Dat )
{
Delay_ms(1);
send_dat(WRITE_DAT);
send_dat(Dat&0xf0);
send_dat((Dat&0x0f)<<4);
}
/*!
* @brief LCD初始化
* @param None
*/
void Lcd_Init(void)
{
RST_0;
Delay_ms(50);
RST_1;
Delay_ms(50);
CS_1;
Delay_ms(50);
send_cmd(0x30);
Delay_ms(1);
send_cmd(0x0c);
Delay_ms(1);
send_cmd(0x01);
Delay_ms(30);
send_cmd(0x02);
Delay_ms(30);
send_cmd(0x80);
PSB_0;
}
void lcd_addr(uint8_t y_add,uint8_t x_add)
{
switch(y_add)
{
case 1:
send_cmd(0x80|x_add);break;
case 2:
send_cmd(0x90|x_add);break;
case 3:
send_cmd(0x88|x_add);break;
case 4:
send_cmd(0x98|x_add);break;
default:break;
}
}
/*!
* @brief 显示字符或汉字
* @param x: row(0~3)
* @param y: line(0~7)
* @param str: 要显示的字符或汉字
*/
void LCD_Display_Words(uint8_t y_add,uint8_t x_add , char *str)
{
uint8_t i;
lcd_addr(y_add,x_add);
for(i=0;str!='\0';i++)
{
write_char(str);
}
}
/*!
* @brief 清屏函数
* @param None
*/
void LCD_Clear(void)
{
send_cmd(0x01);
Delay_ms(2);
}
赞0
评论
2022-10-08
赞0
评论
2022-10-08
赞0
GPIO_SetBits,输出高电平。
评论
2022-10-05
赞0
评论
2022-10-04
赞0
代码是我移植的,我自己在找找,看那出现的问题。
评论
2022-10-04
赞0
代码是LCD12864的卖家给的吗?是开发板配套的显示屏吗?有示波器吗?是否可以看看相关引脚波形?
这些代码不够啊,main都没看到,确定程序写对了?
LCD屏有多种型号,并非随便找个代码都能用,特别是初始化。
评论
2022-10-04
赞0
编译过了,烧进单片机没有效果,万般无奈才来这问大家,可能发帖的词语用的不太准确,对不起了。
tyw 注
评论
2022-10-04
高低电平定义没错? 延时时间正确?
赞0
评论
2022-10-04
@yiyanfenghua :这哪能看出来问题,谁闲得没事。 这得靠你自己动手去试,编译、烧写到单片机里运行才能看到效果。 “程序是否有问题”得问你自己,遇到了具体的问题才好拿出来问。
问,才疏学浅,不够能力
您需要登录后才可以回复 登录 | 注册