OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4519|回复: 3

stm32驱动12864完全显示不了

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-1-13
在线时间
0 小时
发表于 2014-1-13 17:16:12 | 显示全部楼层 |阅读模式

我用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
}


 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
发表于 2014-1-13 19:17:15 | 显示全部楼层
你用库函数写这么多,你家人知道吗?用寄存器吧!简单明了!论坛好多程序的自己搜搜!
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-1-13 21:05:08 | 显示全部楼层
好久没玩这个了,再仔细核对一下读写时序看看。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-14 09:02:35 | 显示全部楼层
回复【楼主位】huanglixing888:
---------------------------------
你的时序速度是不是快了点,仔细看看数据手册的时序图吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 17:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表