大佬你好!我是单片机小白,我想用stm32f103c8t6的a2和a3口实现LCD12864串行显示,但是不显示也不报错。下面是LCD.c里的内容,想请大佬帮我看看哪里有问题。
#include "stm32f10x.h"
#include "Delay.h"
#include "LCD.h"
#define LCD_E(x) GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)(x))//引脚配置
#define LCD_RW(x) GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)(x))
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据
/*引脚初始化*/
void LCD_GPIO_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
LCD_E(1);
LCD_RW(1);
}
/********************************************************************
* 名称 : LCD_SendByte
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : byte
* 输出 : 无
***********************************************************************/
void LCD_SendByte(u8 byte)//串行发送一个字节
{
u8 i;
for(i = 0;i < 8;i++)
{
if((byte << i) & 0x80) //0x80(1000 0000) 与运算保留最高位
{
LCD_RW(1); // 引脚输出高电平
}
else
{
LCD_RW(0); // 引脚输出低电平
}
LCD_E(0); //时钟线置低 允许RW变化
Delay_us(5); //延时使数据写入
LCD_E(1); //拉高时钟,读RW信号
}
}
/********************************************************************
* 名称 : LCD_WriteCommand
* 功能 : 写串口指令
* 输入 : cmdcode:指令
* 输出 : 无
***********************************************************************/
void LCD_WriteCommand(u8 Cmd )//写命令
{
Delay_ms(1); //
LCD_SendByte(WRITE_CMD); //11111,RW(0),RS(0),0
LCD_SendByte(0xf0&Cmd); //高四位
LCD_SendByte(Cmd<<4); //低四位(先执行<<)
}
/**
*
@Brief LCD写数据
*
@param Data 要写入的数据
*
@retval 无
*/
void LCD_WriteData(u8 Dat )
{
Delay_ms(1);
LCD_SendByte(WRITE_DAT); //11111,RW(0),RS(1),0
LCD_SendByte(0xf0&Dat); //高四位
LCD_SendByte(Dat<<4); //低四位(先执行<<)
}
/********************************************************************
* 名称 : LCD12864_SetLocation
* 功能 : 设置显示位置
* 输入 : pos_x: (0~15)
pos_y: (0~3)
* 输出 : 无
***********************************************************************/
static void LCD12864_SetLocation(uint8_t pos_x, uint8_t pos_y)
{
if (pos_y == 0x00)
{
pos_x += 0x80;
}
else if (pos_y == 0x01)
{
pos_x += 0x90;
}
else if (pos_y == 0x02)
{
pos_x += 0x88;
}
else
{
pos_x += 0x98;
}
LCD_WriteCommand(pos_x);
}
/********************************************************************
* 名称 : LCD_ShowString
* 功能 : LCD12864显示字符串
* 输入 : pos_x: (0~15)
pos_y: (0~3)
str:字符串
* 输出 : 无
***********************************************************************/
void LCD_ShowString(uint8_t pos_x, uint8_t pos_y, char *str)
{
LCD12864_SetLocation(pos_x, pos_y); // 设置显示位置
while (*str != '\0')
{
LCD_WriteData(*str++);
}
}
/********************************************************************
* 名称 : LCD_Init
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void LCD_Init(void)//LCD初始化
{
Delay_ms(50); //等待液晶自检
LCD_WriteCommand(0x30); //功能设定:选择基本指令集
Delay_ms(1);//延时>100us
LCD_WriteCommand(0x30); //功能设定:选择8位数据流
Delay_ms(1); //延时>37us
LCD_WriteCommand(0x0c); //开显示
Delay_ms(1); //延时>100us
LCD_WriteCommand(0x01); //清除显示,设定指针为00H
Delay_ms(30); //延时>10ms
LCD_WriteCommand(0x06); //进入设定点,初始化完成
}
void LCD_Clear(void)
{
LCD_WriteCommand(0x01); //LCD清屏
Delay_ms(2); //延时以待显示屏稳定
}