社区导航

 

搜索
查看: 7274|回复: 6

[求助] OLED显示问题:每行只能显示一个汉字

[复制链接]

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-1-13 13:54 | 显示全部楼层 |阅读模式
最近买了块OLED的屏幕,结果调试的时候总是每行只能写一个汉字,写两个或者更多的话就花屏。
调试了两天了,总是不行,也找不到原因。
程序是参考 买屏幕时店家附送的例程。单片机是C8051F310。OLED的驱动芯片是SH1101A ,C86端已经接到VCC上的了。谢谢大家!!!

以下是程序:

#include <c8051f310.h>                       // SFR declarations
#include <intrins.h>

#define DAT P2
#define uchar unsigned char
#define uint unsigned int
#define NOP() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_() 

sbit W_R=P1^6;
sbit DC=P1^5;
sbit CS=P1^7;
sbit RES=P3^1;
sbit R_D=P3^2;

unsigned char code num0[16]={0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00};
unsigned char code hz0[32]={0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x60,0x00,0x07,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x47,0xC0,0x40,0x02,0x40,0x01,0x7F,0xFE,0x00,0x00,0x00,0x00};
unsigned char code xing[32]={0x01,0x00,0x02,0x00,0x0C,0x00,0x3F,0xFE,0xE0,0x00,0x50,0x00,0x15,0x7E,0x15,0x44,0x95,0x44,0x75,0x44,0x55,0x44,0x15,0x44,0x15,0x7E,0x10,0x00,0x10,0x00,0x00,0x00};  
unsigned char code xi[32]={0x00,0x00,0x00,0x04,0x00,0x1C,0x3F,0x80,0x2A,0xBC,0x2A,0x82,0x6A,0x82,0xAA,0xA2,0x2A,0x9A,0x2A,0x82,0x2A,0x82,0x3F,0x8E,0x00,0x00,0x00,0x10,0x00,0x0C,0x00,0x00};
unsigned char code zhong[32]={0x00,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0xFF,0xFF,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x3F,0xE0,0x10,0x00,0x00,0x00,0x00,0x00};
unsigned char code xin[32]={0x00,0x20,0x01,0xC0,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x02,0x80,0x02,0x40,0x02,0x38,0x02,0x10,0x02,0x00,0x02,0x02,0x1E,0x01,0x00,0x00,0xE0,0x00,0x40,0x00,0x00};
unsigned char code bu[32]={0x40,0x00,0x57,0xAF,0x55,0x6A,0x55,0x2A,0xF5,0x2A,0x55,0x6A,0x57,0xAF,0x00,0x00,0x40,0x00,0x57,0xAF,0x55,0x6A,0xF5,0x2A,0x55,0x2A,0x55,0x6A,0x47,0xAF,0x00,0x00};


void delay1ms();
void delay1us();
void delaynms(int n);

//------------------------------------------------------------------//
void WriteCommand(uchar com);
void WriteData(uchar dat);
void ini_oled(void);
void esbusini(void);

void protinit(void)
{
//  P0SKIP=0xFF;
//  P1SKIP=0x1F;
 XBR0=0x00;
 XBR1=0x40;
 P0MDOUT=0xFF;
 P1MDOUT=0xFF;
 P2MDOUT=0xFF;
 P3MDOUT=0xFF;
}
//----------------------------------------------------------------
void delay1ms()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;  
}
void delaynms(int n)
{
int i;
for(i=0;i<n;i++)
delay1ms();
}

void delay1us()
{
uchar i;
for(i=0;i<5;i++);
}

