搜索
bottom↓
回复: 2

求助各位高手:LM3S6916下的OLED驱动问题

[复制链接]

出0入0汤圆

发表于 2010-12-4 15:01:34 | 显示全部楼层 |阅读模式
这些天一直在忙着个OLED显示屏问题,仿照厂商的8052单片机例子写了驱动代码,使用并行80模式,可是总是点不亮,不知道为什么,求助各位前辈,小生先谢谢啦...
DC-PB2 WR-PB3 REST-PB4 RD-PB5 CS-PB6 DATA口为PA0-PA7
对这个系列芯片的指令执行时间和时序不清楚
附上IAR5.4下的工程代码以及OLED资料和厂商8052例子,急,求各位帮忙
点击此处下载 ourdev_602279LK7KJF.rar(文件大小:999K) (原文件名:OLED在LM3S6916下的I80模式驱动.rar)


#include "includes.h"     
#include "I80OLED.h"

/*********************************************************************************************************
硬件相关的定义
*********************************************************************************************************/
#define  DC_BASE_PIN        DC_BASE,DC_PIN
#define  CS_BASE_PIN        CS_BASE,CS_PIN
#define  WR_BASE_PIN        WR_BASE,WR_PIN
#define  RD_BASE_PIN        RD_BASE,RD_PIN
#define  RST_BASE_PIN       RST_BASE,RST_PIN
#define  DATA_PORT_BASE_PIN     DATA_PORT_BASE,DATA_PORT_PIN


/*********************************************************************************************************
硬件相关的位操作定义,包括控制位和数据位
*********************************************************************************************************/
#define  DC                 HWREG(DC_BASE + (GPIO_O_DATA + (DC_PIN << 2)))
#define  CS                 HWREG(CS_BASE + (GPIO_O_DATA + (CS_PIN << 2)))
#define  WR                 HWREG(WR_BASE + (GPIO_O_DATA + (WR_PIN << 2)))
#define  RD                 HWREG(RD_BASE + (GPIO_O_DATA + (RD_PIN << 2)))
#define  RST                HWREG(RST_BASE + (GPIO_O_DATA + (RST_PIN << 2)))
#define  DATA_PORT              HWREG(DATA_PORT_BASE + (GPIO_O_DATA + (DATA_PORT_PIN << 2)))
#define  DATA_PROT_INPUT_SET()  HWREG(DATA_PORT_BASE + GPIO_O_DIR) = 0  
#define  DATA_PROT_OUTPUT_SET() HWREG(DATA_PORT_BASE + GPIO_O_DIR) = 0xff


#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  SysCtlPeriEnable       SysCtlPeripheralEnable


/*显示的二维数组数据QQ:381198464,及常见的ASSIC字符*/
uint8 tab8[][8]={
        0x0e,0x11,0x11,0x11,0x15,0x12,0x0b,0x00,    /*Q 代码"31"*/
        0x0e,0x11,0x11,0x11,0x15,0x12,0x0b,0x00,    /*Q 代码"31"*/
        0x1f,0x02,0x04,0x02,0x01,0x11,0x0e,0x00,    /*3 代码"13"*/
        0x0e,0x11,0x11,0x0e,0x11,0x11,0x0e,0x00,    /*8 代码"18"*/
        0x04,0x0c,0x04,0x04,0x04,0x04,0x0e,0x00,    /*1 代码"11"*/
        0x04,0x0c,0x04,0x04,0x04,0x04,0x0e,0x00,    /*1 代码"11"*/
        0x0e,0x11,0x11,0x0e,0x01,0x02,0x0c,0x00,    /*9 代码"19"*/
        0x0e,0x11,0x11,0x0e,0x11,0x11,0x0e,0x00,    /*8 代码"18"*/
        0x02,0x06,0x0a,0x12,0x1f,0x02,0x02,0x00,    /*4 代码"14"*/
        0x06,0x08,0x10,0x1e,0x11,0x11,0x0e,0x00,    /*6 代码"16"*/
        0x02,0x06,0x0a,0x12,0x1f,0x02,0x02,0x00,    /*4 代码"14"*/
        0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00,    /*"0"=10h*/
        0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00,    /*"1"=11h*/
        0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,    /*"2"=12h*/
        0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00,    /*"3"=13h*/
        0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00,    /*"4"=14h*/
        0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,    /*"5"=15h*/
        0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00,    /*"6"=16h*/
        0x00,0x01,0x01,0x79,0x05,0x03,0x00,0x00,    /*"7"=17h*/
        0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,    /*"8"=18h*/
        0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00,    /*"9"=19h*/
        0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,    /*":"=1Ah*/
        0x00,0x00,0x56,0x36,0x00,0x00,0x00,0x00,    /*";"=1Bh*/
        0x00,0x7E,0x11,0x11,0x11,0x7E,0x00,0x00,    /*"A"=21h*/
        0x00,0x41,0x7F,0x49,0x49,0x36,0x00,0x00,    /*"B"=22h*/
        0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00,    /*"C"=23h*/
        0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00,    /*"D"=24h*/
        0x00,0x7F,0x49,0x49,0x49,0x49,0x00,0x00,    /*"E"=25h*/
        0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00,    /*"F"=26h*/
        0x00,0x3E,0x41,0x41,0x49,0x7A,0x00,0x00,    /*"G"=27h*/
        0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00,    /*"h"=28h*/
        0x00,0x00,0x41,0x7F,0x41,0x00,0x00,0x00,    /*"I"=29h*/
};


