|
这些天一直在忙着个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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|