OpenEdv-开源电子网

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

求助:STM32驱动12864显示

[复制链接]

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
发表于 2016-1-28 22:04:40 | 显示全部楼层 |阅读模式
1金钱
如图显示,能显示数字和字母,但是显示的内容中间隔了一个空格,消除不掉,并且显示汉字就会是乱码...求助大神

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

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-1-28 22:43:54 | 显示全部楼层
12864没用过,应该跟OLED一样吧,分辨率也是128*64,我用的OLED是无字库的,要自己生成,用OLED显示过二值化以后的摄像头图像。中间有空格去不了应该跟你自己的字库有关系吧。因为我是自己做字库,所以汉字没出现过乱码的情况。现在很少人用这种这么大的显示屏了吧,都改用小的OLED了。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-1-28 23:41:43 来自手机 | 显示全部楼层
有两种字库,你看看datasheet,具体的忘了
回复

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-29 00:10:22 | 显示全部楼层
如果是全角符号或字母数字,则中间会有类似空格
全角 12345678
半角  12345678
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
 楼主| 发表于 2016-1-30 15:48:21 | 显示全部楼层
#include "stm32f10x.h"
#include "delay.h"   
#include "display12864.h"

#define u16 unsigned short   
#define u8 unsigned char

#define DisIOA GPIOA
#define DisIOB GPIOB
#define DisIOC GPIOC               
#define DisClkA RCC_APB2Periph_GPIOA
#define DisClkB RCC_APB2Periph_GPIOB
#define DisClkC RCC_APB2Periph_GPIOC

#define DataA GPIO_Pin_8|GPIO_Pin_9
#define DataB GPIO_Pin_14|GPIO_Pin_15
#define DataC GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9  
#define RS GPIO_Pin_12   //PA12
#define RW GPIO_Pin_11   //PA11
#define EN GPIO_Pin_10   //PA10   
#define PSB GPIO_Pin_13  //PB13   

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

void IOInitOut(void)           
{          
          GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
          GPIOStru.GPIO_Pin = DataA|EN|RW|RS;
          RCC_APB2PeriphClockCmd(DisClkA,ENABLE);
          GPIO_Init(DisIOA,&GPIOStru);
          
          GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
          GPIOStru.GPIO_Pin = PSB|DataB;
          RCC_APB2PeriphClockCmd(DisClkB,ENABLE);
          GPIO_Init(DisIOB,&GPIOStru);
          
          GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
          GPIOStru.GPIO_Pin = DataC;
          RCC_APB2PeriphClockCmd(DisClkC,ENABLE);
          GPIO_Init(DisIOC,&GPIOStru);
}

void IOInitIn(void)         
{
   
          GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
          GPIOStru.GPIO_Pin = DataA|RS|RW|EN;
          RCC_APB2PeriphClockCmd(DisClkA,ENABLE);
          GPIO_Init(DisIOA,&GPIOStru);
          
          GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
          GPIOStru.GPIO_Pin = PSB|DataB;
          RCC_APB2PeriphClockCmd(DisClkB,ENABLE);
          GPIO_Init(DisIOB,&GPIOStru);
            
          GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
          GPIOStru.GPIO_Pin = DataC;
          RCC_APB2PeriphClockCmd(DisClkC,ENABLE);
          GPIO_Init(DisIOC,&GPIOStru);       
}

void WaitBusy(void)         
{
    IOInitIn();        
    GPIO_ResetBits(DisIOA,RS);  //RS = 0.
    GPIO_SetBits(DisIOA,RW);    //RW = 1.
    GPIO_SetBits(DisIOA,EN);    //EN = 1.
    while(GPIO_ReadInputData(DisIOB) & 0x4000);
    GPIO_ResetBits(DisIOA,EN);  //EN = 0;
    IOInitOut();   
}

