#asm
.equ __lcd_port=0x15
#endasm
#include
#include
#include
#include <90sB515.h>
// Частота кварцевого резонатора [Гц]
#define F_XTAL 4000000L
// Линии PINDO…3 будут входами строк
#define KEYIN PIND
// Линии PORTD4..7 будут выходами столбцов
#define KEYOUT P0RTD
// Инициализация использованного таймера TIMER0
#define INIT_TIMER0 TCNT0=0x100L-F_XTAL/64L/500L
#define FIRST_COLUMN 0x80
#define LAST_COLUMN 0x10
typedef unsigned char byte;
// Здесь в виде бита сохраняется состояние каждой нажатой клавиши,
// бит 0 будет KEY0, бит 1 KEY1….
unsigned keys;
// Буфер ЖКИ-индикатора
char buf[33];
// Прерывание по таймеру TIMER 0 каждые 2 мс
interrupt [TIM0_OVF] void timer0_int(void)
{
static byte key_pressed_counter=20;
static byte key_released_counter,column=FIRST_COLUMN;
static unsigned row_data,crt_key;
// Перезагрузить таймер TIMERO
INIT_TIMER0;
row_data<<=4;
// Получить группу из 4 клавиш в переменной row_data
row_data|=¯KEYIN&0xf;
column>>=1;
if (column==(LAST_C0LUHN>>1))
{
column=FIRST_COLUHN;
if (row_data==0) goto new_key;
if (key_released_counter) — key_released_counter;
else
{
if (-key_pressed_counter==9) crt_key=row_data;
else
{
if (row_data!=crt_key)
{
new_key:
key_pressed_counter=10;
key_released_counter=0;
goto end_key;
};
if (!key_pressed_counter)
{
keys=row_data;
key_released_counter =20;
};
};
};
end_key:;
row_data=0;
};
// Выбрать следующий столбец, входы будут притянуты к 5 В
KEY0UT=¯column;
}
// Проверить, были ли нажаты клавиши
unsigned inkey(void)
{
unsigned k;
if (k=keys) keys=0;
return k;
}
void init_keypad(void)
{
DDRD=0xf0;
INIT_TIHERO;
TCCR0=3;
TIMSK=2;
#asm("sei")
}
main() {
unsigned k;
init_keypad();
lcd_init(16);
lcd_putsf("CVAVR Keypad");
// Читать состояние клавиш и индицировать код клавиши
while (1)
{
lcd_gotoxy(0,1);
if (k=inkey())
{
sprintf(buf,“Key code=%Xh“,k);
lcd_puts(buf);
}
else lcd_putsf("NO KEY ");
delay_ms(500);
}
}
Материал взят из демонстрационной версии компилятора CodeVisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.
Использован ЖК-индикатор со встроенным контроллером, подсоединенный к порту PORTC следующим образом:
Текст программы:
// ЖК-индикатор подсоединен к выходам порта P0RTC
// смотри файл lcd.h в директории..\inc
#asm
.equ __lcd_port=0x15;PORTC
#endasm
// Включить в состав программы описания и процедуры для работы с ЖК-индикатором
#include
void main(void)
{
// Инициализировать ЖК-индикатор для работы
// с 2 строками по 16 символов
lcd_init(16);
// Перейти на 2-ю строку ЖК-индикатора
lcd_gotoxy(0,1);
// Отобразить сообщение
lcd_putsf("Hello world'');
// Остановиться (бесконечный цикл)
while (1);
}