打印
[应用相关]

STM32与LCD12864的驱动问题

[复制链接]
926|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Erichk|  楼主 | 2017-8-26 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
12864应该是宽电压 3.3v应该能够驱动 为什么我的上电没有显示


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

#define u16 unsigned short   //为了可移植性好,对这两个 STM 32 已经定义过的变量,再定义一次。
#define u8 unsigned char

/********** 以下是相关引脚定义。**************/

#define DisIO GPIOC                 //定义12864要使用的I/O端口。
#define DisClk RCC_APB2Periph_GPIOC  //定义12864要使用的I/O端口的时钟。
#define Data GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
                                       //定义12864使用的数据引脚。
#define RS GPIO_Pin_9
#define RW GPIO_Pin_10
#define EN GPIO_Pin_11       //定义使能端使用的引脚。
#define PSB GPIO_Pin_12      //定义并,串行数据模式的选择端口使用的引脚。

GPIO_InitTypeDef  GPIOStru;  //定义用于定义所以引脚为输出的变量。

void IOInitOut(void)           //把所有端口初始化为推挽输出模式的函数。
{
    GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = Data|RS|RW|EN|PSB;

    RCC_APB2PeriphClockCmd(DisClk,ENABLE);
    GPIO_Init(DisIO,&GPIOStru);   
}

void IOInitIn(void)           //把数据引脚初始化为浮空输入的函数。
{
    GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定义数据引脚为浮空输入的变量初始化。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = Data;

    RCC_APB2PeriphClockCmd(DisClk,ENABLE);   //把所有端口初始化为输出模式的函数。   
    GPIO_Init(DisIO,&GPIOStru);   
}

void WaitBusy(void)          //等待12864的忙状态结束的函数。
{
    IOInitIn();        //把数据引脚定义为浮空输入;
    GPIO_ResetBits(DisIO,RS);  //RS = 0.
    GPIO_SetBits(DisIO,RW);    //RW = 1.
    GPIO_SetBits(DisIO,EN);    //EN = 1.
    while(GPIO_ReadInputData(DisIO) & 0x0080); //只要位7的值,位7是忙标志位。
    GPIO_ResetBits(DisIO,EN);  //EN = 0;
    IOInitOut();      //把所有引脚定义为输出。
}

void WriteCmd(u8 cmd)    //写命令函数。
{
//    WaitBusy();
    GPIO_ResetBits(DisIO,RS);  //RS = 0.
    GPIO_ResetBits(DisIO,RW);  //RW = 0.
    GPIO_ResetBits(DisIO,EN);    //EN = 0.
    DisIO->ODR=((DisIO->ODR & 0xff00)|cmd); //此处,只有直接操作寄存器才能
                  //达到,只改变输出数据寄存器ODR的低8位,其它位
                  //不变的目的。因为,只有低8位是数据引脚,
                  //其它位可能是控制引脚,不能改变。
   delay_init(8);
   delay_ms(2);
   GPIO_SetBits(DisIO,EN);    //EN = 1.
   delay_ms(2);
   GPIO_ResetBits(DisIO,EN);
   delay_ms(2);
}

void WriteData(u8 data)  //写数据函数。
{
//    WaitBusy();
    GPIO_SetBits(DisIO,RS);  //RS = 1.
    GPIO_ResetBits(DisIO,RW);  //RW = 0.
    GPIO_ResetBits(DisIO,EN);    //EN = 0.
    DisIO->ODR=((DisIO->ODR & 0xff00)|data);  //同上。
    delay_init(8);
    delay_ms(2);
    GPIO_SetBits(DisIO,EN);    //EN = 1.
    delay_ms(2);
    GPIO_ResetBits(DisIO,EN);
    delay_ms(2);
}

void InitDis(void)   //初始化 12864 和要用到的 STM 32 的引脚。
{
    IOInitOut();     
    delay_init(8);   //初始化延时函数的微妙计数基数。  
    GPIO_SetBits(DisIO,PSB);  //令PSB=1,设置为并行数据模式。
    delay_ms(2);
    WriteCmd(0x30);  //选择基本指令集,和,8位数据模式。
    delay_ms(2);
    WriteCmd(0x0c);  //开显示,无游标,不反白.
    delay_ms(2);
/*    WriteCmd(0x01);  //清除显示,并将 DDRAM 的地址计数器 AC 设为 00H.
    delay_ms(2);
    WriteCmd(0x06);  //设置,外部读写数据后,地址记数器 AC 会自动加 1。
    delay_ms(2);
    WriteCmd(0x80);  //将 DDRAM 地址计数器 AC 设为 0.
    delay_ms(2);                    */
}

/*以下是光标定位函数,第一个参数为行坐标,第二个为列坐标,起始坐标是1行1列。
只能以16个点的宽度为单位移动。*/

void locate16(int row, int col)
{
    switch(row)
    {
        case 1: WriteCmd(0x80+col-1); break;
        case 2: WriteCmd(0x90+col-1); break;
        case 3: WriteCmd(0x88+col-1); break;
        case 4: WriteCmd(0x98+col-1); break;
    }
}

/*光标定位函数定义结束。*/


void DisStr(u8 *s)    //显示字符串的函数。
{
    while(*s != '\0')
    {
        WriteData(*s);
        s++;
        delay_init(8);
        delay_ms(2);
    }
}
沙发
迪卡| | 2017-8-26 10:43 | 只看该作者
没看出来啥错误,而且在写命令和数据的时候有延时

使用特权

评论回复
板凳
冰河w| | 2017-8-26 10:56 | 只看该作者
这个是移植还是什么呢?

使用特权

评论回复
地板
Thorald| | 2017-8-26 11:22 | 只看该作者
液晶有几个问题,一个是初始化,一个事速度,一个电压!在就是你程序!

使用特权

评论回复
5
Bjorn| | 2017-8-26 16:07 | 只看该作者
应该用3.3V的12864

使用特权

评论回复
6
Rollo| | 2017-8-26 16:19 | 只看该作者
你查一下这个问题
void WaitBusy(void)          //等待12864的忙状态结束的函数。
{
    IOInitIn();        //把数据引脚定义为浮空输入;
    GPIO_ResetBits(DisIO,RS);  //RS = 0.
    GPIO_SetBits(DisIO,RW);    //RW = 1.
    GPIO_SetBits(DisIO,EN);    //EN = 1.
    while(GPIO_ReadInputData(DisIO) & 0x0080); //只要位7的值,位7是忙标志位。
    GPIO_ResetBits(DisIO,EN);  //EN = 0;
    IOInitOut();      //把所有引脚定义为输出。
}
while(GPIO_ReadInputData(DisIO) & 0x0080); //只要位7的值,位7是忙标志位。
这句话。不是这样的。

使用特权

评论回复
7
Rangar| | 2017-8-26 16:29 | 只看该作者
有没有弄好了的程序,我用的也是5V的12864,程序写好了,但是液晶没有显示,找不到问题

使用特权

评论回复
8
usstwk| | 2017-9-2 10:44 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

500

帖子

0

粉丝