C12832 LCD kanji interface.

Dependents:  

Fork of GraphicOLED by Norimasa Okamoto

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers C12832_KANJI.cpp Source File

C12832_KANJI.cpp

00001 // C12832_KANJI.cpp
00002 #include "C12832_KANJI.h"
00003 
00004 extern void font_4x8(uint8_t buf[], int c); // misaki_4x8_jis201.cpp
00005 extern void font_8x8(uint8_t buf[], uint32_t unicode); // misaki_8x8_unicode.cpp
00006 
00007 C12832_KANJI::C12832_KANJI(PinName mosi, PinName sck, PinName reset, PinName a0, PinName ncs) : _spi(mosi,NC,sck),_reset(reset),_A0(a0),_CS(ncs) {
00008 
00009     _spi.format(8,3);                 // 8 bit spi mode 3
00010     //_spi.frequency(20000000);          // 19,2 Mhz SPI clock
00011     _A0 = 0;
00012     _CS = 1;
00013     _reset = 0;                        // display reset
00014     wait_us(50);
00015     _reset = 1;                       // end reset
00016     wait_ms(5);
00017  
00018     /* Start Initial Sequence ----------------------------------------------------*/
00019  
00020     writeCommand(0xAE);   //  display off
00021     writeCommand(0xA2);   //  bias voltage
00022  
00023     writeCommand(0xA0);
00024     writeCommand(0xC8);   //  colum normal
00025  
00026     writeCommand(0x22);   //  voltage resistor ratio
00027     writeCommand(0x2F);   //  power on
00028     //writeCommand(0xA4);   //  LCD display ram
00029     writeCommand(0x40);   // start line = 0
00030     writeCommand(0xAF);     // display ON
00031  
00032     writeCommand(0x81);   //  set contrast
00033     writeCommand(0x17);   //  set contrast
00034  
00035     writeCommand(0xA6);     // display normal
00036 
00037     _uni_len = 0;
00038 }
00039 
00040 void C12832_KANJI::g_write(uint8_t pat, int x, int y) {
00041     writeCommand(0x00 + ( x    &0x0f)); // set column low nibble 0
00042     writeCommand(0x10 + ((x>>4)&0x0f)); // set column hi  nibble 0
00043     writeCommand(0xB0 + y); // set page address
00044 
00045     writeData(pat);
00046 }
00047 
00048 void C12832_KANJI::g_write(uint8_t *buf, int len, int x, int y) {
00049     for(int i = 0; i < len; i++) {
00050         g_write(*buf++, x++, y);
00051     }
00052 }
00053 
00054 void C12832_KANJI::writeCommand(uint8_t command) {
00055     _A0 = 0;
00056     writeByte(command);
00057 }
00058 
00059 void C12832_KANJI::writeData(uint8_t data) {
00060     _A0 = 1;
00061     writeByte(data);
00062 }
00063 
00064 void C12832_KANJI::writeByte(uint8_t value) {
00065     _CS = 0;
00066     _spi.write(value);
00067     _CS = 1;
00068 }
00069 
00070 void C12832_KANJI::cls() {
00071     for(int y = 0; y < rows(); y++) {
00072         for(int x = 0; x < 128; x++) {
00073             g_write(0x00, x, y);
00074         }
00075     }
00076     locate(0,0);
00077     _uni_len = 0;
00078 }
00079 
00080 void C12832_KANJI::locate(int column, int row) {
00081     _column = column;
00082     _row = row;
00083 }
00084 
00085 int C12832_KANJI::columns() {
00086      return 128/4;
00087 }
00088 
00089 int C12832_KANJI::rows() {
00090     return 4;
00091 }
00092 
00093 int C12832_KANJI::_putc(int value)
00094 {
00095     int step = 0;
00096     if (value == '\n') {
00097         _column = 0;
00098         _row++;
00099         if (_row >= rows()) {
00100             _row = 0;
00101         }
00102         _uni_len = 0;
00103     } else if (value <= 0x7f) {
00104         step = character(_column, _row, value);
00105     } else if (value >= 0xc2 && value <= 0xdf) {
00106         _unicode = value & 0x1f;
00107         _uni_len = 1;
00108     } else if (value >= 0xe0 && value <= 0xef) {
00109         _unicode = value & 0x0f;
00110         _uni_len = 2;
00111     } else if (value >= 0xf0 && value <= 0xf7) {
00112         _unicode = value & 0x07;
00113         _uni_len = 3;
00114     } else if (value >= 0xf8 && value <= 0xfb) {
00115         _unicode = value & 0x03;
00116         _uni_len = 4;
00117     } else if (value >= 0xfc && value <= 0xfd) {
00118         _unicode = value & 0x01;
00119         _uni_len = 5;
00120     } else if (_uni_len >= 1 && value >= 0x80 && value <= 0xbf) {
00121         _unicode = (_unicode<<6) | (value&0x3f);
00122         if (--_uni_len == 0) {
00123             step = character(_column, _row, _unicode);
00124         }
00125     } else {
00126         _uni_len = 0;
00127     }
00128     if (step > 0) {
00129         _column += step;
00130         if (_column >= columns()) {
00131             _column = 0;
00132             if (++_row >= rows()) {
00133                 _row = 0;
00134             }
00135         }
00136         _uni_len = 0;
00137     }
00138     return value;
00139 }
00140 
00141 int C12832_KANJI::_getc() {
00142     return -1;
00143 }
00144 
00145 int C12832_KANJI::character(int column, int row, int c) {
00146     if (c <= 0x7f) { // 半角
00147         uint8_t buf[4];
00148         font_4x8(buf, c);
00149         g_write(buf, sizeof(buf), column*4, row);
00150         return 1;
00151     } else if (c >= 0xff61 && c <= 0xff9f) { // 半角カタカナ
00152         int i = c - 0xff61 + 0xa1;
00153         uint8_t buf[4];
00154         font_4x8(buf, i);
00155         g_write(buf, sizeof(buf), column*4, row);
00156         return 1;
00157     } else { // 全角
00158         uint8_t buf[8];
00159         font_8x8(buf, c);
00160         g_write(buf, sizeof(buf), column*4, row);
00161         return 2;
00162     }
00163 }
00164