void WriteCmd(u8 cmd)   
{
            u8 cmdB,cmdB1;
          u8 cmdC,cmdC1;
          u8 cmdA,cmdA1;
          cmdB1=cmd & 0xC0;
         cmdB=(cmdB1<<1) | ((cmdB1 & 0x80)>>1);
       
          cmdC1=cmd & 0x3C;
        cmdC=((cmdC1 &0x04)<<3) | ((cmdC1 &0x08)<<1) | ((cmdC1 &0x10)>>1) | ((cmdC1 &0x20)>>3);
       
          cmdA1=cmd & 0x03;
          cmdA=(cmdA1>>1) | ((cmdA1&0x01)<<1);       
          WaitBusy();
    GPIO_ResetBits(DisIOA,RS);  //RS = 0.
    GPIO_ResetBits(DisIOA,RW);  //RW = 0.
    GPIO_SetBits(DisIOA,EN);    //EN = 1.
    DisIOB->ODR=((DisIOB->ODR & 0x3FFF)|  (cmdB<<8));                                   
    DisIOC->ODR=((DisIOC->ODR & 0xFc3F)| (cmdC<<4));
    DisIOA->ODR=((DisIOA->ODR & 0xFCFF)|(cmdA<<8));
    delay_ms(2);
    GPIO_ResetBits(DisIOA,EN);  //EN = 0;
    delay_ms(2);
    GPIO_SetBits(DisIOA,EN);               
}
void WriteData(u8 data)  
{
          u8 dataB,dataB1;
          u8 dataC,dataC1;
          u8 dataA,dataA1;       
          dataB1=data & 0xC0;
          dataB=(dataB1<<1) | ((dataB1 & 0x80)>>1);
          dataC1=data & 0x3C;
          dataC=((dataC1 &0x04)<<3) | ((dataC1 &0x08)<<1) | ((dataC1 &0x10)>>1) | ((dataC1 &0x20)>>3);
         dataA1=data & 0x03;
         dataA=(dataA1>>1) | ((dataA1&0x01)<<1);
          WaitBusy();
    GPIO_SetBits(DisIOA,RS);  //RS = 1.
    GPIO_ResetBits(DisIOA,RW);  //RW = 0.
    GPIO_SetBits(DisIOA,EN);    //EN = 1.                       
    DisIOB->ODR=((DisIOB->ODR & 0x3FFF)|  (dataB<<8));
    DisIOC->ODR=((DisIOC->ODR & 0xFc3F)| (dataC<<4));
    DisIOA->ODR=((DisIOA->ODR & 0xFCFF)|(dataA<<8));                       
    delay_ms(2);
    GPIO_ResetBits(DisIOA,EN);  //EN = 0;
    delay_ms(2);
    GPIO_SetBits(DisIOA,EN);               
}

void InitDis(void)  
{
    IOInitOut();        
    delay_init(8);   
    GPIO_SetBits(DisIOB,PSB);
    delay_ms(2);
    WriteCmd(0x34);
    delay_ms(2);
    WriteCmd(0x30);  
    delay_ms(2);
    WriteCmd(0x0c);  
    delay_ms(2);
    WriteCmd(0x01);   
    delay_ms(2);
    WriteCmd(0x04);  
    delay_ms(2);
    WriteCmd(0x80);   
    delay_ms(2);       
}

void DisStr(u8 *s)  
{
    while(*s != '\0')
    {
        WriteData(*s);
        s++;
        delay_ms(2);
    }
}

void DisInt(long int num)   
{
        u8 temp[17];
        u8 str[17];
        int i=0,j=0;
        while(num != 0)                                   
        {
                temp[i] = (num%10)+0x30;
                num/=10;
                i++;
        }
        i--;         
        while(i != -1)       
        {
                str[j] = temp[i];
                j++;
                i--;       
        }
        str[j]='\0';  
        DisStr(str);       
}

void DisFloat(float fnum)  
{
        long int num = fnum*10000;
        u8 temp[17];
        u8 str[17];
        int i=0,j=0;
        while(num != 0)                         
        {
                temp[i] = (num%10)+0x30;
                num/=10;
                i++;
                if(i == 4)          
                {
                        temp[i] = '.';
                        i++;
                }
        }
        i--;   
        while(i != -1)       
        {
                str[j] = temp[i];
                j++;
                i--;       
        }
        str[j]='\0';  
        DisStr(str);                       
}
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 display()
{
    unsigned char *p;
    unsigned char a[]="oá×&#248;±ê:";
    p=a;       
          DisStr("é&#194;&#206;÷&#206;÷°23¤°2′ó&#209;§");
          DisStr(p);
          DisInt(200);
          DisStr("&#195;×    ");
          DisStr("êú×&#248;±ê:");
          DisInt(300);
          DisStr("&#195;×    ");
          DisStr("×Y×&#248;±ê:");
          DisInt(200);
          DisStr("&#195;×    ");
          WriteCmd(0x98);
          DisStr("&#189;&#199;&#182;è:");
    DisInt(50);
          DisStr(" &#161;&#227;    ");
        */
          WriteCmd(0x80);
          DisInt(1000);       
    DisStr("abc   ");
}
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
 楼主| 发表于 2016-1-30 15:48:41 | 显示全部楼层
附一下代码
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
 楼主| 发表于 2016-1-30 15:49:19 | 显示全部楼层
夜猫煮茶 发表于 2016-1-29 00:10
如果是全角符号或字母数字,则中间会有类似空格
全角 12345678
半角  12345678

全角和半角是需要写命令字设置的是吧??
回复

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-30 22:35:53 | 显示全部楼层
zhang911 发表于 2016-1-30 15:49
全角和半角是需要写命令字设置的是吧??

带中文字库的那你应该是显示成全角的符号了。我没用过这类屏,所以不清楚是什么命令设置,但应该会的,查看一下手册应该可以找到的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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