/*-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------*/
void WriteCommand(uchar com)
{
CS=1;
DC=0;
W_R=0;
R_D=1;
CS=0;
delaynms(1);
DAT=com;
delaynms(1);
W_R=1;
CS=1;
}
void WriteData(uchar dat)
{
CS=1;
DC=1;
W_R=0;
R_D=1;
CS=0;
  delaynms(1);
DAT=dat;
  delaynms(1);
W_R=1;
CS=1;
}
void esbusini(void)
{
unsigned char i=100;
while(--i)_nop_();//延时5uS以上
RES=1;
RES=0;
while(--i)_nop_();//延时5uS以上
RES=1;
}
void ini_dis(void)
{
uchar i,j;
for(i=0;i<8;i++)
{
WriteCommand (0xb0+i);    //设置显示位置—行
WriteCommand (0x02);      //设置显示位置—列低地址
WriteCommand (0x10);      //设置显示位置—列高地址
for(j=0;j<128;j++)
WriteData(0x00);        //屏幕显示,全亮
}
}
void ini_oled(void)
{
esbusini();
// Lower Column Address
WriteCommand(0x00); /* Set Lower Column Address */
// High Column Address
WriteCommand(0x10); /* Set Higher Column Address*/
// Display Start Line
WriteCommand(0x40); /* Set Display Start Line */
// Contrast Control Register
WriteCommand(0x81); /* Set Contrast Control */
WriteCommand(0x2f); /* 0 ~ 255 0x1f*/
// Re-map
WriteCommand(0xA1); /* [A0]:column address 0 is map 
to SEG0 , [A1]: columnaddress 131 is map to SEG0*/ 
// Entire Display ON/OFF
WriteCommand(0xA4); /* A4=ON */
// Normal or Inverse Display
WriteCommand(0XA6); /* Normal Display*/
// Multiplex Ratio
WriteCommand(0xA8); /* Set Multiplex Ratio */
WriteCommand(0x3f); /* Set to 36 Mux*/
// Set DC-DC
WriteCommand(0xAD); /* Set DC-DC */
WriteCommand(0x8A); /* 8B=ON, 8A=Off */
// Display ON/OFF
WriteCommand(0xAE); /* AF=ON , AE=OFF*/
// Display Offset
WriteCommand(0xD3); /* Set Display Offset */
WriteCommand(0x00); /* No offset */
// Display Clock Divide
WriteCommand(0xD5); /* Set Clock Divide */
WriteCommand(0x20); /* Set to 80Hz */
// Area Color Mode
WriteCommand(0xD8); /* Set Area Color On or Off*/
WriteCommand(0x00); /* Mono Mode */
// COM Pins Hardware Configuration
WriteCommand(0xDA); /* Set Pins HardwareConfiguration */
WriteCommand(0x12);
// VCOMH
WriteCommand(0xDB); /* Set VCOMH */
WriteCommand(0x00);
// VP
WriteCommand(0xD9); /* Set VP */
WriteCommand(0x22); /* P1=2 , P2=2 */
WriteCommand(0xc0);//配置成标准应用
ini_dis();
}
void displayoff(void)
{
    WriteCommand(0xAD); // Set DC-DC 
WriteCommand(0x8A); // 8B=ON, 8A=Off 
   WriteCommand(0xAE); 
}
void displayon(void)
{
WriteCommand(0xAD); // Set DC-DC 
WriteCommand(0x8B); // 8B=ON, 8A=Off 
   WriteCommand(0xAF); 
}

void dish(uchar x,uchar y,uchar *c)
{
uchar i;

WriteCommand (0xb7-(y<<1));    //设置显示位置—行
if(x%2)
WriteCommand (0x0a);
else
WriteCommand (0x02);
WriteCommand (0x10+(x>>1));
for(i=0;i<=31;i=i+2)
{
WriteData(*(c+i));
}
delaynms(200); 
WriteCommand (0xb7-(y<<1)-1);    //设置显示位置—行
if(x%2)
WriteCommand (0x0a);
else
WriteCommand (0x02);
WriteCommand (0x10+(x>>1));
for(i=1;i<=31;i=i+2)
{
WriteData(*(c+i));
}
delaynms(200); 


}


//----------------------------------------------------------------
void main (void)
{
int i;
PCA0MD &= ~0x40;                         
OSCICN |= 0x03;                           
protinit();
delaynms(150);
ini_oled();
delaynms(150);
displayon();

    dish(1,0,xing); 
dish(1,1,xi); 
dish(1,2,zhong);
dish(1,3,xin);

while(1)
{

}
}
此帖出自单片机论坛

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2011-1-13 14:01 | 显示全部楼层
我测试了下端口电压,正常显示时SH1101A的VDD1和VDD2是2.4V,VPP是6V。
闪烁时 VDD1和VDD2是1.4V,VPP是3.6V。

买的人家电路开发板,结果人家的是3.3V和6.33V。

悲剧啊,找不到原因。。。

回复

使用道具 举报

55

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2011-1-13 14:21 | 显示全部楼层

    dish(1,0,xing); 
dish(1,2,xi);  //y+2试试

每个字要占两页吧

 


回复

使用道具 举报

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

发表于 2011-1-13 19:48 | 显示全部楼层

回复 板凳 soulcoffee 的帖子

楼上的应是正解,你一定是页没搞对,第二个字把第一个盖了,出现花屏地
http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2011-1-13 21:03 | 显示全部楼层

回复 板凳 soulcoffee 的帖子

函数里面已经有过处理了,y值可以取0-3之间的,屏幕可以显示4行汉字的。

x值也在函数里处理过,貌似没看出来问题的。

还有个有趣的现象是 每行可以显示两个汉字,但这两个汉字必须是笔画简单的,像上面的“心”就可以,“息”就不行。


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2011-1-13 21:50 | 显示全部楼层

问题解决,感谢大家!

问题解决了,原因是板子给OLED供电不足,分给OLED的电流不够,单独给OLED上电后,问题就解决了。

回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2011-1-14 08:22 | 显示全部楼层

回复 6楼 神彩飞扬 的帖子

不管是哪年,都要加油!继续为中国电子行业做出小小的贡献吧! 扣扣 1206973913


回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-24 14:17 , Processed in 0.219616 second(s), 17 queries , Gzip On, MemCache On.

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