/* 点阵:16x16提取点阵方向:纵向字节掉转:是字节方式:C语言 */
uint8 tab16[][32]={
        0x10,0x22,0x64,0x0C,0xC0,0x44,0x54,0x54,    // 清
        0x54,0x7F,0x54,0x54,0xD6,0x44,0x40,0x00,
        0x04,0x04,0xFE,0x01,0x00,0x00,0xFF,0x15,
        0x15,0x15,0x55,0x95,0x7F,0x01,0x00,0x00,

        0x40,0x42,0xCC,0x00,0x20,0x20,0x20,0xA0,    // 达
        0x7F,0x20,0x20,0x20,0x30,0x20,0x00,0x00,
        0x40,0x20,0x1F,0x20,0x50,0x48,0x46,0x41,
        0x40,0x41,0x42,0x4C,0x58,0x60,0x20,0x00,

        0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,    // 光
        0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
        0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
        0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,

        0x00,0x00,0xC0,0x40,0x40,0x40,0x7F,0x48,    // 点
        0x48,0x48,0x48,0xE8,0x4C,0x08,0x00,0x00,
        0x80,0x40,0x37,0x04,0x14,0x64,0x04,0x14,
        0x24,0x64,0x04,0x17,0x20,0xC0,0x00,0x00,

        0x10,0x22,0x64,0x0C,0x80,0x04,0xC4,0x34,    // 液
        0x05,0xC6,0xBC,0x24,0x24,0xE6,0x04,0x00,
        0x04,0x04,0xFE,0x01,0x02,0x01,0xFF,0x42,
        0x21,0x16,0x08,0x15,0x23,0x60,0x20,0x00,

        0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,    // 晶
        0x49,0x49,0xFF,0x00,0x00,0x80,0x00,0x00,
        0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,
        0xFF,0x49,0x49,0x49,0x49,0xFF,0x01,0x00,

        0x10,0x10,0xD0,0xFF,0x94,0x14,0xE4,0xBF,    // 模
        0xA4,0xA4,0xA4,0xBF,0xF4,0x26,0x04,0x00,
        0x04,0x03,0x00,0xFF,0x08,0x89,0x8B,0x4A,
        0x2A,0x1E,0x2A,0x2A,0x4B,0xC8,0x48,0x00,

        0x20,0x20,0x20,0xFF,0x20,0x20,0x10,0x10,    // 块
        0xFF,0x10,0x10,0x10,0xF8,0x10,0x00,0x00,
        0x08,0x18,0x08,0x0F,0x84,0x46,0x22,0x1A,
        0x07,0x0A,0x12,0x22,0x43,0xC2,0x42,0x00,
};

/*两层嵌套延时*/
void uDelay(uint8 l)
{
        while(l--);
}

void delay(uint8 n)//晶振12M,机器周期1微秒,一次循环延时157.2ms
{
uint8 i,j,k;

        for(k=0;k<n;k++)
        {
                for(i=0;i<131;i++)
                {
                        for(j=0;j<15;j++)
                        {
                        uDelay(80);
                        }
                }
        }
}

void nop()  //这个nop是我自己加的,厂商例程在8052单片机中是个分号的形式
{
uDelay(1);
}
/*写命令函数*/
void Writecom(uint8 com)
{
  SysCtlPeriEnable(PERI);
  DC=0x00;
  CS=0x00;
  WR=0x00;
  //;
  nop();
  DATA_PORT=com;  
  //;
  nop();
  WR=0xff;
  //;
  nop();
  //;
  nop();
  CS=0xff;
  DC=0xff;
}

/*写数据函数*/
void Writedata(uint8 dat)
{
  SysCtlPeriEnable(PERI);
  DC=0xff;
  CS=0x00;
  WR=0x00;
  //;
  nop();
  DATA_PORT=dat;   
  //;
  nop();
  WR=0xff;   
  //;
  nop();
  //;
  nop();
  CS=0xff;
  DC=0xff;
}

