/************************************************************************************* FileName: spi_glcd.c Dependencies: See INCLUDES section Processor: PIC18F14K50 Compiler: Microchip XC8 オリジナル・ソース作成:サイト名:「未来ガジェット研究所(仮)」 x1,x2,x3,x4文字表示関数の原典は、上記サイトだが自分に理解し易い書き方に修正してみた。 2019/11/19 N.Ishii **************************************************************************************/ #include #include "spi_glcd.h" #include "font.h" int x; int y; //-------- G-LCDを初期化する -------------------------------------- void LCD_int (void){ LCD_cmd (0xAE); // Display = OFF LCD_cmd (0xA0); // ADC = normal LCD_cmd (0xC8); // Common output = revers LCD_cmd (0xA3); // bias = 1/7 //--内部レギュレータを順番にON LCD_cmd (0x2C); // power control 1 __delay_ms(2); // 2mS遅延 LCD_cmd (0x2E); // power control 2 __delay_ms(2); // 2mS遅延 LCD_cmd (0x2F); // power control 3 //--コントラスト設定 LCD_cmd (0x23); // Vo voltage resistor ratio set LCD_cmd (0x81); // Electronic volume mode set LCD_cmd (0x1C); // Electronic volume value set //--表示設定 LCD_cmd (0xA4); // display all point normal(全点灯しない) LCD_cmd (0x40); // display start line = 0 LCD_cmd (0xA6); // Display normal(白黒反転しない) LCD_cmd (0xAF); // Display = ON // LCD_clr (); // データRAMを全消去 } //-------- G-LCDにコマンドを一文字送信する ----------------------- void LCD_cmd (char cmd){ SPI_CS = 0; // チップセレクト有効 SPI_RS = 0; // コマンドデータ指定 SSPBUF = cmd; // データの送信を開始 while(!SSPSTATbits.BF); // 送信完了を待つ cmd = SSPBUF; // BFをリセットするため空読み SPI_CS = 1; // チップセレクト無効 } //-------- G-LCD RAMに一バイト送信する ------------------------ //void LCD_ram (char dat){ void LCD_data (char dat){ SPI_CS = 0; // チップセレクト有効 SPI_RS = 1; // 表示データ指定 SSPBUF = dat; // データの送信を開始 while(!SSPSTATbits.BF); // 送信完了を待つ dat = SSPBUF; // BFをリセットするため空読み SPI_CS = 1; // チップセレクト無効 } //-------- G-LCDのデータを全消去する ---------------------------- void clear(void) { int page; int x; for (page = 0; page < 6; page++) { LCD_cmd(0xb0 + page); LCD_cmd(0x10); LCD_cmd(0x00); for (x = 0; x < 128; x++) { LCD_data(0); } } } //--------- sizeを指定し、等倍・x2・x3・x4倍文字を表示する ------------- void LCD_chr(int code, int size) { int bai; // たぶん倍という変数 int i,j,d; int x1,x2,re; char fdata; // char data[4]; char BitPos; char incr; char mask; int div; bai = size; for (i = 0; i < 5; i++) { fdata = font[code - 0x20][i]; if(fdata == 0xFF) break; // 191121 // data[4] = {0, 0, 0, 0}; char data[4] = {0, 0, 0, 0}; BitPos = 0x01; if (bai == 1) { mask = 0x01; div = 8; } else if (bai == 2) { mask = 0x03; div = 4; } else if (bai == 3) { mask = 0x07; div = 3; } else if (bai == 4) { mask = 0x0F; div = 2; } for (d = 0; d < bai; d++) { incr = mask; for (j = 0; j < div; j++) { if ((fdata & BitPos) != 0) { data[d] = data[d] + incr; } BitPos = BitPos << 1; incr = incr << bai; } } x1 = x >> 4; x2 = x % 16; for (d = 0; d < bai; d++) { LCD_cmd(0xb0 + y + d); LCD_cmd(0x10 + x1); LCD_cmd(0x00 + x2); for (re = 0; re < bai; re++) { LCD_data(data[d]); } } x = x + bai; } x = x + bai; } //--------- sizeを指定し、等倍・x2・x3・x4倍文字列を表示する ------------- /// x_coord:x座標・y_coord:y座標の意味のようだ。coordinateの略と思われる。 /// 予めグローバル変数の、x,yに代入してから、1文字表示関数を呼んでいるようだ。 void LCD_str(char *s, int x_coord, int y_coord, int size) { x = x_coord; y = y_coord; while (*s) LCD_chr(*s++, size); }