关于stm8驱动12864的程序问题

2019-03-23 18:35发布

#include"stm8s.h"
#include"stdio.h"
#define uchar unsigned char
#define u32 unsigned long
#define u8 unsigned long

#define RS     GPIOC,GPIO_PIN_2
#define RW      GPIOC,GPIO_PIN_3
#define E      GPIOE,GPIO_PIN_6
#define RSB      GPIOC,GPIO_PIN_1
#define lcd_D0   GPIO_ReadInputPin(GPIOB, GPIO_PIN_0)
#define lcd_D1   GPIO_ReadInputPin(GPIOB, GPIO_PIN_1)
#define lcd_D2   GPIO_ReadInputPin(GPIOB, GPIO_PIN_2)
#define lcd_D3   GPIO_ReadInputPin(GPIOB, GPIO_PIN_3)
#define lcd_D4   GPIO_ReadInputPin(GPIOB, GPIO_PIN_4)
#define lcd_D5   GPIO_ReadInputPin(GPIOB, GPIO_PIN_5)
#define lcd_D6   GPIO_ReadInputPin(GPIOB, GPIO_PIN_6)
#define lcd_D7   GPIO_ReadInputPin(GPIOB, GPIO_PIN_7)

#define RS_LOW() GPIO_WriteLow(GPIOC, GPIO_PIN_2);
#define RS_HIGH() GPIO_WriteHigh(GPIOC, GPIO_PIN_2);

#define RW_LOW() GPIO_WriteLow(GPIOC, GPIO_PIN_3);
#define RW_HIGH() GPIO_WriteHigh(GPIOC, GPIO_PIN_3);

#define E_LOW() GPIO_WriteLow(GPIOE, GPIO_PIN_6);
#define E_HIGH() GPIO_WriteHigh(GPIOE, GPIO_PIN_6);

#define PSB_LOW() GPIO_WriteLow(GPIOC, GPIO_PIN_1);
#define PSB_HIGH() GPIO_WriteHigh(GPIOC, GPIO_PIN_1);


void GPIO_configuration()
{
  GPIO_DeInit(GPIOC);
  GPIO_DeInit(GPIOE);
  GPIO_DeInit(GPIOD);
  GPIO_Init(GPIOC, GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);

}
uchar ReadByte(void)
{
  u8 res=0;
  res=(lcd_D0<<0)|(lcd_D1<<1)|(lcd_D2<<2)|(lcd_D3<<3)|(lcd_D4<<4)|(lcd_D5<<5)|(lcd_D6<<6)|(lcd_D7<<7);
  return res;
}
/**********************
延时
**********************/
void delay_us(u16 z)     //微秒延时
{
  while(z--)
  {
    nop();nop();nop();nop();
  }
}
void delay(u32 i)
{
  TIM2_DeInit();//TIME2初始化
  TIM2_TimeBaseInit(TIM2_PRESCALER_64,25000);//配置TIME2内部时钟基准
  while(i--)
  {
  TIM2_Cmd(ENABLE);//开启TIME2使能,关为DISABLE
  while((TIM2_GetFlagStatus(TIM2_FLAG_UPDATE   ))!=1);//通过查询法是否产生更新时间,判断延时是否结束
  TIM2_ClearFlag(TIM2_FLAG_UPDATE);
  TIM2_Cmd( DISABLE);

}
}
void delay_ms(u16 z)    //毫秒延时
{
  u16 i = 0;
  while(z--)
  {
    for(i = 0;i<1000;i++);
  }
}
void CLK_configuration()
{
  CLK_DeInit();
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
  CLK_HSICmd(ENABLE);
}
//LCD判忙
uchar LCD_READ(void)
{
  u8 res=0;
  RS_LOW();
  RW_HIGH();
  E_HIGH();
  GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_IN_FL_NO_IT);
// delay_us(5);
   delay(5);
  res=GPIO_ReadInputData(GPIOD);
  E_LOW();
  return res;
}
void com(unsigned char com)//写命令
{
   //while(LCD_BUSY());
   RS_LOW();
   RW_LOW();
   E_LOW();
   //delay_us(5);
     delay(5);
  GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);

   //GPIO_Write(GPIOD,com);
  GPIOB->ODR=((GPIOB->ODR & 0X00)|com);
   //delay_us(5);
      delay(5);
   E_HIGH();
   // delay_us(5);
    nop();
      delay(5);
}
void dat(unsigned char dat)//写数据
{

   //while(LCD_BUSY());
   RS_HIGH();
   RW_LOW();
   E_LOW();
     delay(5);
  GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);

   //GPIO_Write(GPIOD,dat);
  GPIOB->ODR=((GPIOB->ODR & 0X00)|dat);
   //delay_us(5);
      delay(5);
   E_HIGH();
   // delay_us(5);
      delay(5);
    E_LOW();
}
void  LCD12864_Init(void)
{
   PSB_HIGH();
   com(0x34);
   delay_ms(100);
   com(0x30);
   delay_ms(100);
   com(0x0C);
   delay_ms(100);
   com(0x01);
   delay_ms(5);          
}
void display(uchar X,uchar Y,char *string)
{

if(X==0)

{

X = 0x80 ;

}

else if(X==1)

{

X = 0x90 ;

}

else if(X==2)

{

X = 0x88 ;

}

else if(X==3)

{

X = 0x98 ;

}

com(X+Y);

while(*string)

{

dat(*string++); }

}
void main()
{
  GPIO_configuration();
// CLK_configuration();
  LCD12864_Init();
  while(1)
  {
    display(1,1,"你好");
  }
}
这段程序哪有问题?时序问题我不太会,求大神。。。。。。。。

此帖出自小平头技术问答
0条回答

一周热门 更多>