搜索
bottom↓
回复: 6

控制OLED屏滚动 怎么430比51慢好多好多 是不是配置的问题?(付原理图、程序)

[复制链接]

出0入0汤圆

发表于 2011-9-8 15:57:18 | 显示全部楼层 |阅读模式
点亮OLED  软件控制滚屏  原来用51板(12M)做的  滚的很快  为什么换了430(8m)后就明显慢了好多   我换了430的晶振(16M)  赶紧几乎没快起来  为什么呢?
我的板子的测试程序如下(可以点亮OLED):
#include  "main.h"
#include  "zimo.h"
#define   EN_H  P4OUT|=BIT1
#define   EN_L  P4OUT&=~BIT1

#define WR_H      P5OUT |= BIT0
#define WR_L      P5OUT &= ~BIT0
#define RD_H      P5OUT |= BIT1
#define RD_L      P5OUT &= ~BIT1
#define RES_H     P5OUT |= BIT2
#define RES_L     P5OUT &= ~BIT2
#define DC_H      P5OUT |= BIT3
#define DC_L      P5OUT &= ~BIT3
#define CS_H      P5OUT |= BIT4
#define CS_L      P5OUT &= ~BIT4

  unsigned long cc;
  unsigned char bai,shi,ge,adtime,shez=0,sf=0,mode=2,mm,one;
  unsigned long cc,adint,fen=0,ov,jclose=0;
  float bb,addata;
  unsigned char data_buf1[30],count1=0,data_len1,bz1=0,sbdz[2],kzqdz[2],bh,senddata[20];
  unsigned long ADC0 ;




/*8M晶振初始*******************************************************************/
void init_clock8m()
{
        uchar i;
        WDTCTL = WDTPW + WDTHOLD;                 // 关看门狗
        BCSCTL1 &= ~XT2OFF;                       // 打开XT2
        do{
          IFG1 &= ~OFIFG;                           // 时钟稳定
          for (i = 0xff; i > 0; i--);        
        }
        while ((IFG1 & OFIFG));                  
        BCSCTL2 |= SELM_1+SELS;                 // MCLK=SMCLK=XT2
}
/******************************************************************************/






/*延时程序*********************************************************************/
void delay(unsigned int t)
{  unsigned int i,j;
   for(i=0;i<t;i++)
      for(j=0;j<10;j++);
}
/******************************************************************************/








/*OLEDIO初始化*****************************************************************/
void oledioinit(void)
{
  P4SEL=0X00;
  P4DIR=0XFF;
  P4OUT=0XFF;
  P5SEL=0X00;
  P5DIR=0XFF;
  P5OUT=0XFF;
}
/******************************************************************************/




/*写指令到OLED显示屏***********************************************************/
void WriteCommand(unsigned com)
{
  CS_H;
  DC_L;
  WR_L;       
  RD_H;
  CS_L;
  P4OUT=com;
  CS_H;
}
/******************************************************************************/




/*写数据到oled显示屏***********************************************************/
void WriteData(unsigned dat)
{
  CS_H;
  DC_H;       
  WR_L;
  RD_H;
  CS_L;
  P4OUT=dat;
  CS_H;
}
/******************************************************************************/




/*总线初始化*******************************************************************/
void esbusini(void)
{
  unsigned char i=100;
  while(--i)delay(100);//延时5uS以上
  RES_H;
  RES_L;
  while(--i)delay(100);//延时5uS以上
  RES_H;
}
/******************************************************************************/




/*显示初始化*******************************************************************/
void ini_dis(void)
{
        unsigned char i,j;
        for(i=0;i<8;i++)
        {
                WriteCommand (0xb0+i);   
                WriteCommand (0x02);      
                WriteCommand (0x10);   
                for(j=0;j<128;j++)
                        WriteData(0x00);        
        }
}
/******************************************************************************/




/*oled显示的准备工作***********************************************************/
void ini_oled(void)
{
  esbusini();
  WriteCommand(0x00);
  WriteCommand(0x10);
  WriteCommand(0x40);
  WriteCommand(0x81);
  WriteCommand(0x2f);
  WriteCommand(0xA1);
  WriteCommand(0xA4);
  WriteCommand(0XA6);
  WriteCommand(0xA8);
  WriteCommand(0x3f);
  WriteCommand(0xAD);
  WriteCommand(0x8A);
  WriteCommand(0xAE);
  WriteCommand(0xD3);
  WriteCommand(0x00);
  WriteCommand(0xD5);
  WriteCommand(0x20);
  WriteCommand(0xD8);
  WriteCommand(0x00);
  WriteCommand(0xDA);
  WriteCommand(0x12);
  WriteCommand(0xDB);
  WriteCommand(0x00);
  WriteCommand(0xD9);
  WriteCommand(0x22);
  WriteCommand(0xc0);
  ini_dis();
}
/******************************************************************************/




/*显示X,Y坐标处的一个字符*****************************************************/
void disc(unsigned char X,unsigned char Y,unsigned char * c)       
{
  unsigned char n;
  WriteCommand (0xb7-(Y<<1));
  if(X%2)
    WriteCommand (0x08);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(n=0;n<=15;n+=2)
    WriteData(*(c+n));
  WriteCommand (0xb7-(Y<<1)-1);
  if(X%2)
    WriteCommand (0x08);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(n=1;n<=15;n+=2)
    WriteData(*(c+n));
}

