打印
[STM32F1]

关于STM32 控制LCD12864

[复制链接]
1205|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a554011401|  楼主 | 2015-7-23 17:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚接触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);     

}
沙发
a554011401|  楼主 | 2015-7-23 17:56 | 只看该作者
自顶一下

使用特权

评论回复
板凳
mmuuss586| | 2015-7-23 18:33 | 只看该作者

这个只能用示波器好好分析下时序了;
并降低读写速度;

使用特权

评论回复
地板
ticomi| | 2015-7-24 08:29 | 只看该作者
一般是时序和时隙问题,这个一定要符合规格才可以正常显示!

使用特权

评论回复
5
songchenping| | 2015-7-24 08:42 | 只看该作者
这玩意只能严格按时序要求来。建议楼主还是好好研究一下模块的时序要求吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