#include __CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS); __EEPROM_DATA(1,0xa1,0x70,0x6f,0xbc,0xba,0x6f,0x63); __EEPROM_DATA(0xbf,0xc4,2,0xa0,0x61,0xbb,0x61,0xbd); __EEPROM_DATA(0x63,3,0x54,0x65,0xbc,0xb2,0x70,0x20); __EEPROM_DATA(0xbd,0xb8,0xb7,0xba,0xb8,0x65,4,0x54); __EEPROM_DATA(0x65,0xbc,0xb2,0x70,0x20,0xb3,0xc3,0x63); __EEPROM_DATA(0x6f,0xba,0xb8,0x65,5,0x50,0x65,0xb6); __EEPROM_DATA(0xb8,0xbc,6,0x6f,0xb2,0xc3,0xc0,0xbd); __EEPROM_DATA(0xc3,0xb9,7,0x70,0x61,0x63,0xc1,0xb8); __EEPROM_DATA(0x70,0x65,0xbd,0xbd,0xc3,0xb9,8,0xbe); __EEPROM_DATA(0x63,0x65,0xb3,0xe3,0x6f,0x63,0xbf,0x65); __EEPROM_DATA(0x70,0x65,0x6f,9,0xbc,0x6f,0xbd,0x6f); __EEPROM_DATA(10,0x42,0x78,0x6f,0xe3,11,0xbb,0xb8); __EEPROM_DATA(0xbd,0x65,0xb9,0xbd,0xc3,0xb9,12,0xbe); __EEPROM_DATA(0x70,0xb8,0xb5,0xbc,0xbd,0xb8,0xba,13); __EEPROM_DATA('N','a','s','t','y','a',' ',14); __EEPROM_DATA(50,32,8,8,1,1,0,0); void podgot (void); // подготовка МК void hd44_ini (void); // инициализация HD44780 void ee_rw_param (unsigned char x); // RW-параметров void anima_nabor_1 (void); // заставка-1 #define led RA4 bit stb; // бит стэндбая (для управления подсветкой) unsigned int rc5 (void); // функция приема ИК-команд unsigned char ir; // переменная под ИК-команды void encoder (void); // функция опроса энкодера void ir_int (void); // интерпретация ИК-команд void enc_int (void); // интерпретация энкодера void key_int (void); // интерпретация клавиатуры unsigned int ir_ta; // таймаут повтора ИК-команд unsigned int vol_ta; // таймаут перехода на громкость interrupt void xxx (void) { if (INTF & INTE) // обслуживаем ИК-приемник {ir = (rc5()& 0b00000000111111);} if (RBIF & RBIE) // обслуживаем энкодер {encoder ();} INTF=0;RBIF=0; // опускаем флаги } void main (void) { // задержка включения vol_ta=0xffff; do {asm("nop");} while (vol_ta--); podgot (); // подготовка МК hd44_ini(); // инициализация ЖКИ ee_rw_param ('r'); // чтение значений из ПЗУ anima_nabor_1(); // заставка после включения GIE=1; // разрешили глобальное прерывание while(1) // начало бесконечного цикла { led = 1-stb; if ( ir_ta!=0) ir_ta--; // "разряжаем" таймаут ДУ if (vol_ta!=0) vol_ta--; // "разряжаем" таймаут громкости ir_int (); // интерпретация ИК-команд enc_int (); // интерпретация энкодера key_int (); // интерпретация кнопок }} void podgot (void) {INTCON = 0; // чистим регистр прерываний TRISA = 0b00000000; TRISB = 0b11111001; // RB0 на ИК-приемник, RB3:RB4 на энкодер, RB5:RB7 на клавиатуру CMCON = 0x07; // отключение компараторов (с индексом А есть такое) PORTA = 0; PORTB = 0; RBPU = 0; // подтягивающие R (1-откл, 0-вкл) // подготовка к прерываниям INTE=1; // прерывание на ноге RB0/INT (1-вкл, 0-выкл) INTF=0; // опустили флаг прерывания на ноге RB0/INT INTEDG=0;// прерывание по заднему фронту RBIE=1; // прерывание на ногах RB4:RB7 (1-вкл, 0-выкл) RBIF=0; // опустили флаг прерывания на ногах RB4:RB7 } #define rs RA2 // выбор регистра #define com rs=0 // выбор регистра команд (IR) #define dat rs=1 // выбор регистра данных (DR) void hd44_out (unsigned char y); void hd44_clr (void); // очистка экрана void anima_pause (void); // функция паузы void anima_on (void); // режим "бегущей строки" void anima_off (void); // статичный режим отрисовки void anima_fraza_1 (void); // фраза-1 void anima_fraza_2 (void); // фраза-2 void anima_nabor_1 (void); // 1-набор функций void anima_nabor_2 (void); // 2-набор функций void anima_nabor_1 (void) // 1-готовый набор функций {hd44_clr(); // очистка экрана //anima_on(); // включили режим бегущей строки anima_fraza_1();// выводим фразу на экран //anima_off(); // выключили режим бегущей строки } void anima_nabor_2 (void) // 2-готовый набор функций {hd44_clr(); // очистка экрана anima_on(); // включили режим бегущей строки anima_fraza_2();// выводим фразу на экран anima_off(); // выключили режим бегущей строки hd44_clr(); // очистка экрана } void anima_fraza_1 (void) { hd44_out(' '); anima_pause(); hd44_out(' '); //anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out('H'); anima_pause(); hd44_out('E'); anima_pause(); hd44_out('L'); //anima_pause(); hd44_out('L'); anima_pause(); hd44_out('O'); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); //anima_pause(); hd44_out(' '); anima_pause(); anima_pause(); anima_pause(); anima_pause(); } void anima_fraza_2 (void) { hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out('G'); //anima_pause(); hd44_out('O'); anima_pause(); hd44_out('O'); anima_pause(); hd44_out('D'); anima_pause(); hd44_out(' '); anima_pause(); hd44_out('B'); //anima_pause(); hd44_out('Y'); anima_pause(); hd44_out('E'); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); anima_pause(); hd44_out(' '); //anima_pause(); hd44_out(' '); anima_pause(); anima_pause(); anima_pause(); anima_pause(); } void hd44_clrn (unsigned char y); // очистка указанной строки void hd44_out (unsigned char y); // отправка битовых последовательностей unsigned char vol,bal,bas,tre,mod,inp,re1,re2; // реальные параметры void ee_rw_param (unsigned char x){ if (x == 'r'){ vol = EEPROM_READ(120); bal = EEPROM_READ(121); bas = EEPROM_READ(122); tre = EEPROM_READ(123); mod = EEPROM_READ(124); inp = EEPROM_READ(125); re1 = EEPROM_READ(126); re2 = EEPROM_READ(127);} if (x == 'w'){ EEPROM_WRITE(120,vol); EEPROM_WRITE(121,bal); EEPROM_WRITE(122,bas); EEPROM_WRITE(123,tre); EEPROM_WRITE(124,mod); EEPROM_WRITE(125,inp); EEPROM_WRITE(126,re1); EEPROM_WRITE(127,re2);} } #define enc_A RB4 // вывод А, формирующий прерывание #define enc_B RB3 // вывод В, анализ факта вращения #define key_x1 RA0 #define key_x2 RA7 #define key_x3 RA6 #define key_y1 RB7 #define key_y2 RB6 #define key_y3 RB5 unsigned char key_rez; // результат нажатия void key (void) { GIE=0; // запрет всех прерываний key_x1 = 0; if (key_y1 == 0) key_rez = 1; if (key_y2 == 0) key_rez = 2; if (key_y3 == 0) key_rez = 3; key_x1 = 1; key_x2 = 0; if (key_y1 == 0) key_rez = 4; if (key_y2 == 0) key_rez = 5; if (key_y3 == 0) key_rez = 6; key_x2 = 1; key_x3 = 0; if (key_y1 == 0) key_rez = 7; if (key_y2 == 0) key_rez = 8; if (key_y3 == 0) key_rez = 9; key_x3 = 1; GIE=1; } #define db7 RA6 // линия шины данных DB4 #define db6 RA7 // линия шины данных DB5 #define db5 RA0 // линия шины данных DB6 #define db4 RA1 // линия шины данных DB7 #define e RA3 // линия стробирования и синхронизации #define rs RA2 // выбор регистра #define led RA4 #define com rs=0 // выбор регистра команд (IR) #define dat rs=1 // выбор регистра данных (DR) bit mut; // бит приглушение (для отрисовки значка) bit stb; // бит стэндбая (для управления подсветкой) void hd44_ini (void); // инициализация HD44780 void hd44_out (unsigned char y); // отправка битовых последовательностей void hd44_str (void); // стробирование и синхронизация void hd44_nop (void); // фиксированная пауза 100 мкс void hd44_clr (void); // очистка экрана void hd44_clrn (unsigned char y); // очистка указанной строки void hd44_usr (void); // формирование юзерских символов палочек | void hd44_ygo (unsigned char y); // отрисовка числа уровня в правом верхнем void hd44_svet (void); // подсветка // === перекодировка и отправка киррилицы void hd44_cyr (unsigned char y) {unsigned char x; if (y == 'A') x = 0x41; if (y == 'Б') x = 0xa0; if (y == 'В') x = 0x42; if (y == 'Г') x = 0xa1; if (y == 'Д') x = 0xe0; //... и т.д. hd44_out(x); } #define scl RB1 #define sda RB2 void i2c_sta (void); // условие старт void i2c_out (unsigned char x); // передача байта void i2c_sto (void); // условие стоп void i2c_nop (void); // элементарная задержка void i2c_str (void); // стробирующий сигнал void i2c_str (void) {scl = 1; i2c_nop(); scl =0;} void i2c_sto (void) {scl = 1; i2c_nop(); sda = 1;} void osn_int (void); // основная интепретация команд void mute (void); // обслуживаем mute bit mut; // бит приглушения (муте) void standby (void); // обслуживаем стэндбай bit stb; // бит стэндбая unsigned char param, vall; // уровень и зачение unsigned char param_old, vall_old; // старые уровень и значение unsigned char vol,bal,bas,tre,mod,inp,re1,re2; // реальные параметры unsigned char ir; // переменная под ИК-команды unsigned char ir_pro; // проверочная перменная ИК-команд unsigned int ir_ta ; // таймаут повтора ИК-команд unsigned int vol_ta ; // таймаут перехода на громкость void ir_int (void) { // автопереход на громкость if (param!=1) {if (vol_ta==0) {param=1;osn_int();}} if (ir!=0) { GIE=0; if (ir_pro==ir) { // перепроверка команды if (ir==32) {param++;osn_int();} // режим+ if (ir==33) {param--;osn_int();} // режим- if ((ir==16)|(ir==22)) {vall++;osn_int();} // уровень+ if ((ir==17)|(ir==21)) {vall--;osn_int();} // уровень- if (ir==23) {param=1;osn_int();} // "OK" на громкость if (ir==43) {param=2;osn_int();} // красная на баланс if (ir==44) {param=3;osn_int();} // зеленая на тембр низкие if (ir==45) {param=4;osn_int();} // желтая на тембр высокие if (ir==46) {param=5;osn_int();} // синяя на режим if ((ir==56)|(ir==35)) {param=6;osn_int();} // TV/AV на выбор входа if (ir==13) {mute();} // mute if (ir==12) {standby();} // standby } ir_pro=ir; ir = 0; GIE=1; } } bit enc_napr; // бит направления: 1-вправо, 0-влево bit enc_act; // бит активности: 1-было, 0-не было void enc_int (void) {if (enc_act == 1) { GIE=0; (enc_napr == 1) ? vall++ : vall--; osn_int(); enc_act=0; GIE=1; }} void key_int (void) {unsigned int key_tmp; key (); if (key_rez!=0) { // оцениваем факт нажатия if (key_rez == 1) {standby();} // стэндбай if (key_rez == 3) {mute();} // муте if (key_rez == 4) {vall++ ;osn_int();} // уровень + if (key_rez == 6) {vall-- ;osn_int();} // уровень - if (key_rez == 2) {param++;osn_int();} // параметр + if (key_rez == 5) {param--;osn_int();} // параметр - key_rez = 0; key_tmp=0xfff; do {asm("nop");} while (key_tmp--); } }