急!!急!!!stm32F407 中12864时序正确 却不能显示字符,求大神指教

2019-07-20 17:21发布

本帖最后由 不吃番茄的菠菜 于 2017-1-16 11:32 编辑

#include "stm32f4xx.h"
#include "delay.h"
#include "12864.h"

#define u16 unsigned short                              
#define u8 unsigned char

/**********  **************/

#define DisIO GPIOD
#define DisIO_C GPIOC
#define DisClk RCC_AHB1Periph_GPIOC                    
#define Data GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15

#define RS GPIO_Pin_8                                 
#define RW GPIO_Pin_7                                 
#define EN GPIO_Pin_6                                                              

/*****************************/
                                                            
GPIO_InitTypeDef  GPIOStru;                        

/**** 输出端口初始化 *********/
void IOInitOut(void)                                    
{
      //RS RW EN
    RCC_AHB1PeriphClockCmd(DisClk,ENABLE);       //RCC_AHB1Periph_GPIOC
    GPIOStru.GPIO_Mode = GPIO_Mode_OUT;          //普通输出模式
    GPIOStru.GPIO_OType = GPIO_OType_PP;         // 推挽输出  
    GPIOStru.GPIO_PuPd=GPIO_PuPd_UP;           
    GPIOStru.GPIO_Speed = GPIO_Speed_100MHz;            
    GPIOStru.GPIO_Pin = RS|RW|EN;

    GPIO_Init(DisIO_C,&GPIOStru);                  //初始化控制端口

    //  背光PB15
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);   //使能时钟
    GPIOStru.GPIO_Pin=GPIO_Pin_15;                     
    GPIOStru.GPIO_Mode=GPIO_Mode_OUT;                   //普通输出模式
    GPIOStru.GPIO_OType=GPIO_OType_PP;                             //推挽模式
    GPIOStru.GPIO_PuPd=GPIO_PuPd_UP;                       //GPIO_PuPd_UP 上拉
    GPIOStru.GPIO_Speed=GPIO_Speed_100MHz;

    GPIO_Init(GPIOB,&GPIOStru);             //初始化数据端口

    //初始化数据口
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);   //使能时钟
    GPIOStru.GPIO_Pin=Data;                     
    GPIOStru.GPIO_Mode=GPIO_Mode_OUT;                   //普通输出模式
    GPIOStru.GPIO_OType=GPIO_OType_PP;           //推挽模式
    GPIOStru.GPIO_PuPd=GPIO_PuPd_UP;       //GPIO_PuPd_UP 上拉
    GPIOStru.GPIO_Speed=GPIO_Speed_100MHz;

    GPIO_Init(DisIO,&GPIOStru);             //初始化数据端口



}

/**** 输入端口初始化 *******/

void IOInitIn(void)                                    
{
    RCC_AHB1PeriphClockCmd(DisClk,ENABLE);
    GPIOStru.GPIO_Mode = GPIO_Mode_IN;          //GPIO_Mode_IN;    //定义数据引脚为浮空输入的变量初始化  
    GPIOStru.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = Data;                           
    GPIO_Init(DisIO,&GPIOStru);        

}

/********* 检忙函数 *************/
void WaitBusy(void)                                    
{
   // IOInitIn();                                         
    GPIO_ResetBits(DisIO_C,RS);                           //RS = 0.
    GPIO_SetBits(DisIO_C,RW);                             //RW = 1.
    GPIO_SetBits(DisIO_C,EN);                             //EN = 1.
    while(GPIO_ReadInputData(DisIO) & 0x0080);           //0x0080    0010
    GPIO_ResetBits(DisIO_C,EN);                           //EN = 0;
    IOInitOut();                                       
}

/********* 写命令*********************/
void WriteCmd(u8 cmd)                                   
{
    WaitBusy();                                         
    GPIO_ResetBits(DisIO_C,RS);                           //RS = 0.
    GPIO_ResetBits(DisIO_C,RW);                           //RW = 0.
    GPIO_SetBits(DisIO_C,EN);                             //EN = 1.
    DisIO->ODR=((DisIO->ODR & 0xff00)|cmd);         
    delay_ms(2);
    GPIO_ResetBits(DisIO_C,EN);                           //EN = 0;
    delay_ms(2);         
}

/*********  写数据 *********************/
void WriteData(u8 data)                                 
{
    WaitBusy();
    GPIO_SetBits(DisIO_C,RS);                             //RS = 1.
    GPIO_ResetBits(DisIO_C,RW);                           //RW = 0.
    GPIO_SetBits(DisIO_C,EN);                             //EN = 1.
    DisIO->ODR=((DisIO->ODR & 0xff00)|data);              //00ff
    delay_ms(10);
    GPIO_ResetBits(DisIO_C,EN);                           //EN = 0;
    delay_ms(10);
}

/*****   屏幕初始化 ****/
void InitDis(void)                             
{
    IOInitOut();         
    delay_init(8);         
    GPIO_SetBits(GPIOB,GPIO_Pin_15);
    delay_ms(20);
    WriteCmd(0x30);    //基本指令操作 和8位数据模式  30       0c                  
    delay_ms(20);
    WriteCmd(0x0c);     //开显示  无游标  不反白    0c       30                  
    delay_ms(20);
    WriteCmd(0x01);      //清除显示,并将DDRAM的地址计数器AC设为00H   01       80                 
    delay_ms(20);
    WriteCmd(0x06);     //设置,外部读写数据后,地址计数器AC会自动加1   06      60
    delay_ms(20);
    WriteCmd(0x80);     //将DDRAM地址计数器AC设为0    80       01               
    delay_ms(20);


}

/********* ****************/
void DisStr(u8 *s)                                    
{
    while(*s != '')
    {
        WriteData(*s);
        s++;
        delay_ms(5);                                 
    }
}









友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。