|
最近买了块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) {
} }
|
|