char lcd_getc(BYTE x, BYTE y) { char value; lcd_gotoxy(x,y); while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low lcd_output_rs(1); value = lcd_read_byte(); lcd_output_rs(0); return(value); }
void lcd_send_byte(BYTE address, BYTE n) { lcd_output_rs(0); while ( bit_test(lcd_read_byte(),7) ) ; lcd_output_rs(address); delay_cycles(1); lcd_output_rw(0); delay_cycles(1); lcd_output_enable(0); lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); }
void lcd_init(void) { BYTE i; #if defined(__PCB__) set_tris_lcd(LCD_OUTPUT_MAP); #else #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7)) output_drive(LCD_DATA4); output_drive(LCD_DATA5); output_drive(LCD_DATA6); output_drive(LCD_DATA7); #else lcdtris.data = 0x0; #endif lcd_enable_tris(); lcd_rs_tris(); lcd_rw_tris(); #endif lcd_output_rs(0); lcd_output_rw(0); lcd_output_enable(0); delay_ms(15); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms(5); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); }
void dsp_strength_bar( int8 end_signal_char_index, int8 width, int8 value ) { int8 mark_pos = value/STRENGTH_VALUES_PER_CHAR; int8 mark_glyph = value-(mark_pos*STRENGTH_VALUES_PER_CHAR); lcd_output_rs(0); int8 current_address = lcd_read_byte() & 0x7F; dsp_create_signal_character( end_signal_char_index, mark_glyph ); lcd_send_byte( 0, 0x80|current_address ); //Restore DDRAM address int8 i; for( i=0; i<mark_pos; ++i ) { lcd_putc(CHAR_FULL_STRENGTH); } if ( mark_pos != width ) { lcd_putc(end_signal_char_index); } for( i=mark_pos+1; i<width; ++i ) { lcd_putc(' '); } }
/* * Display a range bar with: * - 3 possibles values per position in mid characters * - 2 possibles values per position in start and end characters * Note: Only one range line is allowed. */ void dsp_range_line( int8 start_char_index, int8 mid_char_index, int8 end_char_index, int8 width, int16 value, int16 max_value ) { int8 range_positions = (3*(width-2)) + 2 + 2; int8 mark = math_change_range(value, max_value, range_positions); int8 start_glyph; int8 end_glyph; int8 mark_glyph; int8 mark_pos; if ( mark < 2 ) { //Mark at start range mark_pos = 0; mark_glyph = 0xFF; start_glyph = mark; end_glyph = 2; } else if ( mark > (range_positions-2) ) { //Mark at end range mark_pos = 0; mark_glyph = 0xFF; start_glyph = 2; end_glyph = (range_positions-mark); } else if ( mark == (range_positions-2) ) { //Mark just before end range mark_pos = 0; mark_glyph = 0xFF; start_glyph = 2; end_glyph = 1; } else { //Mark at mid range mark -= 2; mark_pos = mark/3; mark_glyph = mark-(mark_pos*3); start_glyph = 2; end_glyph = 2; } lcd_output_rs(0); int8 current_address = lcd_read_byte() & 0x7F; // Set glyphs dsp_write_mid_glyph( start_char_index, CHAR_START_RANGE_MID_GLYPH[start_glyph] ); dsp_write_mid_glyph( end_char_index, CHAR_END_RANGE_MID_GLYPH[end_glyph] ); if ( mark_glyph != 0xFF ) { dsp_write_mid_glyph( mid_char_index, CHAR_RANGE_POSITION_GLYPH[mark_glyph] ); } lcd_send_byte( 0, 0x80|current_address ); //Restore DDRAM address // Write range line int8 i; lcd_putc(start_char_index); for( i=0; i<mark_pos; ++i ) { lcd_putc('-'); } lcd_putc( (mark_glyph==0xFF) ? '-' : mid_char_index); for( i=mark_pos+1; i<(width-2); ++i ) { lcd_putc('-'); } lcd_putc(end_char_index); }