/*读命令函数*/
uint8 Readcom()
{
  SysCtlPeriEnable(PERI);
  uint8 com;
  DC=0x00;
  CS=0x00;  
  DATA_PORT=0xff;  
  RD=0x00;  
  //;
  nop();
  //;
  nop();
  com=DATA_PORT;  
  RD=0xff;  
  //;
  nop();
  //;
nop();  
  CS=0xff;
  DC=0xff;
  return com;
}

/*读数据函数*/
uint8 Readdata()
{
  SysCtlPeriEnable(PERI);
  DATA_PROT_INPUT_SET();
  uint8 dat;
  DC=0xff;
  CS=0x00;  
  DATA_PORT=0xff;  
  RD=0x00;  
  //;
  nop();
  //;
  nop();  
  dat=DATA_PORT;
  RD=0xff;  
  //;
  nop();
  //;
  nop();  
  CS=0xff;
  DC=0xff;
  DATA_PROT_OUTPUT_SET();
  return dat;
}

void startline(uint8 line)
{

line=line&0x3f;                     /*定义低5位*/
line=line|0x40;                     /*第一行*/
Writecom(line);
}


void startpage(uint8 page)
{
page=page&0x0f;                    /*定义低4位*/
page=page|0xb0;                    /*第一页*/
Writecom(page);
}

/*数据发送位The beginning of seg is 0x1000*/
void startcolumn(uint8 column)
{
  uint8 temp;
  temp=column;
  column=column&0x0f;   ///定义DB3-DB0;
  column=column|0x00;
  Writecom(column);
  column=temp/16;      ////////////// >>4
  column=column&0x0f;  ///定义DB7-DB4;
  column=column|0x10;
  Writecom(column);
}


void clear(uint8 m)
{
uint8 i,j;
for(i=0;i<8;i++)
{
Writecom(0xb0+i);                //startpage(i)
Writecom(0x00);
Writecom(0x10);                  //startcolumn(0)
for(j=0;j<128;j++)
{Writedata(m);}
}
}

void reset(uint8 m)
{
uint8 i,j;
        for(i=0;i<8;i++)
        { startpage(i);
        startcolumn(0x00);
          for(j=0;j<64;j++)
        { Writedata(m);
          Writedata(~m);
        }
         }
}

void INT()
{
  SysCtlPeriEnable(PERI);
  RST=0x00;
  
  uDelay(20);
  
  RST=0xff;
  uDelay(20);

  Writecom(0xae);//关显示
  Writecom(0xd5);//设定显示频率
  Writecom(0xa0);

  Writecom(0xa8);//设定占空比 1/32
  Writecom(0x3f);

  Writecom(0xd3);//设定显示范围        COM
  Writecom(0x00);

  Writecom(0x40);//起始行
  Writecom(0x00);

  Writecom(0xad);//内部dc-dc
  Writecom(0x8e);

  Writecom(0x20);//接口方式 页方式
  Writecom(0x02);

  Writecom(0xa1);//seg方向         132-0
  Writecom(0xc8);//com方向         63-0

  Writecom(0xda);//Set COM Pins        Hardware Configuration
  Writecom(0x12);

  Writecom(0x81);//对比度调节
  Writecom(0xbf);//对比度为中

  Writecom(0xdb);//倍压调节
  Writecom(0x34);

  Writecom(0xa4);//Entire Display ON
  Writecom(0xa6);//Normal display
  clear(0x00);
  Writecom(0xaf);//开显示
}
void display88(uint8 x,uint8 y,uint8 coder)
{
   uint8 i;

   for(i=0;i<8;i++)
   {
    startpage(y);
    startcolumn(x);
    Writedata(tab8[coder]);x++;}
}

void display_8(uint8 x,uint8 y)
{
   uint8 i;
   for(i=0;i<16;i++)
   {display88(x,y,i);x=x+8;}
}

void display16(uint8 x,uint8 y,uint8 coder)
{
    uint8 j,i;
    uint8 n;
    n=x;
    i=0;
loop:

    for(j=i;j<i+16;j++)
    {
    startpage(y);
    startcolumn(x);
    Writedata(tab16[coder][j]);x++;}

   if(i==0)
   {i=16;
    y++;
    x=n;
    if(y==4)
    return;
    else goto loop;}
}

