OpenEdv-开源电子网

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

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

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-1-16
在线时间
21 小时
发表于 2017-1-16 11:29:58 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 不吃番茄的菠菜 于 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 != '\0')
    {
        WriteData(*s);
        s++;
        delay_ms(5);                                 
    }
}









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

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-1-16 11:40:30 | 显示全部楼层
12864要求时序 不要太快
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-1-16
在线时间
21 小时
 楼主| 发表于 2017-1-16 11:54:05 | 显示全部楼层
Electronic 发表于 2017-1-16 11:40
12864要求时序 不要太快

我用的是原子哥的 延时函数    这个算快吗?
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-1-16 11:55:23 | 显示全部楼层
以前及时51单片机,12T的单片机,12M的时钟,有时候不加延时都会出现问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 07:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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