volatile U16 I2C_addr = 0; //адрес ячейки 24LC64
static U8 I2Crd_byte = 0; //байт данных, прочитанный из 24LC64
U16 I2C_addr_i; //значение адреса ячейки 24LC64 для индикации
на жки
U8 г1000=0; //-------------------------------------------
U8 г100=0; // разряды десятичного числа
U8 г10=0; //
U8 rl=0; //-------------------------------------------
//------------------------------------------------------------------------
void main(void) {
CPUinit(); //инициализация системы
_disable_interrupt(); //запрет прерываний
INTERRUPTSinit(); //инициализация прерываний
TIMEROinitstart(); //инициализация ТО
_enable_interrupt(); //разрешение прерываний
delay(1000000); //задержка на сброс жки
lcd_init(); //инициализация жки
delay(1000000); //
lcd_clear(); //очистка экрана жки
lcd_pro_data(I2C_data, 0); //вывести на жки с адреса 0 ОЗУ жки I2Cinit(); //инициализация модуля I2C
A_LED1_0FF; //погасить светодиоды 1, 2
A_LED2_OFF;
while(1) //Начало основного цикла
{
if • (flagn_kn0==l) //нажималась ли кнопка 0
{
flagn_kn0=0; //да, сбросить флаг нажатия
//выбор байта данных для записи в 241С64
I2C_data++;
if (I2C_data > 'z") I2C_data = '!';
lcd_pro_data(I2Ci_data, 0); //вывести на жки с адреса 0 ОЗУ жки
}
if (flagn_knl==l) //нажималась ли кнопка 1
{
flagn_knl=0; //да, сбросить флаг нажатия
I2C_addr += 50;
if (l2C_addr > 8150) I2C_addr =0; ^
//преобразование в десятичное представление и индикация I2C_addr_i = l2C_addr;
rlOOO = I2C_addr_i / 1000; I2C_addr_i = I2C_addr_i % 1000; rlOO = I2C_addr_i / 100; I2C_addr_i = I2C_addr_i % 100; rlO = I2C_addr_i / 10; rl = I2C_addr_i % 10; lcd_pro_data(rl000,5); lcd_tek_data(rlOO); lcd_tek_data(rlO); lcd_tek_data(rl);
}
if (flagn_kn2==l) //нажималась ли кнопка 2
{
flagn_kn2=0; //да, сбросить флаг нажатия
//Запись байта данных в 24LC64 по произвольному адресу wr_byte24LC64(I2C_data, I2C_addr); A_LEDl_ON; //зажечь светодиод 1
delay(100000); //задержка A_LED1_0FF; //погасить светодиод 1
}
if (flagn_kn3==l) //нажималась ли кнопка 3
{
flagn_kn3=0; //да, сбросить флаг нажатия
//Чтение байта данных в 24LC64 по произвольному адресу I2Crd_byte = rd_byte24LC64(I2C_addr);
lcd_pro_data(I2Crd_byte,64); //индикация прочитанного байта A_LED1_0N; //зажечь светодиод 1
delay(100000); //задержка A_LED1_0FF; //погасить светодиод 1
}
} }
//------------------------------------------------------------------------
В отличие от большинства предыдущих проектов, программа обслуживания I2C LPC2129 использует прерывания от 12С, которые аппаратно генерируются при наступлении одного из 25 возможных активных состояний интерфейса 12С.
В файлах hardware.c и hardware.h этого проекта дополнительно содержатся, соответственно, функция-обработчик прерывания от 12С и объявление этой функции. Файл hardware.c этого проекта приведен ниже, а фрагмент исходного текста, который необходимо добавить в файл hardware.h, выглядит следующим образом:
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |