#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,"你好");
}
}
这段程序哪有问题?时序问题我不太会,求大神。。。。。。。。
此帖出自
小平头技术问答
一周热门 更多>