OpenEdv-开源电子网

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

STM32驱动12864显示

[复制链接]

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
发表于 2016-1-28 22:01:57 | 显示全部楼层 |阅读模式
如图显示,能显示数字和字母,但是显示的内容中间隔了一个空格,消除不掉,并且显示汉字就会是乱码...求助大神
IMG_20160128_215708R.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-28 23:11:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-28
在线时间
5 小时
发表于 2016-1-29 10:59:41 | 显示全部楼层
1,注意字符显示起始点和结束点。2,取模格式,3,给出源码给出源码给出源码
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-28
在线时间
5 小时
发表于 2016-1-29 11:01:18 | 显示全部楼层
你取模的格式不对。显示汉字的取模和你调用函数的不对应。
比如说,你取模是16*16,但是你OLED的函数是8*16的
回复 支持 反对

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
 楼主| 发表于 2016-1-30 15:44:36 | 显示全部楼层
ZHANGPENGJIAO 发表于 2016-1-29 10:59
1,注意字符显示起始点和结束点。2,取模格式,3,给出源码给出源码给出源码

#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 = (num%10)+0x30;
                num/=10;
                i++;
        }
        i--;         
                        //&#214;&#184;&#207;ò×&#238;oóò&#187;&#184;&#246;′&#230;′¢óDó&#195;&#214;μμ&#196;&#212;a&#203;&#216;μ&#196;oóò&#187;&#184;&#246;&#206;&#187;&#214;&#195;&#161;£
        while(i != -1)         //òò&#206;ai=0ê±£&#172;temp[0]&#187;1ê&#199;óDó&#195;&#214;μ&#161;£
        {
                str[j] = temp;
                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 = (num%10)+0x30;
                num/=10;
                i++;
                if(i == 4)          
                {
                        temp = '.';
                        i++;
                }
        }
        i--;   
        while(i != -1)       
        {
                str[j] = temp;
                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:45:55 | 显示全部楼层
代码复制过来,显示的汉字是乱码了,抱歉,将就着看一下吧
回复 支持 反对

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
 楼主| 发表于 2016-1-30 15:46:23 | 显示全部楼层

你好,屏幕是自带的中文字库
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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