void low_init() { #if (__AVR_ATmega128__) //for MRTP_4 DDRE|=0x10;//живлення для регістрів ввода/вивода PORTE&=~0x10; set_data_low(0x00,CS0);//выдача МТ[0] set_data_low(0x00,CS2);//выдача МТ[1] #endif #if (__AVR_ATmega1280__) //for MK_035 DDRJ=0xff; PORTJ=0xff; DDRF=0xff; PORTG&=~_BV(PG5); set_data_low(0x00,CS0);//выдача МТ[0] #endif//for MK_035 }
void LPD8806_send_byte(uint8_t the_byte){ for(uint8_t i = 0; i < 8; i++){ uint8_t bit = the_byte & (1 << (7 - i)); if(bit == 0) set_data_low(); else set_data_high(); clock_strobe(); } }
//extern uint8_t TestMsk; void low_drv() { uint8_t i,temp; #if (__AVR_ATmega128__) //for MRTP_4 DDRE|=0x10; PORTE&=~0x10; set_data_low(MT[0],CS0);//выдача МТ[0] OS_MT[0]=read_data_low(CS1);//чтение ОС[0] set_data_low(MT[1],CS2);//выдача МТ[1] OS_MT[1]=read_data_low(CS3);//чтение ОС[1] // MSK[cur_msk_selector]=read_data_low(CS5);//считывание текущего МСК temp=read_data_low(CS5);//считывание текущего МСК, затем фильтрация //TestMSK=temp; #if 1 //побитная фильтрация МСК for(i=0;i<8;i++) { if(temp&(1<<i)) //МСК не нажат { if(!(MSK[cur_msk_selector]&(1<<i))) //при ненажатом МСК отфильтрованом { MSK_FLT_TMP[cur_msk_selector*8+i]=0; } else //отфильтрованый МСК был нажат { MSK_FLT_TMP[cur_msk_selector*8+i]++; if(MSK_FLT_TMP[cur_msk_selector*8+i]>MSK_FLT)//если истекло время фильтрации { MSK[cur_msk_selector]&=~(1<<i);//отпустить МСК MSK_FLT_TMP[cur_msk_selector*8+i]=0;//очистить фильтр } } } else //если МСК нажат { if(!(MSK[cur_msk_selector]&(1<<i))) //при ненажатом МСК отфильтрованом { MSK_FLT_TMP[cur_msk_selector*8+i]++; if(MSK_FLT_TMP[cur_msk_selector*8+i]>MSK_FLT)//если истекло время фильтрации { MSK[cur_msk_selector]|=(1<<i);//отпустить МСК //tech_fl|=SOUND_KEY; MSK_FLT_TMP[cur_msk_selector*8+i]=0;//очистить фильтр } } else //отфильтрованая кнопка не была нажата { MSK_FLT_TMP[cur_msk_selector*8+i]=0; } } } #endif // TestMSK=0x00; // switch (cur_msk_selector) // { // case 0: // TestMSK=0x01; // break; // case 1: // TestMSK=0x04; // break; // case 2: // TestMSK=0x10; // break; // case 3: // TestMSK=0x40; // break; // case 4: // TestMSK=0x02; // break; // case 5: // TestMSK=0x08; // break; // case 6: // TestMSK=0x20; // break; // case 7: // TestMSK=0x80; // break; // } //if (cur_msk_selector%2) { // TestMSK|=(1<<(cur_msk_selector%2+4)); //} //else { // TestMSK|=(1<<(cur_msk_selector/2)); //} // if (TestMSK==temp) TestMSKResult|=(1<<cur_msk_selector); else TestMSKResult&=~(1<<cur_msk_selector); ////for (i=0;i<8;i++) { //// if (cur_msk_selector%2) { // TestMsk|=(1<<()) // } // else { // // } //} cur_msk_selector++;//инкремент текущего МСК if(cur_msk_selector>7) { cur_msk_selector=0; // Условие обнуления счетчика выбора МСК. } set_data_low(1<<cur_msk_selector,CS4);//засвечивание следующего столбца МСК #endif #if (__AVR_ATmega1280__) //for MK_035 uint8_t temp2; temp=read_data_low(CS3);//считывание текущего МСК temp2=read_data_low(CS1);//считывание текущего МСК if (!(cur_msk_selector%2)){ for (i=0;i<4;i++) { if (!(temp&(1<<i))) MSK[cur_msk_selector/2]|=(1<<i); else MSK[cur_msk_selector/2]&=~(1<<i); if (!(temp&(1<<i+4))) MSK[cur_msk_selector/2+2]|=(1<<i); else MSK[cur_msk_selector/2+2]&=~(1<<i); if (!(temp2&(1<<i))) MSK[cur_msk_selector/2+4]|=(1<<i); else MSK[cur_msk_selector/2+4]&=~(1<<i); if (!(temp2&(1<<i+4))) MSK[cur_msk_selector/2+2+4]|=(1<<i); else MSK[cur_msk_selector/2+2+4]&=~(1<<i); } } else { for (i=0;i<4;i++) { if (!(temp&(1<<i))) MSK[cur_msk_selector/2]|=(1<<i+4); else MSK[cur_msk_selector/2]&=~(1<<i+4); if (!(temp&(1<<i+4))) MSK[cur_msk_selector/2+2]|=(1<<i+4); else MSK[cur_msk_selector/2+2]&=~(1<<i+4); if (!(temp2&(1<<i))) MSK[cur_msk_selector/2+4]|=(1<<i+4); else MSK[cur_msk_selector/2+4]&=~(1<<i+4); if (!(temp2&(1<<i+4))) MSK[cur_msk_selector/2+2+4]|=(1<<i+4); else MSK[cur_msk_selector/2+2+4]&=~(1<<i+4); } } //MSK[cur_msk_selector]=read_data_low(CS3);//считывание текущего МСК // temp=read_data_low(CS3);//считывание текущего МСК, затем фильтрация #if 0 //побитная фильтрация МСК for(i=0;i<8;i++) { //if (i%2) { if(temp&(1<<i)) //МСК не нажат { if(!(MSK[cur_msk_selector]&(1<<i))) //при ненажатом МСК отфильтрованом { MSK_FLT_TMP[cur_msk_selector*8+i]=0; } else //отфильтрованый МСК был нажат { MSK_FLT_TMP[cur_msk_selector*8+i]++; if(MSK_FLT_TMP[cur_msk_selector*8+i]>MSK_FLT)//если истекло время фильтрации { MSK[cur_msk_selector]&=~(1<<i);//отпустить МСК MSK_FLT_TMP[cur_msk_selector*8+i]=0;//очистить фильтр } } } else //если МСК нажат { if(!(MSK[cur_msk_selector]&(1<<i))) //при ненажатом МСК отфильтрованом { MSK_FLT_TMP[cur_msk_selector*8+i]++; if(MSK_FLT_TMP[cur_msk_selector*8+i]>MSK_FLT)//если истекло время фильтрации { //MSK[cur_msk_selector]|=(1<<i);//отпустить МСК MSK[cur_msk_selector]|=(1<<i+4);//отпустить МСК MSK_FLT_TMP[cur_msk_selector*8+i]=0;//очистить фильтр } } else //отфильтрованая кнопка не была нажата { MSK_FLT_TMP[cur_msk_selector*8+i+4]=0; } } //} //else { // if(temp&(1<<i+4)) //МСК не нажат // { // if(!(MSK[cur_msk_selector]&(1<<i+4))) //при ненажатом МСК отфильтрованом // { // MSK_FLT_TMP[cur_msk_selector*8+i+4]=0; // } // else //отфильтрованый МСК был нажат // { // MSK_FLT_TMP[cur_msk_selector*8+i+4]++; // if(MSK_FLT_TMP[cur_msk_selector*8+i+4]>MSK_FLT)//если истекло время фильтрации // { // // MSK[cur_msk_selector]&=~(1<<(i+4));//отпустить МСК // MSK_FLT_TMP[cur_msk_selector*8+i+4]=0;//очистить фильтр // } // } // } // else //если МСК нажат // { // if(!(MSK[cur_msk_selector]&(1<<(i+4)))) //при ненажатом МСК отфильтрованом // { // MSK_FLT_TMP[cur_msk_selector*8+i+4]++; // if(MSK_FLT_TMP[cur_msk_selector*8+i]>MSK_FLT)//если истекло время фильтрации // { // //MSK[cur_msk_selector]|=(1<<i);//отпустить МСК // MSK[cur_msk_selector]|=(1<<(i+4));//отпустить МСК // MSK_FLT_TMP[cur_msk_selector*8+i+4]=0;//очистить фильтр // } // } // else //отфильтрованая кнопка не была нажата // { // MSK_FLT_TMP[cur_msk_selector*8+i+4]=0; // } // } //} } #endif //Кінець фільтрації МСК cur_msk_selector++;//инкремент текущего МСК if(cur_msk_selector>3) { cur_msk_selector=0; // Условие обнуления счетчика выбора МСК. } set_data_low((0x11<<cur_msk_selector),CS2);//засвечивание следующего столбца МСК set_data_low((0x11<<cur_msk_selector),CS0);//засвечивание следующего столбца МСК //#if X2_MSK // #if X3_MSK // set_data_low((0x01<<cur_msk_selector),CS2);//засвечивание следующего столбца МСК // #else // set_data_low((1<<cur_msk_selector),CS2); //засвечивание следующего столбца МСК // #endif //#else // #if X3_MSK // set_data_low((1<<cur_msk_selector+4),CS2); //засвечивание следующего столбца МСК // #endif //#endif // //#if X4_MSK //set_data_low((1<<cur_msk_selector),CS0);//засвечивание следующего столбца МСК //#endif //#if X5_MSK ////set_data_low((1<<cur_msk_selector+4),CS0);//засвечивание следующего столбца МСК //#endif //set_data_low((1<<(cur_msk_selector+1),CS1); #endif//for MK_035 }