野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10184|回复: 3

[HELP]OLED的滚动显示

[复制链接]
发表于 2017-3-19 00:15:41 | 显示全部楼层 |阅读模式
本帖最后由 janson 于 2017-3-19 00:17 编辑

基本功能能实现,其实也不难,主要能知道OLED显示原理就好办了大概思路,定义一个二维数组当做显存,将字符数据存进去,滚动时候一次从第一列、第二列、第三列。。。。刷,这样就形成滚动了
/****************************1ö¶ˉμÄÎÄ×Ö******************************/
        txt_long=display_GB2312_string_G("一二三四五六七八九十个十百千万");        
        while(1)        
        {
                /******************************************/               
                        lcd_cs1(0);        
                        transfer_command_lcd(0xb0 + 1);                 
                        transfer_command_lcd(0x00);
                        transfer_command_lcd(0x10);
                       for (i=0;i<2;i++)
                                for(j=s;j<s+128;j++)
                                        if(j>txt_long)
                                                        transfer_data_lcd(RollBuf[j-txt_long]);        
                                        else
                                                        transfer_data_lcd(RollBuf[j]);        
                       lcd_cs1(1);                        
                         s++;
                      if(s==txt_long)     s=0;
}
unsigned char display_GB2312_string_G(uchar *text)
{

        uchar i= 0,x=0;
        uchar addrHigh,addrMid,addrLow ;

        while((text>0x00))
        {
                if(((text>=0xb0) &&(text<=0xf7))&&(text[i+1]>=0xa1))   //字库的寻址方式
                {                                                
                        fontaddr = (text- 0xb0)*94;
                        fontaddr += (text[i+1]-0xa1)+846;
                        fontaddr = (ulong)(fontaddr*32);
                        
                        addrHigh = (fontaddr&0xff0000)>>16;  /*μ&#216;&#214;·μ&#196;&#184;&#223;8&#206;&#187;,1224&#206;&#187;*/
                        addrMid = (fontaddr&0xff00)>>8;      /*μ&#216;&#214;·μ&#196;&#214;D8&#206;&#187;,1224&#206;&#187;*/
                        addrLow = fontaddr&0xff;             /*μ&#216;&#214;·μ&#196;μí8&#206;&#187;,1224&#206;&#187;*/
                        get_n_bytes_data_from_ROM_G(x,addrHigh,addrMid,addrLow,32 );/*è&#161;32&#184;&#246;×&#214;&#189;úμ&#196;êy&#190;Y£&#172;′&#230;μ&#189;"fontbuf[32]"*/
//                        display_graphic_16x16(y,x,fontbuf);/*&#207;&#212;ê&#190;oo×&#214;μ&#189;LCDé&#207;£&#172;y&#206;aò3μ&#216;&#214;·£&#172;x&#206;aáDμ&#216;&#214;·£&#172;fontbuf[]&#206;aêy&#190;Y*/
                        i+=2;
                        x+=16;
                }
                else if(((text>=0xa1) &&(text<=0xa3))&&(text[i+1]>=0xa1))
                {                                                
                        /*1ú±ê&#188;òì&#229;£¨GB2312£&#169;15x16μ&#227;μ&#196;×&#214;·&#251;&#212;ú&#190;§áa&#209;&#182;×&#214;&#191;aIC&#214;Dμ&#196;μ&#216;&#214;·óéò&#212;&#207;&#194;1&#171;ê&#189;à′&#188;&#198;&#203;&#227;£o*/
                        /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
                        /*óéóúμ£D&#196;8&#206;&#187;μ¥&#198;&#172;&#187;úóD3&#203;·¨ò&#231;3&#246;&#206;êìa£&#172;&#203;ùò&#212;·&#214;èy2&#191;è&#161;μ&#216;&#214;·*/
                        fontaddr = (text- 0xa1)*94;
                        fontaddr += (text[i+1]-0xa1);
                        fontaddr = (ulong)(fontaddr*32);
                        
                        addrHigh = (fontaddr&0xff0000)>>16;  /*μ&#216;&#214;·μ&#196;&#184;&#223;8&#206;&#187;,1224&#206;&#187;*/
                        addrMid = (fontaddr&0xff00)>>8;      /*μ&#216;&#214;·μ&#196;&#214;D8&#206;&#187;,1224&#206;&#187;*/
                        addrLow = fontaddr&0xff;             /*μ&#216;&#214;·μ&#196;μí8&#206;&#187;,1224&#206;&#187;*/
                        get_n_bytes_data_from_ROM_G(x,addrHigh,addrMid,addrLow,32 );/*è&#161;32&#184;&#246;×&#214;&#189;úμ&#196;êy&#190;Y£&#172;′&#230;μ&#189;"fontbuf[32]"*/
//                        display_graphic_16x16(y,x,fontbuf);/*&#207;&#212;ê&#190;oo×&#214;μ&#189;LCDé&#207;£&#172;y&#206;aò3μ&#216;&#214;·£&#172;x&#206;aáDμ&#216;&#214;·£&#172;fontbuf[]&#206;aêy&#190;Y*/
                        i+=2;
                        x+=16;
                }
                else if((text>=0x20) &&(text<=0x7e))        
                {                                                               
                        fontaddr = (text- 0x20);
                        fontaddr = (unsigned long)(fontaddr*16);
                        fontaddr = (unsigned long)(fontaddr+0x3cf80);                        
                        addrHigh = (fontaddr&0xff0000)>>16;
                        addrMid = (fontaddr&0xff00)>>8;
                        addrLow = fontaddr&0xff;

                        get_n_bytes_data_from_ROM_G(x,addrHigh,addrMid,addrLow,16 );/*è&#161;16&#184;&#246;×&#214;&#189;úμ&#196;êy&#190;Y£&#172;′&#230;μ&#189;"fontbuf[32]"*/
                        
//                        display_graphic_8x16(y,x,fontbuf);/*&#207;&#212;ê&#190;8x16μ&#196;ASCII×&#214;μ&#189;LCDé&#207;£&#172;y&#206;aò3μ&#216;&#214;·£&#172;x&#206;aáDμ&#216;&#214;·£&#172;fontbuf[]&#206;aêy&#190;Y*/
                        i+=1;
                        x+=8;
                }
                else
                        i++;
        }
                return x;
}
/*′写入到字库芯片,得到字库字符数据代码*/
void get_n_bytes_data_from_ROM_G(uchar x,uchar addrHigh,uchar addrMid,uchar addrLow,uchar DataLen )
{
        uchar i,j;
        Rom_CS(0);
        lcd_cs1(1);        
        lcd_sclk(0);
        send_command_to_ROM(0x03);
        send_command_to_ROM(addrHigh);
        send_command_to_ROM(addrMid);
        send_command_to_ROM(addrLow);
                for(i = 0; i < 2; i++ )
                                for(j = x; j <x+DataLen/2; j++ )
                                RollBuf[j]        = get_data_from_ROM();
//        for(i=0;i<32;i++)
//                RollBuf[0]        = get_data_from_ROM();
        Rom_CS(1);
}

