|
本人用STM32F103 控制液晶 液晶的控制器为KS0108 ,无显示,但是 程序应该没有问题
程序如下://
#define Set_Disp_On 0x3F
#define Set_Disp_Off 0x3E
#define Set_Column 0x40
#define Set_Page 0xB8
#define Set_Start_Line 0xC0
void LCD_GPIO_CONFIG(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11
|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void LCD_GPIO_DATAIN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11
|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void LCD_GPIO_DATAOUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11
|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
//¶ÌÑÓʱ×Ó³ÌÐò
void Delay_us(int t)
{
while(--t);
}
void Delay_ms(unsigned int x)
{
unsigned int i,j;
for(j=0;j
for(i=0;i<=150;i++);
}
/****************************************************************************
//¼ì²âBUSY
****************************************************************************/
void LCM_Check_Busy(void)
{
u8 state=0;
GPIO_ResetBits(GPIOA, GPIO_Pin_6); // RS=0
Delay_us(10);
GPIO_SetBits(GPIOA, GPIO_Pin_7); // R/W=1
LCD_GPIO_DATAIN();
Delay_us(10);
do
{
GPIO_SetBits(GPIOC, GPIO_Pin_4); // E=1
Delay_us(100);
state=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_15);
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
Delay_us(100);
}while(state);
LCD_GPIO_DATAOUT();
}
//¼Ä´æÆ÷дÈ뺯Êý
void Write_0108_Reg(unsigned char Reg_Code)
{
u16 temp;
LCM_Check_Busy();
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
GPIO_ResetBits(GPIOA, GPIO_Pin_6); // RS=0
GPIO_ResetBits(GPIOA, GPIO_Pin_7); // R/W=0
// temp=GPIO_ReadOutputData(GPIOE); //
// temp&=0x00ff;
// GPIO_Write(GPIOE, ((u16)(Reg_Code<<8))|temp);
GPIO_Write(GPIOE, ((u16)(Reg_Code<<8)));
// temp=GPIO_ReadOutputData(GPIOE);
GPIO_SetBits(GPIOC, GPIO_Pin_4); // E=1
Delay_us(1000);
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
Delay_us(1000);
}
//Êý¾ÝдÈ뺯Êý
void Write_0108_Data(unsigned char Disp_Data)
{
u16 temp;
LCM_Check_Busy();
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
GPIO_SetBits(GPIOA, GPIO_Pin_6); // RS=1
GPIO_ResetBits(GPIOA, GPIO_Pin_7); // R/W=0
// temp=GPIO_ReadOutputData(GPIOE); //
// temp&=0x00ff;
// GPIO_Write(GPIOE, ((u16)(Disp_Data<<8))|temp);
GPIO_Write(GPIOE, ((u16)(Disp_Data<<8)));
// temp=GPIO_ReadOutputData(GPIOE);
Delay_us(1000);
GPIO_SetBits(GPIOC, GPIO_Pin_4); // E=1
Delay_us(1000);
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
Delay_us(1000);
}
//¶ÁÈ¡Êý¾Ýº¯Êý
unsigned char Read_0108_Data()
{
unsigned char Disp_Data;
LCM_Check_Busy();
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
LCD_GPIO_DATAIN();
GPIO_SetBits(GPIOA, GPIO_Pin_6); // RS=1
GPIO_SetBits(GPIOA, GPIO_Pin_7); // R/W=1
GPIO_SetBits(GPIOC, GPIO_Pin_4); // E=1
Disp_Data =GPIO_ReadInputData(GPIOE);
GPIO_ResetBits(GPIOC, GPIO_Pin_4); // E=0
LCD_GPIO_DATAOUT();
return Disp_Data;
}
//¼Ä´æÆ÷³õʼ»¯º¯Êý
void Iint_0108()
{
LCM_Check_Busy();
GPIO_SetBits(GPIOC, GPIO_Pin_5); // CSA=1
GPIO_SetBits(GPIOB, GPIO_Pin_0); // CSB=1
Write_0108_Reg(Set_Disp_Off);
Delay_us(10);
Write_0108_Reg(Set_Start_Line);
Delay_us(10);
Write_0108_Reg(Set_Page);
Delay_us(10);
Write_0108_Reg(Set_Column);
Delay_us(10);
Write_0108_Reg(Set_Disp_On);
Delay_us(10);
}
//Çå³ýÏÔʾ´æ´¢Æ÷
void Clr_Screen(void)
{
unsigned char j,k;
GPIO_SetBits(GPIOC, GPIO_Pin_5); // CSA=1
GPIO_ResetBits(GPIOB, GPIO_Pin_0); // CSB=0
for(k=0;k<8;k++)
{
Write_0108_Reg(Set_Page+k);
Write_0108_Reg(Set_Column);
for(j=0;j<64;j++)
Write_0108_Data(0xff);
}
GPIO_ResetBits(GPIOC, GPIO_Pin_5); // CSA=0
GPIO_SetBits(GPIOB, GPIO_Pin_0); // CSB=1
for(k=0;k<8;k++)
{
Write_0108_Reg(Set_Page+k);
Write_0108_Reg(Set_Column);
for(j=0;j<64;j++)
Write_0108_Data(0xff);
}
}
主要是IO 配置 写寄存器 写数据 等程序 ,按照时序图写的程序 ,求大神帮忙看看有什么问题,清屏幕那 我写的是0XFF ,应该全部黑点 但是现在屏幕什么都没有
|
|