小学生
最后登录1970-1-1
在线时间 小时
注册时间2017-1-5
|
本帖最后由 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; /*μØÖ·μĸß8λ,1224λ*/
addrMid = (fontaddr&0xff00)>>8; /*μØÖ·μÄÖD8λ,1224λ*/
addrLow = fontaddr&0xff; /*μØÖ·μÄμí8λ,1224λ*/
get_n_bytes_data_from_ROM_G(x,addrHigh,addrMid,addrLow,32 );/*è¡32¸ö×Ö½úμÄêy¾Y£¬′æμ½"fontbuf[32]"*/
// display_graphic_16x16(y,x,fontbuf);/*ÏÔê¾oo×Öμ½LCDéÏ£¬yÎaò3μØÖ·£¬xÎaáDμØÖ·£¬fontbuf[]Îaêy¾Y*/
i+=2;
x+=16;
}
else if(((text>=0xa1) &&(text<=0xa3))&&(text[i+1]>=0xa1))
{
/*1ú±ê¼òì壨GB2312£©15x16μãμÄ×Ö·ûÔú¾§áaѶ×Ö¿aICÖDμÄμØÖ·óéòÔÏÂ1«ê½à′¼ÆËã£o*/
/*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
/*óéóúμ£DÄ8λμ¥Ƭ»úóD3Ë·¨òç3öÎêìa£¬ËùòÔ·Öèy2¿è¡μØÖ·*/
fontaddr = (text- 0xa1)*94;
fontaddr += (text[i+1]-0xa1);
fontaddr = (ulong)(fontaddr*32);
addrHigh = (fontaddr&0xff0000)>>16; /*μØÖ·μĸß8λ,1224λ*/
addrMid = (fontaddr&0xff00)>>8; /*μØÖ·μÄÖD8λ,1224λ*/
addrLow = fontaddr&0xff; /*μØÖ·μÄμí8λ,1224λ*/
get_n_bytes_data_from_ROM_G(x,addrHigh,addrMid,addrLow,32 );/*è¡32¸ö×Ö½úμÄêy¾Y£¬′æμ½"fontbuf[32]"*/
// display_graphic_16x16(y,x,fontbuf);/*ÏÔê¾oo×Öμ½LCDéÏ£¬yÎaò3μØÖ·£¬xÎaáDμØÖ·£¬fontbuf[]Îaêy¾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 );/*è¡16¸ö×Ö½úμÄêy¾Y£¬′æμ½"fontbuf[32]"*/
// display_graphic_8x16(y,x,fontbuf);/*ÏÔê¾8x16μÄASCII×Öμ½LCDéÏ£¬yÎaò3μØÖ·£¬xÎaáDμØÖ·£¬fontbuf[]Îaêy¾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
|
|