#include "pic16f1619.h" // #include // #include #include // #include "lcd.h" #define MHz 000000 //#define _XTAL_FREQ 8MHz //PIC_OSC_FREQ #define _XTAL_FREQ 1MHz //PIC_OSC_FREQ #define LCD_RS LATA1 // Register select pin of LCD #define LCD_EN LATA2 // Enable pin of LCD /******* Important Attention!!!!! ******/ /* You must Adjust the LCD contrast voltage before adjust the STROBE pulse width */ //#define LCD_STROBE (LCD_EN=1,LCD_EN=0) // spec. min 500ns ***fix 2009/11/17 air variable // at 20MHz, pulse width of (LCD_EN=1,LCD_EN=0) is about 280ns // #define LCD_STROBEon (LCD_EN=1) // spec. min 500ns ***fix 2009/11/17 air variable #define LCD_STROBEoff (LCD_EN=0) // spec. min 500ns ***fix 2009/11/17 air variable /* at 20MHz, pulse width of(LCD_EN=1;LCD_EN=0) is 280ns */ //unsigned char hexch_tbl[] ="0123456789ABCDEF"; /* off all ports the LCD - call before VDD off for CPU sleeping */ Lcd_off(void){ LCD_RS = 0; LCD_EN = 0; PORTB = (PORTB & 0b11001111); //set Low for VDD off PORTC = (PORTC & 0b11111001); //set Low for VDD off } /* write a byte to the LCD in 4 bit mode */ void Lcd_data_byteset(unsigned char c){ PORTB = (PORTB & 0b11001111) | ((c << 3) & 0b00010000)| ((c << 5) & 0b00100000) ;//set low 1,0bit to RB4,5 PORTC = (PORTC & 0b11111001) | ((c >> 2) & 0b00000010)| ( c & 0b00000100) ;//set low 3,2bit to RC1,2 LCD_STROBEon; LCD_STROBEoff; PORTB = (PORTB & 0b11001111) | 0b00110000; //set HIgh for power saving PORTC = (PORTC & 0b11111001) | 0b00000110; //set HIgh for power saving } void Lcd_data_set(unsigned char c){ PORTB = (PORTB & 0b11001111) | ((c >> 1) & 0b00010000)| ((c << 1) & 0b00100000) ;//set high 5,4bit to RB4,5 PORTC = (PORTC & 0b11111001) | ((c >> 6) & 0b00000010)| ((c >> 4) & 0b00000100) ;//set high 7,6bit to RC1,2 LCD_STROBEon; LCD_STROBEoff; PORTB = (PORTB & 0b11001111) | ((c << 3) & 0b00010000)| ((c << 5) & 0b00100000) ;//set low 1,0bit to RB4,5 PORTC = (PORTC & 0b11111001) | ((c >> 2) & 0b00000010)| ( c & 0b00000100) ;//set low 3,2bit to RC1,2 LCD_STROBEon; LCD_STROBEoff; PORTB = (PORTB & 0b11001111) | 0b00110000; //set HIgh for power saving PORTC = (PORTC & 0b11111001) | 0b00000110; //set HIgh for power saving } void Lcd_write(unsigned char c){ LCD_EN = 0; LCD_RS = 0; Lcd_data_set(c); __delay_us(40); } /* Clear and home the LCD */ void Lcd_clear(void){ LCD_EN = 0; LCD_RS = 0; Lcd_write(0x01); __delay_ms(2); } /* write one character to the LCD */ void Lcd_putch(char c){ LCD_EN = 0; LCD_RS = 1; // write characters Lcd_data_set(c); __delay_us(40); } /* write a string of chars to the LCD */ void Lcd_puts(const char * s){ while(*s) Lcd_putch(*s++); } /* Go to the specified position */ void Lcd_goto(unsigned char pos){ LCD_EN = 0; LCD_RS = 0; Lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void Lcd_init(void){ LCD_RS = 0; __delay_ms(30); // power on delay min 20 Lcd_data_byteset( 0x03 ); // attention! // __delay_ms(45); __delay_ms(5); // LCD_STROBE; LCD_STROBEon; LCD_STROBEoff; __delay_ms(1); //better 100ms // LCD_STROBE; LCD_STROBEon; LCD_STROBEoff; __delay_ms(5); Lcd_data_byteset( 0x02 ) ; // set 4 bit mode __delay_us(40); // Lcd_write(0x28); // Function Set : 2lines, 5x7 dots Lcd_write(0x08); // Display Off Lcd_write(0x01); // Clear Display // __delay_ms(2); Lcd_write(0x06); // Entry Mode Set Lcd_write(0x0F); // Display On, blink of cursor __delay_ms(3); } void //intやchar正数をASCII文字に変換し *strに格納されるので(桁数はdigitで指定)、文字として送信したり液晶に表示できる Bin2str(unsigned int data, char *str, unsigned int digit) { // 引数:intやchar正数データ, 文字データ, 期待する文字データの文字数 char i; str += digit; // 最後の数字位置 += : Buffer=Buffer+digit *str = 0; // 文字列終端(文字数+1の位置)へ0X00 for(i=digit; i>0; i--) { // 変換は下位から上位へ str--; // ポインター1 *str = (data % 10) + 0x30;// ASCIIへ  % : 割り算の余り data = data / 10; // 次の桁へ } } void //intやchar正数をASCII文字に変換し*strに格納されるので(桁数はdigitで指定)、文字として送信したり液晶に表示できる //なおかつ、先頭の'0'の連続を空白文字へ置き換える。ただし、最右端の0は置き換えない。 Bin2strB(unsigned int data, char *str, unsigned int digit) { // 引数:intやchar正数データ, 文字データ, 期待する文字データの文字数 char i; str += digit; // 最後の数字位置 += : Buffer=Buffer+digit *str = 0; // 文字列終端(文字数+1の位置)へ0X00 for(i=digit; i>0; i--) { // 変換は下位から上位へ str--; // ポインターマイナス1 *str = (data % 10) + 0x30;// ASCIIへ  % : 割り算の余り data = data / 10; // 次の桁へ } // if(digit == 1) return; for(i=1; i> 12; str[0] = hexch_tbl[i]; //上位4bit表示 max:03FF i = (j >> 8) & 0x000F; str[1] = hexch_tbl[i]; //下位4bit表示 max:03FF i = (j >> 4) & 0x000F; str[2] = hexch_tbl[i]; //上位4bit表示 max:03FF i = j & 0x000F; str[3] = hexch_tbl[i]; //下位4bit表示 max:03FF str[4] = 0; //set NULL } void //unsigned charを16進表示に変換し *strに格納されるので文字2桁として送信したり液晶に表示できる Char2hex(unsigned char cha, unsigned char *str){ unsigned char temp_ch; //local 汎用char unsigned char hexch_tbl[] ="0123456789ABCDEF"; temp_ch = (cha >> 4) & 0x000F; str[0] = hexch_tbl[temp_ch]; //上位4bit表示 max:03FF temp_ch = cha & 0x000F; str[1] = hexch_tbl[temp_ch]; //下位4bit表示 max:03FF str[2] = 0; //set NULL 0x00 }