void display_16(uint8 x,uint8 y)
{
  uint8 i;
  for(i=0;i<8;i++)
  {display16(x,y,i);x=x+16;}
}
/****************************************************
竖直卷动
a=0x00,向上卷动  a=0x01,向下卷动
//    b: Set Top Fixed Area
//    c: Set Vertical Scroll Area
//    d: Set Numbers of Row Scroll per Step
//    e: Set Time Interval between Each Scroll Step
**************************************************/
void Vertical_Scroll(uint8 a, uint8 b, uint8 c, uint8 d, uint8 e)
{
unsigned int i,j;

        Writecom(0xA3);                        // Set Vertical Scroll Area
        Writecom(b);                        // Default => 0x00 (Top Fixed Area)
        Writecom(c);                        // Default => 0x40 (Vertical Scroll Area)

        switch(a)
        {
                case 0:
                        for(i=0;i<c;i+=d)
                        {
                                startline(i);
                                for(j=0;j<e;j++)
                                {
                                        uDelay(200);
                                }
                        }
                        break;
                case 1:
                        for(i=0;i<c;i+=d)
                        {
                                startline(c-i);
                                for(j=0;j<e;j++)
                                {
                                        uDelay(200);
                                }
                        }
                        break;
        }
        startline(0x00);
}
/******************************************************
水平卷动
a=0x00,向右卷动  a=0x01,向左卷动
//    b: Set Numbers of Column Scroll per Step
//    c: Define Start Page Address
//    d: Define End Page Address
//    e: Set Time Interval between Each Scroll Step in Terms of Frame Frequency
//    f: Delay Time
*******************************************************/
void Horizontal_Scroll(uint8 a, uint8 b, uint8 c, uint8 d, uint8 e, uint8 f)
{
        Writecom(0x26|a);                // Horizontal Scroll Setup
        Writecom(b);
        Writecom(c);
        Writecom(e);
        Writecom(d);
        Writecom(0x2F);                        // Activate Scrolling
        delay(f);
}

/*JTAG防止失效*/
#define KEY1   GPIO_PIN_1
void JTAGProtect (void)
{   
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);                        /*  给GPIOA提供时钟             */   
    GPIOPadConfigSet(GPIO_PORTA_BASE, KEY1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
                                                                        /*  设定 GPIO PA1引脚为上拉     */
                                                                        /*  2MA输入                    */
   
    GPIODirModeSet(GPIO_PORTA_BASE, KEY1, GPIO_DIR_MODE_IN);            /*  设定 GPIO PA1 引脚为        */
                                                                        /*  GPIO输入口                  */   
    while ((GPIOPinRead(GPIO_PORTA_BASE,KEY1) & KEY1)== 0) {
        ;
    }
}

/*主程序*/
void main(void)
{
        
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ);  //配置系统主时钟为12M
     
    JTAGProtect();
        
    INT();
        
    SysCtlPeriEnable(PERI);       //这里参考了周工的一个例程
   
    GPIOPinTypeOut(CS_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(WR_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(DC_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(RD_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(RST_BASE_PIN);                                   /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(DATA_PORT_BASE_PIN);                             /* 设置相应的数据管脚为输出     */
   
    DC = 0xFF;                                                      /* 初始化输出为高电平           */
    CS = 0xFF;                                                      /* 初始化输出为高电平           */
    WR = 0xFF;;                                                     /* 初始化输出为高电平           */
    RD = 0xFF;                                                      /* 初始化输出为高电平           */
    RST = 0xFF;                                                     /* 初始化输出为高电平           */
    DATA_PORT = 0xFF;
   
    RST = 0x00;                                                     /* 拉低复位引脚                 */
    SysCtlDelay(10 * SysCtlClockGet() / 3000);
    RST = 0xFF;                                                     /* 拉高复位引脚                 */
    SysCtlDelay(10 * SysCtlClockGet() / 3000);

        clear(0xff);
        delay(1);

        clear(0x55);
        delay(1);

        clear(0xaa);
        delay(1);

        reset(0x55);
        delay(1);

        reset(0xaa);
        delay(1);

        reset(0xff);
        delay(1);

        reset(0x00);
        delay(1);

        clear(0x00);
        display_8(0,2);
        display_8(0,3);
        display_16(0,0);
        display_16(0,4);
        display_16(0,6);

        while(1);
}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-12-6 17:05:51 | 显示全部楼层
今天用万用表一一测试了管脚,加了几行代码,已经点亮,谢谢各位!

出0入0汤圆

发表于 2012-8-3 11:25:38 | 显示全部楼层
我的LM3S6432也出问题
  1. int main(void)
  2. {
  3.     SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
  4.                    SYSCTL_XTAL_8MHZ);

  5.     SysCtlPeripheralEnable(GPIO_PORTA_BASE);
  6.         GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_6);
  7.         GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, 0x00);
  8.         SysCtlSleep();
  9.         while(1);
  10. }
复制代码
down进去,引脚没反应,测了只有1.2V,感觉没初始化正确
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-4 11:11

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

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