/****获取字库字符数据***/
static uchar get_data_from_ROM( )
{
        
        uchar i;
        uchar ret_data=0;
        lcd_sclk(1);;;  __nop();
        GBZK_ROMOUTSET();
        for(i=0;i<8;i++)
        {
                Rom_OUT(1);;; __nop();
                lcd_sclk(0);;;__nop();
                ret_data=ret_data<<1;
                if( ROM_OUT )
                        {ret_data=ret_data+1;;;__nop();}
                else
                        {ret_data=ret_data+0;;;__nop();        }
                lcd_sclk(1);
        }
        GBZK_ROMOUTRESET();
        return(ret_data);
}

大概程序就是这样了,懂OLED的人应该能看懂,这是我用的人家OLED官方程序改的,附带字库的,方便点
问题来了 !!!!!!!!!!!!!! 只能滚动显示15个汉字,多一个都不行。。。。不知道为啥
后期再改改我的方向:现在用的是数组,可以直接存到外部flash中,节省内部flash,如果滚动的汉字多的话还是很浪费内存,然后再整合到自己的原来用的OLED程序吧,感觉这个还是挺乱的
附件传不上去。。。。请大家移步云盘了https://pan.baidu.com/s/1i4JaT4x


回复

使用道具 举报

 楼主| 发表于 2017-3-19 12:37:09 | 显示全部楼层
已解决,变量定义有问题
回复 支持 反对

使用道具 举报

发表于 2017-11-27 09:15:36 | 显示全部楼层
你好  我在做汉字移动的  想请教你问题  
QQ82478806

回复 支持 反对

使用道具 举报

发表于 2017-11-27 13:50:59 | 显示全部楼层
网盘 连接失效了
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-23 01:24 , Processed in 0.062017 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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