void diss(unsigned char X,unsigned char Y,unsigned char * h)               
{
  unsigned char n;
  WriteCommand (0xb7-(Y<<1));
  if(X%2)
    WriteCommand (0x08);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(n=0;n<=31;n+=2)
    WriteData(*(h+n));
  WriteCommand (0xb7-(Y<<1)-1);
  if(X%2)
    WriteCommand (0x08);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(n=1;n<=31;n+=2)
    WriteData(*(h+n));
}

void dish(unsigned char X,unsigned char Y,unsigned char * h)               
{
  unsigned char n;
  WriteCommand (0xb7-(Y<<1));
  if(X%2)
    WriteCommand (0x04);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(n=0;n<=31;n+=2)
    WriteData(*(h+n));
  WriteCommand (0xb7-(Y<<1)-1);
  if(X%2)
    WriteCommand (0x04);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(n=1;n<=31;n+=2)
    WriteData(*(h+n));
}         

void dispro(unsigned char X,unsigned char Y,unsigned char * h)               
{
  unsigned int n;
  WriteCommand (0xb7-(Y<<1));
  WriteCommand (0x04);
  WriteCommand (0x10+(X>>1));
  for(n=0;n<=255;n+=2)
    WriteData(*(h+n));
  WriteCommand (0xb7-(Y<<1)-1);
  WriteCommand (0x04);
  WriteCommand (0x10+(X>>1));
  for(n=1;n<=255;n+=2)
    WriteData(*(h+n));
}       

void dispro8(unsigned char X,unsigned char Y,unsigned const char * h)                 //dish 全字
{
        unsigned int n;
        WriteCommand (0xb7-(Y<<1));
        WriteCommand (0x08);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<=255;n+=2)
          WriteData(*(h+n));
        WriteCommand (0xb7-(Y<<1)-1);
        WriteCommand (0x08);
        WriteCommand (0x10+(X>>1));
        for(n=1;n<=255;n+=2)
          WriteData(*(h+n));         
}       

void disn(unsigned char X,unsigned char Y,unsigned char n)       
{
  unsigned char m;
  WriteCommand (0xb7-(Y<<1));
  if(X%2)
    WriteCommand (0x08);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(m=0;m<=15;m+=2)
    WriteData(*(num[n]+m));                     
  WriteCommand (0xb7-(Y<<1)-1);
  if(X%2)
    WriteCommand (0x08);
  else
    WriteCommand (0x00);
  WriteCommand (0x10+(X>>1));
  for(m=1;m<=15;m+=2)
    WriteData(*(num[n]+m));
}
/******************************************************************************/

void disgd(unsigned char X,unsigned char Y,unsigned const char *yxs,unsigned const char *hxs,unsigned j)
{
        unsigned int i;
        WriteCommand (0xb7-(Y<<1));
        WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(i=j;i<=255;i+=2)
        WriteData(*(yxs+i));
        for(i=0;i<j;i+=2)
        WriteData(*(hxs+i));
        WriteCommand (0xb7-(Y<<1)-1);
        WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(i=(j+1);i<=255;i+=2)
        WriteData(*(yxs+i));
        for(i=1;i<j;i+=2)
        WriteData(*(hxs+i));
}


/*主函数***********************************************************************/
void main(void)
{
  uint j;
   _DINT();      //关总中断
   init_clock8m();
  delay(1000);//等待设备上电完成
delay(1000);//等待设备上电完成
oledioinit();
P5OUT&=~BIT5;
ini_oled();
WriteCommand(0xAD); // Set DC-DC
WriteCommand(0x8B); // 8B=ON, 8A=Off
WriteCommand(0xaf);   //open display       

  while(1)
  {
   dispro8(1,0,delhang);
   dispro8(1,1,tu2);
   dispro8(1,2,tu3);
   dispro8(1,3,delhang);
   delay(5000);
   delay(5000);
   delay(5000);
             for(j=0;j<256;j+=40)
      {
                disgd(1,0,delhang,qsrmm,j);
                disgd(1,1,tu2,delhang,j);
                disgd(1,2,tu3,delhang,j);
                disgd(1,3,delhang,tgqd,j);       
          }               
   while(1);        
  }
}
/******************************************************************************/

付原理图:

(原文件名:1.JPG)

原理图原件:
点击此处下载 ourdev_675313UET3P5.zip(文件大小:62K) (原文件名:ylt.zip)

原理图功能实现都没问题,但因为这是个低功耗产品,这板子目前实现起来有问题,呵呵

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-9-8 16:44:12 | 显示全部楼层
可能是时钟部分配置有问题。

出0入0汤圆

发表于 2011-9-8 21:01:44 | 显示全部楼层
oled,人类未来的希望。。

出0入0汤圆

 楼主| 发表于 2011-9-9 08:53:12 | 显示全部楼层
ddddddddddddddddddddddddddddddddddddddddddddddddddd

出0入0汤圆

发表于 2011-9-11 14:36:45 | 显示全部楼层
8M的430比12M的51慢好多,还算正常;换成16M几乎快不起来就很不正常了。

出0入0汤圆

发表于 2011-9-16 08:57:51 | 显示全部楼层
建议楼主把程序流程图也贴上来,这样大家看代码和原理图的时候省事很多。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 00:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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