本人刚接触STM32,想控制LCD12864,代码下进去只有背光亮,还有矩形点阵,用逻辑分析仪检测过各个IO口电平,没有问题,以下是代码,求教:
#include "stm32f10x.h"
//RS B9
//RW B10
//EN B11
//PSB接高电平
//ret B13
//数据口 A0~A7
#define lcd_rs_h GPIO_SetBits(GPIOB,GPIO_Pin_9);
#define lcd_rs_l GPIO_ResetBits(GPIOB,GPIO_Pin_9);
#define lcd_rw_h GPIO_SetBits(GPIOB,GPIO_Pin_10);
#define lcd_rw_l GPIO_ResetBits(GPIOB,GPIO_Pin_10);
#define lcd_en_h GPIO_SetBits(GPIOB,GPIO_Pin_11);
#define lcd_en_l GPIO_ResetBits(GPIOB,GPIO_Pin_11);
#define lcd_rst_h GPIO_SetBits(GPIOB,GPIO_Pin_13);
#define lcd_rst_l GPIO_ResetBits(GPIOB,GPIO_Pin_13);
void RCC_Configuration(void);//时钟初始化
void GPIO_Configuration(void);//管脚初始化
void Timer_Delay_ms(u32 nus);
void LCD_position(u8 X,u8 Y);//位置函数
void write_com(u8 com);//写命令
void write_data(u8 data);//写数据
void init_LCD();//LCD初始化
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
init_LCD();
LCD_position(0,0);
Timer_Delay_ms(5);
write_data(0x34);
while(1);
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_Init_Structure;
GPIO_Init_Structure.GPIO_Pin=GPIO_Pin_All;
GPIO_Init_Structure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init_Structure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_Init_Structure);
GPIO_Init_Structure.GPIO_Pin=GPIO_Pin_All;
GPIO_Init_Structure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init_Structure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Init_Structure);
}
void Timer_Delay_ms(u32 nus)
{
u32 temp;
SysTick->LOAD=9000*nus;
SysTick->VAL=0x00;
SysTick->CTRL=0x01;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;
SysTick->VAL=0X00;
}
void write_com(u8 com)
{
Timer_Delay_ms(10);
lcd_rs_l;
Timer_Delay_ms(10);
lcd_rw_l;
Timer_Delay_ms(10);
lcd_en_l;
Timer_Delay_ms(10);
GPIO_Write(GPIOA,com);
Timer_Delay_ms(10);
lcd_en_h;
Timer_Delay_ms(10);
lcd_en_l;
}
void write_data(u8 data)
{
Timer_Delay_ms(10);
lcd_rs_h;
Timer_Delay_ms(10);
lcd_rw_l;
Timer_Delay_ms(10);
lcd_en_l;
Timer_Delay_ms(10);
GPIO_Write(GPIOA,data);
Timer_Delay_ms(10);
lcd_en_h;
Timer_Delay_ms(5);
lcd_en_l;
}
void init_LCD()
{
write_com(0x34);//扩充指令操作
Timer_Delay_ms(5);
write_com(0x30);//基本指令操作
Timer_Delay_ms(5);
write_com(0x0c);//开显示,关光标
Timer_Delay_ms(5);
write_com(0x01);//清除LCD
Timer_Delay_ms(5);
}
void LCD_position(u8 X,u8 Y)
{
u8 pos;
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 ;
write_com(pos);
} |