|
菜鸟向大家求助。
有块OLED屏,驱动芯片是SSD1303,用C8051F120单片控制,数据由单片串行输出后锁存,并行输出给屏,驱动程序用陈超的,问题如下:
void ini_dis(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
WriteCommand (0xb0+i); //设置显示位置—行
WriteCommand (0x00); //设置显示位置—列低地址
WriteCommand (0x10); //设置显示位置—列高地址
for(j=0;j<128;j++)
WriteData(0x00); //屏幕显示,全亮
}
}
执行到上面程序屏幕全亮时,屏没有显示,用逻辑分析仪看,所有初始化命令都能走完,走到此处,在i=0,j=90时程序跑飞了好像,又开始初始化的操作。请大家看看我的问题出在哪里了,谢谢~~!!
程序如下:
#include "C8051F120.H"
#include <intrins.h>
sbit OLED_DC=P5^1;
sbit OLED_WR=P5^2;
sbit OLED_RD=P5^3;
sbit OLED_RES=P5^4;
sbit OLED_CS=P5^6;
unsigned char code matrix1[32]={0x00,0x08,0x04,0x08,0x7E,0x08,0x44,0x08,
0x47,0xFE,0x44,0x08,0x44,0x08,0x7C,0x88,
0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,
0x7C,0x08,0x44,0x48,0x00,0x28,0x00,0x10}; //时
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role: 系统端口初始化
//--------------------------------------------------
void IOPort_INIT()
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
P0MDOUT |= 0xff;
// P1MDOUT = 0xf7; // Set P1.6(TB_LED) to push-pull
P1MDOUT = 0xB7;
P2MDOUT |= 0xff; // Set P2.2(AB4_LED1)
// all pins used by the external memory interface are in push-pull mode
P4MDOUT = 0xfF;
P5MDOUT = 0xFF; // P5MDOUT = 0x5F;
P6MDOUT = 0xFF;
P7MDOUT = 0xFF;
P3MDOUT|=0x80;
// P0 &=~0x08;
P0 = 0xFF;
P1 = 0xA3;
P2 = 0xbB;
P3 = 0x2c;
P4 = 0xe5; // /OLED_WR, /OLED_RD, are high, OLED_RESET is low
P5 = 0xFF;
P6 = 0xFF; // P5, P6 contain the addOLED_RESs lines
P7 = 0xFF; // P7 contains the data lines
SFRPAGE = 0;
TCON |= 0x04;
SFRPAGE = CONFIG_PAGE; // Make /INT0 level triggered
// Enable UART0, CP0, and /INT0. This puts /INT0 on P0.3.
XBR0 = 0x06;
XBR1 = 0x14;
XBR2 = 0x44;
SFRPAGE = SFRPAGE_SAVE; // OLED_REStore SFR page
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:系统时钟初始化
//--------------------------------------------------
void SYSTEMCLK_INIT()
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
int i = 0;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
PLL0CN = 0x04;
CCH0CN &= ~0x20;
SFRPAGE = LEGACY_PAGE;
FLSCL = 0xB0;
SFRPAGE = CONFIG_PAGE;
CCH0CN |= 0x20;
PLL0CN |= 0x01;
PLL0DIV = 0x01;
PLL0FLT = 0x01;
PLL0MUL = 0x04;
for (i = 0; i < 30; i++); // Wait 5us for initialization
PLL0CN |= 0x02;
while ((PLL0CN & 0x10) == 0);
CLKSEL = 0x02;
SFRPAGE = SFRPAGE_SAVE; // OLED_REStore SFR page
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:延时
//--------------------------------------------------
void Delay() //4.5us
{
unsigned char i;
for(i=0;i<100;i++)
_nop_();
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED写命令
//--------------------------------------------------
void OLED_Command(unsigned char Command)
{
unsigned char i,cache;
SFRPAGE = CONFIG_PAGE;
P2 &=~(1<<0);
P2 &=~(1<<1); //送数时钟
P2 &=~(1<<2); //锁存输出时钟
for(i=0;i<8;i++)
{
cache=(Command>>i);
cache &=0x01;
if(1==cache)
{
P2 |=(1<<0);
}
else
{
P2 &=~(1<<0);
}
P2 |=(1<<1);
Delay();
P2 &=~(1<<1);
}
OLED_WR=0;
//Delay();
OLED_DC=1;
OLED_RD=1;
OLED_CS=0;
P2 |=(1<<2);
Delay();
P2 &=~(1<<2);
Delay();
Delay();
OLED_WR=1;
OLED_CS=1;
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED写数据
//--------------------------------------------------
void OLED_Data(unsigned char Data)
{
unsigned char i,cache;
SFRPAGE = CONFIG_PAGE;
P2 &=~(1<<0);
P2 &=~(1<<1); //送数时钟
P2 &=~(1<<2); //锁存输出时钟
for(i=0;i<8;i++)
{
cache=(Data>>i);
cache &=0x01;
if(1==cache)
{
P2 |=(1<<0);
}
else
{
P2 &=~(1<<0);
}
P2 |=(1<<1);
Delay();
P2 &=~(1<<1);
}
OLED_WR=0;
Delay();
OLED_DC=0;
OLED_RD=1;
OLED_CS=0;
P2 |=(1<<2);
Delay();
P2 &=~(1<<2);
Delay();
Delay();
OLED_WR=1;
OLED_CS=1;
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED驱动芯片SSD1303初始化
//--------------------------------------------------
void SSD_INIT()
{
OLED_RES=0;
Delay();
OLED_RES=1;
Delay();
OLED_Command(0xae); //display off
OLED_Command(0x41); //display start line 00000
OLED_Command(0x81); //contrast
OLED_Command(0x80);
OLED_Command(0x82); //brightness
OLED_Command(0x80);
OLED_Command(0xa0); //no remap
OLED_Command(0xa4); //intire display off
OLED_Command(0xa6); //normal display
OLED_Command(0xa8); //39 mux
OLED_Command(0x39);
OLED_Command(0xad); //DCDC off
OLED_Command(0x8a);
OLED_Command(0xc8); //scan from COM[N-1] to COM0
OLED_Command(0xd3); //row 0->com 62
OLED_Command(0x23);
OLED_Command(0xd8); //mono mode,normal power mode
OLED_Command(0x00);
OLED_Command(0xda); //alternative COM pin configuration
OLED_Command(0x12);
OLED_Command(0xaf); //display on
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED初始化(全亮)
//--------------------------------------------------
void OLED_INIT()
{
unsigned char i,j;
unsigned char k=0;
for(i=0;i<4;i++)
{
OLED_Command(0xb0+i);
OLED_Command(0x00);
OLED_Command(0x10);
for(j=0;j<128;j++)
{
OLED_Data(0x00);//全亮
}
}
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:
//--------------------------------------------------
void main (void)
{
IOPort_INIT();
SYSTEMCLK_INIT();
SSD_INIT();
OLED_INIT();
} |
|