Вот маленькая функция управления 4 кнопками а если раскоментировать , то и 16кнопками #define F_ (key==12) #define SET_ (key==8) #define PLUS (key==0) #define MINUS (key==4) #define PORTLCD PORTD #define DDRLCD DDRD #define PINLCD PIND
#define str0 (PINLCD&BIT(2)) #define str4 (PINLCD&BIT(3)) #define str8 (PINLCD&BIT(4)) #define str12 (PINLCD&BIT(5)) //#define stolb1 (PINLCD&BIT(4)) //#define stolb2 (PINLCD&BIT(5)) //#define stolb3 (PINLCD&BIT(6)) //#define stolb4 (PINLCD&BIT(7))
void skankey (void){ unsigned char key_lokal=17; key=key_lokal; #ifdef katod PORTZN |= BITZN; #else PORTZN &= ~BITZN; #endif DDRLCD =0xC3; PORTLCD=0x3C; _delay_us(10); if (!str0) key_lokal=0; else if (!str4) key_lokal=4; else if (!str8) key_lokal=8; else if (!str12) key_lokal=12; else key_lokal=17;//goto vool;
if ( key_lokal!=17 ) { if (++anti_drebezg[0]==35)//35) { key=key_lokal; if ( ( ocr1[ocr1ahi_but] )||( ocr1[ocr1alow_but] ) ){ OCR1AH = ocr1[ocr1ahi_but];//0x04; OCR1AL = ocr1[ocr1alow_but];//0x00; shim_true();// time_flag|=_BV(fl_sig_butt); time[note_but]=7; } } if (anti_drebezg[0]==anti_drebezg[2]){ //anti_drebezg[0] сам антидребезг anti_drebezg[0]=0; //anti_drebezg[1] кол-во цифр перед убыстрением anti_drebezg[1]++; //anti_drebezg[2] задержка после опред цифры if (anti_drebezg[1]==3) anti_drebezg[2]=45;//55; } time_in_regim=25; } else { anti_drebezg[0]=0; anti_drebezg[1]=0; anti_drebezg[2]=200; } #ifdef katod PORTLCD=0x00; #else PORTLCD=0xFF; #endif DDRLCD =0xFF; } А дальше в мэйне вызываем эту функцию. Кнопки подключены через 3комные сопротивления на порты вывода семисегментника.
|