Часть III. Практическое применение Arduino
if(pos==lcd_cols*lcd_rows)
col=lcd_cols-1;
row=min(3,pos/lcd_cols);
Serial.print("pos=");Serial.print(pos);
Serial.print("txt_end_pos=");Serial.print(txt_end_pos);
Serial.print(" col=");Serial.print(col);
Serial.print(" row=");Serial.println(row);
lcd.setCursor(col,row);
}
При получении кодов нажатия обычных клавиш клавиатуры либо клавиш цифро-
вой панели при установленном режиме Num_Lock получаем код ASCII нажатой
клавиши из массива
table1
. При получении адреса в таблице учитываются состоя-
ния переменных
caps
,
l_shift
,
r_shift
и
alt
(l или ang). Полученный из таблицы
символ выводим на дисплей в текущую позицию курсора. Кроме того, весь наби-
раемый текст хранится в буфере (массив
txt_buffer[]
). Код для указанных дейст-
вий приведен в листинге 9.8.
Листинг 9.8
default: if(f0==1)
{f0=0;}
else
{
int addr=bitRead(leds,2)*128+min(1,l_shift+r_shift)*256;
int addr+=alt*512+code;
// если для переключения eng/rus используется Scroll_Lock
// int addr+=lang*512+code;
add_buffer(table1[addr]);
}
break;
.. .. ..
// ****************** добавление в буфер символа
void add_buffer(char char1)
{
if(txt_end_pos==txt_tek_pos)
{txt_end_pos++;}
else
{txt_end_pos=txt_end_pos+(1-ins);shift_buffer_right();}
txt_buffer[txt_tek_pos]=char1;
if(txt_end_pos!=txt_tek_pos)
shift_lcd_right();
txt_tek_pos=min(txt_tek_pos+1,lcd_cols*lcd_rows-1);
txt_tek_pos=max(txt_tek_pos,0);
set_cursor(txt_tek_pos-offset);
}
Глава 9. Подключение клавиатуры и мыши
133
// сдвиг буфера текста вправо
void shift_buffer_right()
{
if(ins==1)
return;
for(int i=txt_end_pos;i>=txt_tek_pos;i--)
txt_buffer[i]=txt_buffer[i-1];
}
// сдвиг на дисплее вправо
void shift_lcd_right()
{;
for(int j=txt_tek_pos;j{set_cursor(j);lcd.write(txt_buffer[j]);}
}
При получении с клавиатуры кода нажатия клавиши необходимо уда-
лить предыдущий символ из буфера текста и вывести заново на дисплей содержи-
мое буфера от удаляемого символа до конца. Код для данных действий приведен
в листинге 9.9.
Листинг 9.9
case BACKSPACE: if(f0==0){delete_from_buffer();}
else(f0=0);
break;
.. .. ..
// ****************** удаление из буфера backspace
void delete_from_buffer()
{
if(txt_tek_pos>0)
{
txt_buffer[txt_end_pos]=' ';
txt_end_pos--;
txt_tek_pos--;
shift_buffer_left();
shift_lcd_left();
}
set_cursor(txt_tek_pos);
}
// сдвиг буфера текста влево
void shift_buffer_left()
{
for(int i=txt_tek_pos;i<=txt_end_pos;i++)
txt_buffer[i]=txt_buffer[i+1];
}
// сдвиг на дисплее влево
void shift_lcd_left()
134
Do'stlaringiz bilan baham: |