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