void lcd_invert() { for ( uint8_t pageloop = 0; pageloop < 8; pageloop++ ) { wait_while_busy(CHIP1); wait_while_busy(CHIP2); lcd_cmd_write(CMD_LCD_SET_ADDRESS|ADDRESS0, CHIP1|CHIP2); lcd_cmd_write(CMD_LCD_SET_PAGE|pageloop, CHIP1|CHIP2); lcd_dummy_read(CHIP1); lcd_dummy_read(CHIP2); for ( uint8_t chip = CHIP1; chip <= CHIP2; chip++ ) { uint8_t data[64]; uint8_t loop; for ( loop = 0; loop < 64; loop++ ) { wait_while_busy(chip); data[loop] = lcd_data_read(chip); } wait_while_busy(chip); lcd_cmd_write(CMD_LCD_SET_ADDRESS|ADDRESS0, chip); for ( loop = 0; loop < 64; loop++ ) { wait_while_busy(chip); lcd_data_write(~data[loop], chip); } } } }
void lcd_print(char *text) { // Prints a string to the screen (if the current address is in DDRAM) while (*text != 0) { lcd_data_write(*text); ++text; } }
int lcd_area_clear(uint8_t x, uint8_t y, uint8_t width, uint8_t height) { uint8_t t, col, sec, page, trans_x, origin_y; IF_CONDITION_TURE_RET_PARAM_ERR(width > LCD_W); IF_CONDITION_TURE_RET_PARAM_ERR(height > LCD_H); IF_CONDITION_TURE_RET_PARAM_ERR(((height%8) != 0) && (((height/8 + 1)*8)> LCD_H)); origin_y = (y%2) ? (y/2 + 1) : (y/2); trans_x = 211 - x; //该款液晶原点在右上角 t = (height%8) ? (height/8 +1) : (height/8); for(sec=0; sec<t; sec++) { for(col=0; col<width; col++) { lcd_cursor_addr_set(trans_x - col,origin_y+(sec*4)); for(page=0; page<4; page++) { lcd_data_write(0x00); } } } return 0; }
void lcd_set_pixel(uint8_t x, uint8_t y, char color) { uint8_t chip, page; if ( x < 64 ) chip = CHIP1; else { chip = CHIP2; x -= 64; } page = y/8; y = y%8; wait_while_busy(chip); lcd_cmd_write(CMD_LCD_SET_ADDRESS|x,chip); lcd_cmd_write(CMD_LCD_SET_PAGE|page,chip); lcd_dummy_read(chip); wait_while_busy(chip); uint8_t data; data = lcd_data_read(chip); if (color) data |= (1<<y); else data &= ~(1<<y); lcd_cmd_write(CMD_LCD_SET_ADDRESS|x,chip); lcd_data_write(data,chip); }
void clearLine(unsigned char x, unsigned char y){ unsigned char max_x=20; GoTo(x,y); for (int i=x; i<max_x; i++) { lcd_data_write(0x20); _delay_ms(1); } GoTo(x,y); }
// Send a command to the LCD in 4-bit or 8-bit mode. void xtl_lcd_hd44780_send_cmd(unsigned char cmd) { lcd_data_write(cmd & 0xff); lcd_delay_ms(1); xtl_lcd_hd44780_set_rs(0); // set LCD to CMD mode lcd_delay_ms(1); xtl_lcd_hd44780_set_rw(0); // set LCD to CMD mode lcd_delay_ms(1); xtl_lcd_hd44780_strobe(); // toggle E for LCD }
void lcd_putc( UINT8 u ) { xtl_lcd_hd44780_wait_ready(); lcd_data_write(u & 0xff); lcd_delay_ms(1); xtl_lcd_hd44780_set_rs(1); // set LCD to DATA mode xtl_lcd_hd44780_set_rw(0); // set LCD to DATA mode lcd_delay_ms(1); xtl_lcd_hd44780_strobe(); // toggle E for LCD }
void lcd_clear() { for(uint8_t y = 0; y < 8; y++) { lcd_cmd_write(CMD_LCD_SET_PAGE|y,CHIP1|CHIP2); lcd_cmd_write(CMD_LCD_SET_ADDRESS|ADDRESS0,CHIP1|CHIP2); for(uint8_t x = 0; x < 64; x++) { lcd_data_write(0x00,CHIP1|CHIP2); } lcd_cmd_write(CMD_LCD_SET_PAGE|PAGE0,CHIP1|CHIP2); lcd_cmd_write(CMD_LCD_SET_ADDRESS|ADDRESS0,CHIP1|CHIP2); } }
void draw_bitmap_fullscreen(const uint8_t *image) { uint8_t chip; uint16_t byte = 0; for(uint8_t y = 0; y < 8; y++) { lcd_cmd_write(CMD_LCD_SET_PAGE|y,CHIP1|CHIP2); lcd_cmd_write(CMD_LCD_SET_ADDRESS|0,CHIP1|CHIP2); for(uint8_t x = 0; x < 128; x++) { if(x<64) chip=1; else chip=2; lcd_data_write(pgm_read_byte(image+(byte++)),chip); } } }
// Initialize LCD in 4-bit mode. void lcd_reset( void ) { // Output pins low and as output (except last pin). // If R/W is configured, this sets R/W to 0, i.e. write mode. lcd_enable(0); xtl_lcd_hd44780_set_rw(0); xtl_lcd_hd44780_set_rs(0); // Wait at least 15ms for the LCD to initialise. lcd_delay_ms(15); // Reset as per p. 211 of HD44780 user guide. // Function set (8-bit data, two line mode, 5x7 dots). lcd_data_write(0x30); xtl_lcd_hd44780_strobe(); lcd_delay_ms(10); // Need at least 4.1ms according to the guide. xtl_lcd_hd44780_strobe(); lcd_delay_ms(2); // Need at least 100us according to the guide. xtl_lcd_hd44780_strobe(); lcd_delay_ms(2); // Don't use BF here either. // Function set (8-bit data, two line mode, 5x7 dots). xtl_lcd_hd44780_send_cmd(0x38); lcd_delay_ms(6); // Display off xtl_lcd_hd44780_send_cmd(DISP_OFF); lcd_delay_ms(5); // Display clear xtl_lcd_hd44780_send_cmd(CLR_DISP); lcd_delay_ms(10); // Entry mode, increasing cursor position. xtl_lcd_hd44780_send_cmd(ENTRY_INC); // Display on. xtl_lcd_hd44780_wait_ready(); xtl_lcd_hd44780_send_cmd(DISP_ON); }
//! write a zero-terminated ASCII string to the display void LCDPutString(char *str) { char c,index=0; for (; (c = *str) != 0; str++){ if((c=='\r') || c=='\n'); else lcd_data_write(c); index++; if (index>=20) { lcd_cmd_write(SET_DRAM_ADDR+line_3); lcd_wait(WAIT_15m); index=0; } } }
/*************************************************************************************************** * @fn lcd_disp_bmp * * @brief LCD显示图象 * @param null * @return 0 -- success * -1 - failure ***************************************************************************************************/ int lcd_disp_bmp(uint8_t x, uint8_t y, uint8_t *p_bmp, uint8_t width, uint8_t height) { uint8_t t, col, sec, page, trans_x, origin_y; uint8_t dat_H4, dat_L4, Shift; IF_CONDITION_TURE_RET_PARAM_ERR(width > LCD_W); IF_CONDITION_TURE_RET_PARAM_ERR(height > LCD_H); IF_CONDITION_TURE_RET_PARAM_ERR(((height%8) != 0) && (((height/8 + 1)*8)> LCD_H)); origin_y = (y%2) ? (y/2 + 1) : (y/2); trans_x = 211 - x; //该款液晶原点在右上角 t = (height%8) ? (height/8 +1) : (height/8); for(sec=0; sec<t; sec++) { for(col=0; col<width; col++) { //lcd_cursor_addr_set(x+col,origin_y+(sec*4)); lcd_cursor_addr_set(trans_x - col,origin_y+(sec*4)); Shift=0x80; for(page=0; page<4; page++) { if((*p_bmp&Shift)==0) dat_H4=0x00; else dat_H4=0xf0; Shift>>=1; if((*p_bmp&Shift)==0) dat_L4=0x00; else dat_L4=0x0f; Shift>>=1; lcd_data_write(dat_H4|dat_L4); } p_bmp++; } } return 0; }
/*************************************************************************************************** * @fn lcd_char_inv_disp * * @brief 反白显示一个字符 * @param x,y -- 液晶坐标 * dispByte -- 要显示的数据 * @return 0 -- success ***************************************************************************************************/ int lcd_char_inv_disp(uint8_t x,uint8_t y,uint8_t dispByte) { uint8_t char_index; uint8_t sec,col,page,trans_x,origin_y,dat_H4,dat_L4,Shift; uint8_t *pChar; char_index = dispByte - ' '; pChar = &ascii_0816[char_index*16]; origin_y = (y%2) ? (y/2 + 1) : (y/2); trans_x = 211 - x; //该款液晶原点在右上角 for(sec=0; sec<2; sec++) { for(col=0; col<8; col++) { //lcd_cursor_addr_set(x+col,origin_y+(sec*4)); lcd_cursor_addr_set(trans_x - col,origin_y+(sec*4)); Shift=0x80; for(page=0; page<4; page++) { if(((~(*pChar))&Shift)==0) dat_H4=0x00; else dat_H4=0xf0; Shift>>=1; if(((~(*pChar))&Shift)==0) dat_L4=0x00; else dat_L4=0x0f; Shift>>=1; lcd_data_write(dat_H4|dat_L4); } pChar++; } } return 0; }
void displayTEMP(void) { lcd_data_write( 0b11011111 ); lcd_data_write('C'); }
static int write_char(char c, FILE *stream) { (void) stream; lcd_data_write(c); return 0; }
void createCustomFont(){ lcd_cmd_write(0x40); //CGRAM _delay_ms(4); lcd_data_write(0); _delay_ms(2); lcd_data_write(1); _delay_ms(2); lcd_data_write(3); _delay_ms(2); lcd_data_write(22); _delay_ms(2); lcd_data_write(28); _delay_ms(2); lcd_data_write(8); _delay_ms(2); lcd_data_write(0); _delay_ms(2); lcd_data_write(0); _delay_ms(4); lcd_data_write(8); _delay_ms(2); lcd_data_write(12); _delay_ms(2); lcd_data_write(10); _delay_ms(2); lcd_data_write(9); _delay_ms(2); lcd_data_write(10); _delay_ms(2); lcd_data_write(12); _delay_ms(2); lcd_data_write(8); _delay_ms(2); lcd_data_write(0); _delay_ms(4); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(2); // lcd_data_write(0x1c); // _delay_ms(4); // // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(2); // lcd_data_write(0x1e); // _delay_ms(10); lcd_data_write(0x80); //DD RAM }
void lcd_putchar( int c ) { lcd_data_write( c ); }
void setLCD( void ) { delayMs(1,50); lcd_command_write(0b00101001); // function set - 4-bit interface delayMs(1,2); lcd_command_write(0b00001000); // display off delayMs(1,2); lcd_clear(); lcd_command_write(0b00000110); // cursor move direction delayMs(1,2); // setup custom characters lcd_command_write(0b01000000); // move to first CGRAM location delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); // 0x00 lcd_data_write(0b00000011); delayMs(1,2); lcd_data_write(0b00000100); delayMs(1,2); lcd_data_write(0b00001000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); // 0x01 lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00010000); delayMs(1,2); lcd_data_write(0b00001000); delayMs(1,2); lcd_data_write(0b00000111); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00011111); delayMs(1,2); // 0x02 lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00001111); delayMs(1,2); lcd_data_write(0b00010010); delayMs(1,2); // 0x03 lcd_data_write(0b00001001); delayMs(1,2); lcd_data_write(0b00001001); delayMs(1,2); lcd_data_write(0b00001001); delayMs(1,2); lcd_data_write(0b00001001); delayMs(1,2); lcd_data_write(0b00010010); delayMs(1,2); lcd_data_write(0b00001100); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00011111); delayMs(1,2); // 0x04 lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00000000); delayMs(1,2); lcd_data_write(0b00011111); delayMs(1,2); lcd_data_write(0b00011100); delayMs(1,2); // 0x05 lcd_data_write(0b00000010); delayMs(1,2); lcd_data_write(0b00000001); delayMs(1,2); lcd_data_write(0b00000111); delayMs(1,2); lcd_data_write(0b00000001); delayMs(1,2); lcd_data_write(0b00000001); delayMs(1,2); lcd_data_write(0b00000010); delayMs(1,2); lcd_data_write(0b00011100); delayMs(1,2); lcd_command_write(0b00000010); // cursor home delayMs(1,2); lcd_command_write(0b00001100); // display on delayMs(1,2); lcd_gotoxy(0, 0); delayMs(1,2); lcd_clear(); }