jlx12864.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include "fonts.h"
  4. #include "jlx12864.h"
  5. #include "pins.h"
  6. /* LCD type: 0 - uc1701, 1 - ssd1306 */
  7. uint8_t lcd_type = 0;
  8. void init_uc1701(void);
  9. void init_ssd1306(void);
  10. void ssd1306_off();
  11. void ssd1306_on();
  12. void delay(int i)
  13. {
  14. volatile int j,k;
  15. for(j=0;j<i;j++)
  16. for(k=0;k<110;k++);
  17. }
  18. void transfer_command(int data) {
  19. uint8_t i;
  20. gpio_set(OLED_CS, 0);
  21. gpio_set(OLED_CD, 0);
  22. for(i=0;i<8;i++) {
  23. gpio_set(OLED_SCK, 0);
  24. if (data & 0x80)
  25. gpio_set(OLED_MOSI, 1);
  26. else
  27. gpio_set(OLED_MOSI, 0);
  28. gpio_set(OLED_SCK, 1);
  29. data <<= 1;
  30. }
  31. gpio_set(OLED_CS, 1);
  32. }
  33. void transfer_data(int data) {
  34. uint8_t i;
  35. gpio_set(OLED_CS, 0);
  36. gpio_set(OLED_CD, 1);
  37. for(i=0;i<8;i++) {
  38. gpio_set(OLED_SCK, 0);
  39. if (data & 0x80)
  40. gpio_set(OLED_MOSI, 1);
  41. else
  42. gpio_set(OLED_MOSI, 0);
  43. gpio_set(OLED_SCK, 1);
  44. data <<= 1;
  45. }
  46. gpio_set(OLED_CS, 1);
  47. }
  48. void init_lcd() {
  49. /* Detect LCD type */
  50. if (gpio_get(OLED_TYPE)) {
  51. gpio_set(LCD_BKLGHT, true);
  52. init_uc1701();
  53. lcd_type = 0;
  54. }
  55. else {
  56. init_ssd1306();
  57. lcd_type = 1;
  58. }
  59. }
  60. void init_uc1701()
  61. {
  62. gpio_set(OLED_CS, 0);
  63. gpio_set(OLED_RST, 0);
  64. delay(500);
  65. gpio_set(OLED_RST, 1);
  66. delay(200);
  67. transfer_command(0xe2);
  68. transfer_command(0x2c);
  69. transfer_command(0x2e);
  70. transfer_command(0x2f);
  71. transfer_command(0x24);
  72. transfer_command(0x81);
  73. transfer_command(0x1a);
  74. transfer_command(0xa2);
  75. transfer_command(0xc8);
  76. transfer_command(0xa0);
  77. transfer_command(0x40);
  78. transfer_command(0xaf);
  79. gpio_set(OLED_CS, 1);
  80. }
  81. void init_ssd1306()
  82. {
  83. gpio_set(OLED_CS, 0);
  84. gpio_set(OLED_RST, 0);
  85. delay(500);
  86. gpio_set(OLED_RST, 1);
  87. delay(200);
  88. /* Display off */
  89. transfer_command(0xAE);
  90. /* Set lower column address */
  91. transfer_command(0x02);
  92. /* Set higher column address */
  93. transfer_command(0x10);
  94. /* Set display start line */
  95. transfer_command(0x40);
  96. /* Set page address */
  97. transfer_command(0xB0);
  98. /* Set contrast value 0xFF */
  99. transfer_command(0x81);
  100. transfer_command(0xFF);
  101. /* Normal / reverse */
  102. transfer_command(0xA6);
  103. /* Multiplex ratio */
  104. transfer_command(0xA8);
  105. /* duty = 1/64 */
  106. transfer_command(0x3F);
  107. /* Set charge pump enable */
  108. transfer_command(0xAD);
  109. transfer_command(0x8B);
  110. /* Set Vpp 9V (0x30 - 0x33) */
  111. transfer_command(0x33);
  112. // /* Set segment remap */
  113. // transfer_command(0xA1);
  114. // /* COM scan direction */
  115. // transfer_command(0xC8);
  116. /* Rotate display 180 degree*/
  117. /* Set segment remap */
  118. transfer_command(0xA0);
  119. /* COM scan direction */
  120. transfer_command(0xC0);
  121. /* Set display offset */
  122. transfer_command(0xD3);
  123. transfer_command(0x00);
  124. /* Set osc divider */
  125. transfer_command(0xD5);
  126. transfer_command(0x80);
  127. /* Set precharge period */
  128. transfer_command(0xD9);
  129. transfer_command(0x1F);
  130. /* setc COM pins */
  131. transfer_command(0xDA);
  132. transfer_command(0x12);
  133. /* Set vcomh */
  134. transfer_command(0xDB);
  135. transfer_command(0x40);
  136. /* Display on */
  137. transfer_command(0xAF);
  138. gpio_set(OLED_CS, 1);
  139. }
  140. void ssd1306_off() {
  141. transfer_command(0xAE);
  142. }
  143. void ssd1306_on() {
  144. transfer_command(0xAF);
  145. }
  146. void lcd_address(uint8_t page, uint8_t column) {
  147. gpio_set(OLED_CS, 0);
  148. /* Specify different column offset for lcd types */
  149. if (lcd_type == 0) {
  150. column=column-1;
  151. }
  152. else {
  153. column=column+1;
  154. }
  155. page=page-1;
  156. transfer_command(0xb0 + page);
  157. transfer_command(((column >> 4) & 0x0f) + 0x10);
  158. transfer_command(column & 0x0f);
  159. }
  160. void clear_screen(void) {
  161. uint8_t i,j;
  162. gpio_set(OLED_CS, 0);
  163. for(j=0;j<8;j++) {
  164. lcd_address(1 + j,1);
  165. for(i=0;i<132;i++) {
  166. transfer_data(0x00);
  167. }
  168. }
  169. }
  170. //full display test
  171. void full_display(uint8_t data1, uint8_t data2) {
  172. int i,j;
  173. for(i=0; i<8; i++) {
  174. lcd_address(i+1,1);
  175. for(j=0;j<64;j++) {
  176. transfer_data(data1);
  177. transfer_data(data2);
  178. }
  179. }
  180. }
  181. void test_box(void) {
  182. int i,j;
  183. lcd_address(1,1);
  184. transfer_data(0xff);
  185. for(i=1;i<127;i++) {
  186. transfer_data(0x01);
  187. }
  188. transfer_data(0xff);
  189. lcd_address(2,1);
  190. transfer_data(0xff);
  191. for(i=1;i<127;i++) {
  192. transfer_data(0x80);
  193. }
  194. transfer_data(0xff);
  195. lcd_address(3,1);
  196. transfer_data(0xff);
  197. for(i=1;i<127;i++) {
  198. transfer_data(0x01);
  199. }
  200. transfer_data(0xff);
  201. for(j=4;j<=7;j++) {
  202. lcd_address(j,1);
  203. transfer_data(0xff);
  204. for(i=1;i<127;i++) {
  205. transfer_data(0x00);
  206. }
  207. transfer_data(0xff);
  208. }
  209. lcd_address(8,1);
  210. transfer_data(0xff);
  211. for(i=1;i<127;i++) {
  212. transfer_data(0x80);
  213. }
  214. transfer_data(0xff);
  215. }
  216. void test(void) {
  217. full_display(0xff,0xff);
  218. delay(1000);
  219. full_display(0x55,0x55);
  220. delay(1000);
  221. full_display(0xaa,0xaa);
  222. delay(1000);
  223. full_display(0xff,0x00);
  224. delay(1000);
  225. full_display(0x00,0xff);
  226. delay(1000);
  227. full_display(0x55,0xaa);
  228. delay(1000);
  229. full_display(0xaa,0x55);
  230. delay(1000);
  231. test_box();
  232. delay(1000);
  233. }
  234. /*
  235. void display_128x64(uchar *dp) {
  236. uint i,j;
  237. for(j=0;j<8;j++) {
  238. lcd_address(j+1,1);
  239. for (i=0;i<128;i++) {
  240. transfer_data(*dp);
  241. dp++;
  242. }
  243. }
  244. }
  245. void display_128x16(uchar page,uchar column,uchar *dp) {
  246. uint i,j;
  247. for(j=0;j<2;j++) {
  248. lcd_address(page+j,column);
  249. for (i=0;i<128;i++) {
  250. transfer_data(*dp);
  251. dp++;
  252. }
  253. }
  254. }
  255. void display_graphic_32x32(uchar page,uchar column,uchar *dp) {
  256. uchar i,j;
  257. for(j=0;j<4;j++) {
  258. lcd_address(page+j,column);
  259. for (i=0;i<32;i++) {
  260. transfer_data(*dp);
  261. dp++;
  262. }
  263. }
  264. }
  265. void display_graphic_16x16(uchar page,uchar column,uchar *dp) {
  266. uchar i,j;
  267. for(j=0;j<2;j++) {
  268. lcd_address(page+j,column);
  269. for (i=0;i<16;i++) {
  270. transfer_data(*dp);
  271. dp++;
  272. }
  273. }
  274. }
  275. void display_graphic_8x16(uchar page,uchar column,uchar *dp) {
  276. uchar i,j;
  277. for(j=0;j<2;j++) {
  278. lcd_address(page+j,column);
  279. for (i=0;i<8;i++) {
  280. transfer_data(*dp);
  281. dp++;
  282. }
  283. }
  284. }
  285. void display_string_8x16(uint page,uint column,uchar *text)
  286. {
  287. uint i=0,j,k,n;
  288. if(column>123)
  289. {
  290. column=1;
  291. page+=2;
  292. }
  293. while(text[i]>0x00)
  294. {
  295. if((text[i]>=0x20)&&(text[i]<=0x7e))
  296. {
  297. j=text[i]-0x20;
  298. for(n=0;n<2;n++)
  299. {
  300. lcd_address(page+n,column);
  301. for(k=0;k<8;k++)
  302. {
  303. transfer_data(ascii_table_8x16[j][k+8*n]);
  304. }
  305. }
  306. i++;
  307. column+=8;
  308. }
  309. else
  310. i++;
  311. }
  312. }
  313. */
  314. void display_string_5x8(uint8_t page, uint8_t column, uint8_t reverse, char *text) {
  315. uint8_t i=0,k,disp_data;
  316. uint16_t j;
  317. bool is_symbol = 0;
  318. while (text[i] > 0x00) {
  319. if ((text[i] == 0xd0) || (text[i] == 0xd1))
  320. is_symbol = 1;
  321. if ((text[i] >= 0x20) && (text[i] <= 0x7e))
  322. is_symbol = 1;
  323. if (is_symbol) {
  324. if (text[i] == 0xd0)
  325. {
  326. i++;
  327. if(text[i] >= 0x90 && text[i] <= 0xbf)
  328. j = 6*(text[i] - 0x90);
  329. else
  330. j = 6*65;
  331. }
  332. else if(text[i] == 0xd1)
  333. {
  334. i++;
  335. if((text[i] >= 0x80 && text[i] <= 0x8f))
  336. j = 6*(text[i] - 0x50);
  337. else
  338. j = 6*64;
  339. }
  340. else
  341. j = 6*(text[i]-0x20);
  342. lcd_address(page,column);
  343. for(k=0;k<6;k++) {
  344. if (reverse==1) {
  345. if(text[i]>=0x80 || text[i]==0x01)//((text[i]<0x20)||(text[i]>0x7f))
  346. disp_data = ~cyrillic_font5x8[j + k];
  347. else
  348. disp_data = ~Fonts5x8[j + k];
  349. }
  350. else {
  351. if(text[i]>=0x80 || text[i]==0x01)//((text[i]<0x20)||(text[i]>0x7f))
  352. disp_data = cyrillic_font5x8[j + k];
  353. else
  354. disp_data = Fonts5x8[j + k];
  355. }
  356. transfer_data(disp_data);
  357. }
  358. i++;
  359. column+=6;
  360. if(column>123) {
  361. column=1;
  362. page++;
  363. }
  364. }
  365. else i++;
  366. }
  367. }
  368. /*
  369. void display_string_16x16(uchar page,uchar column,uchar *text)
  370. {
  371. uchar i,j,k;
  372. uint address;
  373. j = 0;
  374. while(text[j] != '\0')
  375. {
  376. i = 0;
  377. address = 1;
  378. while(Chinese_text_16x16[i] > 0x7e)
  379. {
  380. if(Chinese_text_16x16[i] == text[j])
  381. {
  382. if(Chinese_text_16x16[i + 1] == text[j + 1])
  383. {
  384. address = i * 16;
  385. break;
  386. }
  387. }
  388. i += 2;
  389. }
  390. if(column > 113)
  391. {
  392. column = 0;
  393. page += 2;
  394. }
  395. if(address != 1)
  396. {
  397. for(k=0;k<2;k++)
  398. {
  399. lcd_address(page+k,column);
  400. for(i = 0; i < 16; i++)
  401. {
  402. transfer_data(Chinese_code_16x16[address]);
  403. address++;
  404. }
  405. }
  406. j += 2;
  407. }
  408. else
  409. {
  410. for(k=0;k<2;k++)
  411. {
  412. lcd_address(page+k,column)
  413. for(i = 0; i < 16; i++)
  414. {
  415. transfer_data(0x00);
  416. }
  417. }
  418. j++;
  419. }
  420. column+=16;
  421. }
  422. }
  423. void disp_string_8x16_16x16(uchar page,uchar column,uchar *text
  424. )
  425. {
  426. uchar temp[3];
  427. uchar i = 0;
  428. while(text[i] != '\0')
  429. {
  430. if(text[i] > 0x7e)
  431. {
  432. temp[0] = text[i];
  433. temp[1] = text[i + 1];
  434. temp[2] = '\0';
  435. display_string_16x16(page,column,temp);
  436. column += 16;
  437. i += 2;
  438. }
  439. else
  440. {
  441. temp[0] = text[i];
  442. temp[1] = '\0';
  443. display_string_8x16(page, column, temp);
  444. column += 8;
  445. i++;
  446. }
  447. }
  448. }
  449. //显示镜像
  450. void display_mirror()
  451. {
  452. clear_screen();
  453. disp_string_8x16_16x16(1,1," 左右上下镜像: ");
  454. delay(7000);
  455. clear_screen();
  456. display_128x64(bmp12864_4);
  457. // delay(7000);
  458. waitkey();
  459. transfer_command(0xc8);
  460. transfer_command(0xa0);
  461. clear_screen();
  462. display_128x64(bmp12864_4);
  463. // delay(7000);
  464. waitkey();
  465. transfer_command(0xc0);
  466. transfer_command(0xa1);
  467. clear_screen();
  468. display_128x64(bmp12864_4);
  469. // delay(7000);
  470. waitkey();
  471. transfer_command(0xc0);
  472. transfer_command(0xa0);
  473. clear_screen();
  474. display_128x64(bmp12864_4);
  475. // delay(7000);
  476. waitkey();
  477. transfer_command(0xc8);
  478. transfer_command(0xa1);
  479. }
  480. //对比度调节
  481. void contrast_control()
  482. {
  483. clear_screen();
  484. disp_string_8x16_16x16(1,1,"软件调节亮度:");
  485. display_string_8x16(4,52,"0xcf");
  486. display_128x16(7,1,bmp12816_1);
  487. display_graphic_16x16(7,1+16*4,bmp16x16_1);
  488. // delay(7000);
  489. waitkey();
  490. transfer_command(0x81);
  491. transfer_command(0xdf);
  492. display_string_8x16(4,52,"0xdf");
  493. display_128x16(7,1,bmp12816_1);
  494. display_graphic_16x16(7,1+16*5,bmp16x16_1);
  495. // delay(7000);
  496. waitkey();
  497. transfer_command(0x81);
  498. transfer_command(0xef);
  499. display_string_8x16(4,52,"0xef");
  500. display_128x16(7,1,bmp12816_1);
  501. display_graphic_16x16(7,1+16*6,bmp16x16_1);
  502. // delay(7000);
  503. waitkey();
  504. transfer_command(0x81);
  505. transfer_command(0xff);
  506. display_string_8x16(4,52,"0xff");
  507. display_128x16(7,1,bmp12816_1);
  508. display_graphic_16x16(7,1+16*7,bmp16x16_1);
  509. // delay(7000);
  510. waitkey();
  511. transfer_command(0x81);
  512. transfer_command(0x00);
  513. display_string_8x16(4,52,"0x00");
  514. display_128x16(7,1,bmp12816_1);
  515. display_graphic_16x16(7,1+16*0,bmp16x16_1);
  516. // delay(7000);
  517. waitkey();
  518. transfer_command(0x81);
  519. transfer_command(0x5f);
  520. display_string_8x16(4,52,"0x5f");
  521. display_128x16(7,1,bmp12816_1);
  522. display_graphic_16x16(7,1+16*1,bmp16x16_1);
  523. // delay(7000);
  524. waitkey();
  525. transfer_command(0x81);
  526. transfer_command(0xcf);
  527. display_string_8x16(4,52,"0xcf");
  528. display_128x16(7,1,bmp12816_1);
  529. display_graphic_16x16(7,1+16*4,bmp16x16_1);
  530. // delay(7000);
  531. waitkey();
  532. }
  533. void main(void)
  534. {
  535. while(1) {
  536. initial_lcd();
  537. clear_screen();
  538. display_string_5x8(1,1,0,"{(5x8dot ASCII char)}");
  539. display_string_5x8(2,1,0,"{[(<~!@#$%^&*_+=?>)]}");
  540. disp_string_8x16_16x16(3,1,"标准 16x16dot 汉字");
  541. display_graphic_32x32 (5,1+32*0,jing1);
  542. display_graphic_32x32 (5,1+32*1,lian1);
  543. display_graphic_32x32 (5,1+32*2,xun1);
  544. disp_string_8x16_16x16(5,1+32*3,"JLX:");
  545. disp_string_8x16_16x16(7,1+32*3,"OLED");
  546. waitkey();
  547. clear_screen();
  548. //clear all dots
  549. display_string_5x8(1,1,1,"012345678901234567890");
  550. display_string_5x8(1,1,1," MENU ");
  551. display_string_5x8(3,1,0,"Select>>>>");
  552. display_string_5x8(3,64,1,"1.Graphic ");
  553. display_string_5x8(4,64,0,"2.Chinese " );
  554. display_string_5x8(5,64,0,"3.Movie ");
  555. display_string_5x8(6,64,0,"4.Contrast");
  556. display_string_5x8(7,64,0,"5.Mirror ");
  557. display_string_5x8(8,1,1,"PRE USER DEL NEW");
  558. display_string_5x8(8,19,0," ");
  559. display_string_5x8(8,65,0," ");
  560. display_string_5x8(8,97,0," ");
  561. waitkey();
  562. contrast_control();
  563. waitkey();
  564. display_mirror();
  565. waitkey();
  566. test();
  567. }
  568. }
  569. */