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();
- }
- }
- */
|