我用stm32驱动12864,12864的PSB(连PC6),RS(pc7),RW(pc8),E(PC9),D0~D7(PB0~PB7),12864其他的管脚,我已经用另一块板配置好了,硬件是没问题的,大家能不能帮我看下,下面的程序,看有什么问题。
/*Include---------------------------*/
#include"stm32f10x_lib.h" //包含所有的头文件
#include<stdio.h>
//----------------函数声明--------------------
void GPIOB_INPUT_CONFIGURATION();
void GPIOB_OUTPUT_CONFIGURATION();
#define PSB_H GPIO_SetBits(GPIOC, GPIO_Pin_6);
#define PSB_L GPIO_ResetBits(GPIOC, GPIO_Pin_6);
#define RS_H GPIO_SetBits(GPIOC, GPIO_Pin_7);
#define RS_L GPIO_ResetBits(GPIOC, GPIO_Pin_7);
#define RW_H GPIO_SetBits(GPIOC, GPIO_Pin_8);
#define RW_L GPIO_ResetBits(GPIOC, GPIO_Pin_8);
#define E_H GPIO_SetBits(GPIOC, GPIO_Pin_9);
#define E_L GPIO_ResetBits(GPIOC, GPIO_Pin_9);
#define INPUT GPIOB_INPUT_CONFIGURATION();
#define OUTPUT GPIOB_OUTPUT_CONFIGURATION();
#define uchar unsigned char
#define uint unsigned int
void LCD_INIT(void);
void LCD_CLR(void);
void LCD_DISPLAY(uchar y_dat,uchar *pdat,uchar count);
void LCD_WRD(uchar data);
void LCD_WRI(uchar dat);
uchar ming[]="系统时钟";
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
/*******************************************************************************
* Function Name : fputc
* Description : 重定向(stdio)printf函数 文件流-》串口1 (USART1)
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int fputc(int ch,FILE *f)//printf在打印的时候会调用fputc函数,把打印的东西转到一个文件那里,我们可以把打印的东西打印到串口1(USART1)
{
//给USART1发送ch
USART_SendData(USART1, ch);
//等待发送完成
while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));
return ch;
}
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
RCC_Configuration();//打开系统时钟
GPIO_Configuration();
while(1)
{
LCD_INIT();
Delay_MS(50);
LCD_CLR();
LCD_DISPLAY(0x92,ming,4);
Delay_MS(50);
}
return 0;
}
///*******************************************************************************
//* Function Name : Delay_Ms
//* Description : delay 1 ms.
//* Input : dly (ms)
//* Output : None
//* Return : None
//*******************************************************************************/
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=1000;j>0;j--);
}
//
///*******************************************************************************
//* Function Name : RCC_Configuration
//* Description : Configures the different system clocks.
//* Input : None
//* Output : None
//* Return : None
//*******************************************************************************/
void RCC_Configuration(void)
{
//----------使用外部RC晶振-----------
RCC_DeInit(); //初始化为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
//FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source
//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能APB2外设的GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
}
//
///*******************************************************************************
//* Function Name : GPIO_Configuration
//* Description : 初始化GPIO外设
//* Input : None
//* Output : None
//* Return : None
//*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体就可以了
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |GPIO_Pin_9;//设置引脚8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//速度是50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//PC6,7,8,9为推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7;//设置引脚8
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度是50MHZ
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//PC6,7,8,9为推挽输出
// GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOC
}
void LCD_WRI(uchar dat)//这是用来传送为dat命令
{
//先读取忙标志位,看是否忙碌
uchar i;
RS_L;
RW_H;
do
{
//OUTPUT;
//GPIO_Write(GPIOB, 0X00FF);//在读取前把他们全部置1
INPUT;
E_H;
i=(GPIO_ReadInputData(GPIOB)&0x00ff);
E_L;
}
while(i&0x80);
//往GPIOB里面写数据
OUTPUT;
RW_L;
RS_L;
E_H;
GPIO_Write(GPIOB, dat);
Delay_MS(5);
E_L;
Delay_MS(5);
}
void LCD_WRD(uchar data)
{
//先读取忙标志位,看是否忙碌
uchar i;
RS_L;
RW_H;
do
{
//OUTPUT;
//GPIO_Write(GPIOB, 0XFFFF);//在读取前把他们全部置1
INPUT;
E_H;
i=(GPIO_ReadInputData(GPIOB)&0x00ff);
Delay_MS(5);
E_L;
}
while(i&0x80);
//往GPIOB里面写数据
OUTPUT;
RS_H;
RW_L;
E_H;
GPIO_Write(GPIOB, data);
Delay_MS(5);
E_L;
Delay_MS(5);
}
void LCD_DISPLAY(uchar y_dat,uchar *pdat,uchar count)
{
uchar i;
LCD_WRI(y_dat);//写要显示的首地址
for(i=0;i<count;i++)
{
LCD_WRD(pdat[i*2]);
LCD_WRD(pdat[i*2+1]);
Delay_MS(20);
}
}
void LCD_CLR(void)
{
LCD_WRD(0X01);
Delay_MS(10);
}
void LCD_INIT(void)
{
  SB_L;
Delay_MS(10);
  SB_H;
Delay_MS(10);
LCD_WRI(0x30);//采用8位并行数据传输
Delay_MS(10);
LCD_WRI(0x0c);//整体显示
Delay_MS(10);
LCD_WRI(0x01);//清楚所有显示
Delay_MS(10);
LCD_WRI(0x06);//每次数据显示时候,设置游标的移动
Delay_MS(10);
}
void GPIOB_INPUT_CONFIGURATION()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7;//设置引脚8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//速度是50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;//PC6,7,8,9为推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOC
}
void GPIOB_OUTPUT_CONFIGURATION()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7;//设置引脚8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//速度是50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//PC6,7,8,9为推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOC
}
|