/******************************************************* * 7桁7SEG液晶ライブラリ・ソース * * オリジナル作成:サイト名:「じじいの電子実験室」さん *(PSOC1-CY8C29666使用) * read関数は使わなかったので削除した。 * * コメント追加+ソース変更:N.Ishii 2020/12/2 * 更新:201204 ********************************************************/ #include #include "LCD_PCB0112.h" /**************** * Font Data *****************/ const char char_data[16][2] = { //charactor {0x0b,0x0e},//0 {0x00,0x06},//1 {0x07,0x0c},//2 {0x05,0x0e},//3 {0x0c,0x06},//4 {0x0d,0x0a},//5 {0x0f,0x0a},//6 {0x00,0x0e},//7 {0x0f,0x0e},//8 {0x0d,0x0e},//9 {0x0e,0x0e},//a {0x0f,0x02},//b {0x07,0x00},//c {0x07,0x06},//d {0x0f,0x08},//e {0x0e,0x08} //f }; /************* * lcd MODE **************/ void lcd_mode(char mode) { char n; for (n=1;n<=3;n++) { // 最初の3bit:モードIDのビットレベル判定をし、データポートに出力 if ((mode & 0x04)!=0) { // highの場合 LCD_DAT_Hi; // = lcd_port |= lcd_dat; これはpic18の場合、単純にそのつどレベル出力で良さそう? } else { /// lowの場合 LCD_DAT_Lo; // = lcd_port &=~lcd_dat; これはpic18の場合、単純にそのつどレベル出力で良さそう? } /// wr負パルス出力:HT1621の仕様で、最小クロック幅:1.67u(T= 3.34u, F= 299.4kHz)なので /// F= 100kHzとし、パルス幅は、5uにする。 LCD_WR_Lo; // __delay_us(5); __delay_us(4); // 201204 LCD_WR_Hi; // __delay_us(5); __delay_us(1); // 201204 mode=mode << 1; // msbからlsbへ向かって出力し次のビットへ } } /********************** * lcd_command ***********************/ void lcd_command(char command) { char n; LCD_CS_Lo; //cs low lcd_mode(cmd_mode); // cmd_mode 0x04 → モードID= 0x0100b オペレーションモード=コマンドという意味 // 最初の、3bitを出力 for (n=1;n<=8;n++) // コマンド8bit順次出力 { if((command & 0x80)==0x80) LCD_DAT_Hi; // シフトしながら上位bitのレベルをチェック else LCD_DAT_Lo; /// wr負パルス出力 LCD_WR_Lo; // __delay_us(5); __delay_us(4); // 201204 LCD_WR_Hi; // __delay_us(5); __delay_us(1); // 201204 command=command << 1; // msbからlsbへ向かって次のビットへ } /// 最後のbitは何でも良いので、low出力にする。 LCD_DAT_Lo; LCD_WR_Lo; // __delay_us(5); __delay_us(4); // 201204 LCD_WR_Hi; // __delay_us(5); __delay_us(1); // 201204 LCD_CS_Hi; // csをノンアクティブにして終了 } /********************** * lcd_write * ad:アドレス6bit * dat:データ 4bit ***********************/ void lcd_wr_dat(char ad, char dat) { char n; LCD_CS_Lo; //cs low lcd_mode(write_mode); // write_mode 0x05→ モードID= 0x0101b オペレーションモード=data書込み //// アドレスブロック for (n=1;n<=6;n++) { if((ad & 0x20)==0x20) LCD_DAT_Hi; // アドレスブロックのmsb:b5をチェックし'1'でHi出力 else LCD_DAT_Lo; // '0'でLo出力 /// wr負パルス出力 LCD_WR_Lo; // __delay_us(5); __delay_us(4); // 201204 LCD_WR_Hi; // __delay_us(5); __delay_us(1); // 201204 ad=ad << 1; // msbからlsbへ向かって次のビットへ } //// データブロック for (n=1;n<=4;n++) { if((dat & 0x01)==0x01) LCD_DAT_Hi; // データブロックのlsb:b0をチェックし'1'でHi出力 else LCD_DAT_Lo; // '0'でLo出力 /// wr負パルス出力 LCD_WR_Lo; // __delay_us(5); __delay_us(4); // 201204 LCD_WR_Hi; // __delay_us(5); __delay_us(1); // 201204 dat=dat >> 1; // lsbからmsbへ向かって次のビットへ } /// 最後のbitは何でも良いので、low出力にする。ここから下が抜けていた。201203 LCD_DAT_Lo; LCD_WR_Lo; // __delay_us(5); __delay_us(4); // 201204 LCD_WR_Hi; // __delay_us(5); __delay_us(1); // 201204 LCD_CS_Hi; // csをノンアクティブにして終了 } /********************** * lcd initial ***********************/ void lcd_initial(void) { lcd_command(0x01); // turn on built-in oscillator (SYS EN) // →MODE ID=100のコマンド書込みモードによってSYS ENコマンド:0x01を書込む lcd_command(0x29); // set 1/3 bias 1/4 duty lcd_command(0x03); // turn on built-in bias voltage generator (LCD ON) } /******************** * lcd_clr *********************/ void lcd_clr(void) { char n; for(n=0;n<=31;n++){lcd_wr_dat(n,0);} //clr display 32個の表示ramクリア } /********************** * lcd put number ***********************/ void lcd_putnum(char position,char number) { position*=2; lcd_wr_dat(position,char_data[number][0]); lcd_wr_dat(position+1,char_data[number][1]); } /********************* * その他の、lcd_sub **********************/ void lcd_display_on(void) { lcd_command(0x03); // bias voltage generator on(LCD ON) } void lcd_display_off(void) { lcd_command(0x02); // bias voltage generator off(LCD OFF) } void lcd_all_disp(void) { char n; for(n=0;n<=31;n++){lcd_wr_dat(n,0xff);} //all on display } void lcd_low_bat_on(void) { // lcd_wr_dat(14,4); lcd_wr_dat(20,4); // 0x14→ 20 201203 } void lcd_low_bat_off(void) { // lcd_wr_dat(14,0); lcd_wr_dat(20,0); // 0x14→ 20 201203 } void lcd_key_on(void) { // lcd_wr_dat(11,1); lcd_wr_dat(17,1); // 0x11→ 17 201203 } void lcd_key_off(void) { // lcd_wr_dat(11,0); lcd_wr_dat(17,0); // 0x11→ 17 201203 } void lcd_tel_on(void) { // lcd_wr_dat(13,1); lcd_wr_dat(19,1); // 0x13→ 19 201203 } void lcd_tel_off(void) { // lcd_wr_dat(13,0); lcd_wr_dat(19,0); // 0x13→ 19 201203 } void lcd_seikou_on(void) { // lcd_wr_dat(15,2); lcd_wr_dat(21,2); // 0x15→ 21 201203 } void lcd_seikou_off(void) { // lcd_wr_dat(15,0); lcd_wr_dat(21,0); // 0x15→ 21 201203 }