| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 | #include <stdbool.h>#include <stdint.h>#include "fonts.h"#include "jlx12864.h"#include "pins.h"/* LCD type: 0 - uc1701, 1 - ssd1306 */uint8_t lcd_type = 0;void init_uc1701(void);void init_ssd1306(void);void ssd1306_off();void ssd1306_on();void delay(int i) {       volatile int j,k;       for(j=0;j<i;j++)             for(k=0;k<110;k++); } void transfer_command(int data) { 	uint8_t i; 	gpio_set(OLED_CS, 0);	gpio_set(OLED_CD, 0);	for(i=0;i<8;i++) {		gpio_set(OLED_SCK, 0);			if (data & 0x80)			gpio_set(OLED_MOSI, 1);			else		    gpio_set(OLED_MOSI, 0);		gpio_set(OLED_SCK, 1);        	data <<= 1;     	}	gpio_set(OLED_CS, 1);} void transfer_data(int data) { 	uint8_t i; 	gpio_set(OLED_CS, 0);	gpio_set(OLED_CD, 1);	for(i=0;i<8;i++) {		gpio_set(OLED_SCK, 0);	 		if (data & 0x80)			gpio_set(OLED_MOSI, 1);		else   			gpio_set(OLED_MOSI, 0);		gpio_set(OLED_SCK, 1);		data <<= 1;     	} 	gpio_set(OLED_CS, 1);} void init_lcd() {    /* Detect LCD type */    if (gpio_get(OLED_TYPE)) {        gpio_set(LCD_BKLGHT, true);        init_uc1701();        lcd_type = 0;    }    else {        init_ssd1306();        lcd_type = 1;    }}void init_uc1701(){	gpio_set(OLED_CS, 0);	gpio_set(OLED_RST, 0);	delay(500);	gpio_set(OLED_RST, 1);	delay(200);	transfer_command(0xe2);	transfer_command(0x2c);	transfer_command(0x2e);	transfer_command(0x2f);	transfer_command(0x24);	transfer_command(0x81);	transfer_command(0x1a);    transfer_command(0xa2);	transfer_command(0xc8);	transfer_command(0xa0);	transfer_command(0x40);	transfer_command(0xaf);	gpio_set(OLED_CS, 1);}void init_ssd1306(){    gpio_set(OLED_CS, 0);    gpio_set(OLED_RST, 0);    delay(500);    gpio_set(OLED_RST, 1);    delay(200);    /* Display off */    transfer_command(0xAE);    /* Set lower column address */    transfer_command(0x02);    /* Set higher column address */    transfer_command(0x10);    /* Set display start line */    transfer_command(0x40);    /* Set page address */    transfer_command(0xB0);    /* Set contrast value 0xFF */    transfer_command(0x81);    transfer_command(0xFF);    /* Normal / reverse */    transfer_command(0xA6);    /* Multiplex ratio */    transfer_command(0xA8);    /* duty = 1/64 */    transfer_command(0x3F);    /* Set charge pump enable */    transfer_command(0xAD);    transfer_command(0x8B);    /* Set Vpp 9V (0x30 - 0x33) */    transfer_command(0x33);//    /* Set segment remap *///    transfer_command(0xA1);//    /* COM scan direction *///    transfer_command(0xC8);    /* Rotate display 180 degree*/    /* Set segment remap */    transfer_command(0xA0);    /* COM scan direction */    transfer_command(0xC0);    /* Set display offset */    transfer_command(0xD3);    transfer_command(0x00);    /* Set osc divider */    transfer_command(0xD5);    transfer_command(0x80);    /* Set precharge period */    transfer_command(0xD9);    transfer_command(0x1F);    /* setc COM pins */    transfer_command(0xDA);    transfer_command(0x12);    /* Set vcomh */    transfer_command(0xDB);    transfer_command(0x40);    /* Display on */    transfer_command(0xAF);    gpio_set(OLED_CS, 1);}void ssd1306_off() {        transfer_command(0xAE);}void ssd1306_on() {        transfer_command(0xAF);}void lcd_address(uint8_t page, uint8_t column) {	gpio_set(OLED_CS, 0);	/* Specify different column offset for lcd types */	if (lcd_type == 0) {		column=column-1;	}	else {	    column=column+1;	}    page=page-1;     	transfer_command(0xb0 + page);                	transfer_command(((column >> 4) & 0x0f) + 0x10);	transfer_command(column & 0x0f);  } void clear_screen(void) {	uint8_t i,j; 	gpio_set(OLED_CS, 0);	for(j=0;j<8;j++) {		lcd_address(1 + j,1); 		for(i=0;i<132;i++) { 			transfer_data(0x00); 		} 	} } //full display test void full_display(uint8_t data1, uint8_t data2) { 	int i,j; 	for(i=0; i<8; i++) { 		lcd_address(i+1,1); 		for(j=0;j<64;j++) { 			transfer_data(data1); 			transfer_data(data2);                        		}       }           } void test_box(void) { 	int i,j; 	lcd_address(1,1); 	transfer_data(0xff); 	for(i=1;i<127;i++) { 		transfer_data(0x01);   	} 	transfer_data(0xff); 		lcd_address(2,1); 	transfer_data(0xff); 	for(i=1;i<127;i++) { 		transfer_data(0x80);   	} 	transfer_data(0xff); 	lcd_address(3,1); 	transfer_data(0xff); 	for(i=1;i<127;i++) { 		transfer_data(0x01);   	} 	transfer_data(0xff);  	for(j=4;j<=7;j++) {		lcd_address(j,1); 		transfer_data(0xff); 		for(i=1;i<127;i++) { 			transfer_data(0x00);   		}	 		transfer_data(0xff);   	} 	lcd_address(8,1); 	transfer_data(0xff); 	for(i=1;i<127;i++) { 		transfer_data(0x80);   	} 	transfer_data(0xff); } void test(void) { 	full_display(0xff,0xff);           	delay(1000);	full_display(0x55,0x55); 	delay(1000);	full_display(0xaa,0xaa); 	delay(1000);	full_display(0xff,0x00);	delay(1000);	full_display(0x00,0xff); 	delay(1000);	full_display(0x55,0xaa); 	delay(1000);	full_display(0xaa,0x55);     	delay(1000);	test_box(); 	delay(1000);} /*void display_128x64(uchar *dp) { 	uint i,j; 	for(j=0;j<8;j++) { 		lcd_address(j+1,1); 		for (i=0;i<128;i++) {  			transfer_data(*dp); 			dp++;  		}  	} } void display_128x16(uchar page,uchar column,uchar *dp) { 	uint i,j; 	for(j=0;j<2;j++) { 		lcd_address(page+j,column); 		for (i=0;i<128;i++) {  			transfer_data(*dp); 			dp++; 		} 	} } void display_graphic_32x32(uchar page,uchar column,uchar *dp) { 	uchar i,j; 	for(j=0;j<4;j++) { 		lcd_address(page+j,column); 		for (i=0;i<32;i++) {  			transfer_data(*dp);         			dp++; 		} 	} } void display_graphic_16x16(uchar page,uchar column,uchar *dp) { 	uchar i,j; 	for(j=0;j<2;j++) { 		lcd_address(page+j,column); 		for (i=0;i<16;i++) { 		transfer_data(*dp);         		dp++; 		} 	} } void display_graphic_8x16(uchar page,uchar column,uchar *dp) { 	uchar i,j; 	for(j=0;j<2;j++) { 		lcd_address(page+j,column); 		for (i=0;i<8;i++) {  			transfer_data(*dp); 			dp++; 		} 	} } void display_string_8x16(uint page,uint column,uchar *text) {       uint i=0,j,k,n;       if(column>123)  {             column=1;             page+=2;  }       while(text[i]>0x00)  {              if((text[i]>=0x20)&&(text[i]<=0x7e))   {                   j=text[i]-0x20;                   for(n=0;n<2;n++)    {    lcd_address(page+n,column); for(k=0;k<8;k++)     {      transfer_data(ascii_table_8x16[j][k+8*n]);      }    }                   i++;                   column+=8;   }   else             i++;  } } */void display_string_5x8(uint8_t page, uint8_t column, uint8_t reverse, char *text) {	uint8_t i=0,k,disp_data;	uint16_t j;	bool is_symbol = 0;	while (text[i] > 0x00) {		if ((text[i] == 0xd0) || (text[i] == 0xd1))			is_symbol = 1;		if ((text[i] >= 0x20) && (text[i] <= 0x7e))		      is_symbol = 1;  		if (is_symbol) {			if (text[i] == 0xd0)			{				i++;				if(text[i] >= 0x90 && text[i] <= 0xbf)					j = 6*(text[i] - 0x90);				else					j = 6*65;			}			else if(text[i] == 0xd1)			{				i++;				if((text[i] >= 0x80 && text[i] <= 0x8f))					j = 6*(text[i] - 0x50);				else					j = 6*64;			}			else				j = 6*(text[i]-0x20);			lcd_address(page,column);			for(k=0;k<6;k++) {				if (reverse==1) { 					if(text[i]>=0x80 || text[i]==0x01)//((text[i]<0x20)||(text[i]>0x7f))						disp_data = ~cyrillic_font5x8[j + k];					else						disp_data = ~Fonts5x8[j + k];				}				else { 					if(text[i]>=0x80 || text[i]==0x01)//((text[i]<0x20)||(text[i]>0x7f))						disp_data = cyrillic_font5x8[j + k];					else						disp_data = Fonts5x8[j + k];				} 				transfer_data(disp_data);			} 			i++; 			column+=6; 			if(column>123) { 				column=1; 				page++; 			} 		} 		else i++; 	} } /*void display_string_16x16(uchar page,uchar column,uchar *text) {     uchar i,j,k;     uint address;      j = 0;     while(text[j] != '\0')     {         i = 0;         address = 1;         while(Chinese_text_16x16[i] > 0x7e)            {             if(Chinese_text_16x16[i] == text[j])             {                 if(Chinese_text_16x16[i + 1] == text[j + 1])                 {                     address = i * 16;                     break;                 }             }             i += 2;                     }         if(column > 113)         {             column = 0;             page += 2;         }         if(address != 1)        {                   for(k=0;k<2;k++)    { lcd_address(page+k,column);                   for(i = 0; i < 16; i++)                                  {                       transfer_data(Chinese_code_16x16[address]);                         address++;                   }                   }             j += 2;                 }         else                   {                   for(k=0;k<2;k++)    { lcd_address(page+k,column)for(i = 0; i < 16; i++)                  {                       transfer_data(0x00);                      }                   }             j++;         }         column+=16;     } } void disp_string_8x16_16x16(uchar page,uchar column,uchar *text) {     uchar temp[3];     uchar i = 0;         while(text[i] != '\0')     {         if(text[i] > 0x7e)         {             temp[0] = text[i];             temp[1] = text[i + 1];             temp[2] = '\0';                      display_string_16x16(page,column,temp);              column += 16;             i += 2;         }         else         {             temp[0] = text[i];                 temp[1] = '\0';                      display_string_8x16(page, column, temp);              column += 8;             i++;         }     } } //显示镜像        void display_mirror() {       clear_screen();       disp_string_8x16_16x16(1,1,"  左右上下镜像: ");       delay(7000);       clear_screen();       display_128x64(bmp12864_4); //          delay(7000);             waitkey();       transfer_command(0xc8);                 transfer_command(0xa0);                clear_screen();       display_128x64(bmp12864_4); //          delay(7000);             waitkey();       transfer_command(0xc0);               transfer_command(0xa1);              clear_screen();       display_128x64(bmp12864_4); //          delay(7000);             waitkey();       transfer_command(0xc0);             transfer_command(0xa0);            clear_screen();       display_128x64(bmp12864_4); //          delay(7000);             waitkey();       transfer_command(0xc8);           transfer_command(0xa1);    } //对比度调节 void contrast_control() {             clear_screen();             disp_string_8x16_16x16(1,1,"软件调节亮度:");             display_string_8x16(4,52,"0xcf");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*4,bmp16x16_1); //          delay(7000);             waitkey();                         transfer_command(0x81);             transfer_command(0xdf);             display_string_8x16(4,52,"0xdf");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*5,bmp16x16_1); //          delay(7000);             waitkey();             transfer_command(0x81);             transfer_command(0xef);             display_string_8x16(4,52,"0xef");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*6,bmp16x16_1); //          delay(7000);             waitkey();             transfer_command(0x81);             transfer_command(0xff);             display_string_8x16(4,52,"0xff");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*7,bmp16x16_1); //          delay(7000);             waitkey();             transfer_command(0x81);             transfer_command(0x00);             display_string_8x16(4,52,"0x00");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*0,bmp16x16_1); //          delay(7000);             waitkey();             transfer_command(0x81);             transfer_command(0x5f);             display_string_8x16(4,52,"0x5f");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*1,bmp16x16_1); //          delay(7000);             waitkey();             transfer_command(0x81);             transfer_command(0xcf);             display_string_8x16(4,52,"0xcf");             display_128x16(7,1,bmp12816_1);             display_graphic_16x16(7,1+16*4,bmp16x16_1); //          delay(7000);             waitkey();             } void main(void) {        while(1) {        initial_lcd();         clear_screen(); 	display_string_5x8(1,1,0,"{(5x8dot ASCII char)}");        display_string_5x8(2,1,0,"{[(<~!@#$%^&*_+=?>)]}");         disp_string_8x16_16x16(3,1,"标准 16x16dot 汉字");        	display_graphic_32x32 (5,1+32*0,jing1);          display_graphic_32x32 (5,1+32*1,lian1);         display_graphic_32x32 (5,1+32*2,xun1);                                             disp_string_8x16_16x16(5,1+32*3,"JLX:");         disp_string_8x16_16x16(7,1+32*3,"OLED");         waitkey();         clear_screen();     //clear all dots         display_string_5x8(1,1,1,"012345678901234567890");        display_string_5x8(1,1,1,"        MENU         ");         display_string_5x8(3,1,0,"Select>>>>");         display_string_5x8(3,64,1,"1.Graphic ");                 display_string_5x8(4,64,0,"2.Chinese " );         display_string_5x8(5,64,0,"3.Movie   "); 	display_string_5x8(6,64,0,"4.Contrast"); 	display_string_5x8(7,64,0,"5.Mirror  "); 	display_string_5x8(8,1,1,"PRE  USER   DEL   NEW");         display_string_5x8(8,19,0," ");         display_string_5x8(8,65,0," ");         display_string_5x8(8,97,0," ");         waitkey();         contrast_control();         waitkey();         display_mirror(); 	waitkey(); 	test();     }}*/
 |