Здравствуйте, подскажите, пожалуйста, нужно создать схему: 1 . На вход 1 приходит один импульс на выходе образуется 1-15 импульсов (выбирается двумя кнопками + -) с частотой 1 герц 2. Есть еще одна кнопка при нажатии, на которую импульсы идут постоянно. 3. И еще один вход 2 если на нем логическая 1 то при подаче импульса на вход 1 на входе ничего не происходит. Желательно на PIC16F628 (просто есть в наличии). Сам ни разу не программировал, если можно, то с проектом в Proteus. Заранее благодарен. P.S. Извините если что-то не понятно написал, подскажите пожалуйста очень нужно.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4601 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
С каким принципом ? Примеров работ с кнопками, с выводами, миганием лампочек и т.д... просто уйма в интернете. Начинайте делать, появятся конкретные вопросы - задавайте. А пока от Вас видны только хотелки...
Здравствуйте, написал пробную версию программы (в proteus работает), посмотрите, может где-то что-то лишнего написал. И самое главное подскажите, пожалуйста, как переменную kol_imp сначала считать с EEprom, а потом при каждом изменении туда записать, что-то не могу понять. Заранее благодарен.
unsigned char kol_imp; //глобальная переменная количество импульсов bit nac1; bit nac2; bit nac3; bit nac4;
void main (void) { podgot(); //вызов функции подготовки микропроцессора kol_imp = 2; //установка глобальной переменной otab(); //отображение количества импульсов
while (1) //бесконечный цикл { if ((RA1 == 1) & (nac1==0) & (RA5==1)) imp_cet(); else if (RA1 == 0) nac1=0;
if ((RA2 == 1) & (nac2==0)) plys(); else if (RA2 == 0) nac2=0;
if ((RA3 == 1) & (nac3==0)) minys(); else if (RA3 == 0) nac3=0;
if ((RA4 == 1) & (RA5 ==1)) proka ();
if (RA5 == 0) RA7 = 1; else RA7 = 0; } } //////////////////////////////////////////////////////////////////////////// void podgot (void) { TRISA = 0b00011110; // направление работы ножек порта А TRISB = 0b00000000; // направление работы ножек порта B CMCON = 0x07; // отключение компараторов PORTA = 0b00000000; // чистим порты A PORTB = 0b00000000; // чистим порты B RBPU = 0; // подтягивающие R (1-откл, 0-вкл) } /////////////////////////////////////////////////////////////////////////// void imp_cet (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода unsigned int kol_imp_tem; //количество импульсов локальная переменная чтобы не менять глобальную kol_imp_tem = kol_imp; //перенос количества импульсов с глобальной переменной в локальную nac1=1; while (kol_imp_tem != 0) //цикл по количеству импульсов { RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода kol_imp_tem=kol_imp_tem - 1; //уменьшение количества импульсов светодиода } } ///////////////////////////////////////////////////////////////////////////// void plys (void) { nac2 = 1; if (kol_imp < 19) { kol_imp = kol_imp + 1; otab(); } } //////////////////////////////////////////////////////////////////////////// void minys (void) { if (kol_imp > 0) { nac3 = 1; kol_imp = kol_imp - 1; otab(); } } ////////////////////////////////////////////////////////////////////////// void proka (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода } ///////////////////////////////////////////////////////////////////////// void otab (void) { switch (kol_imp) { case 0: PORTB = 0b00111111; break; case 1: PORTB = 0b00000110; break; case 2: PORTB = 0b01011011; break; case 3: PORTB = 0b01001111; break; case 4: PORTB = 0b01100110; break; case 5: PORTB = 0b01101101; break; case 6: PORTB = 0b01111101; break; case 7: PORTB = 0b00000111; break; case 8: PORTB = 0b01111111; break; case 9: PORTB = 0b01101111; break; case 10: PORTB = 0b10111111; break; case 11: PORTB = 0b10000110; break; case 12: PORTB = 0b11011011; break; case 13: PORTB = 0b11001111; break; case 14: PORTB = 0b11100110; break; case 15: PORTB = 0b11101101; break; case 16: PORTB = 0b11111101; break; case 17: PORTB = 0b10000111; break; case 18: PORTB = 0b11111111; break; case 19: PORTB = 0b11101111; break; } }
Последний раз редактировалось Аlex Вт мар 10, 2015 13:51:52, всего редактировалось 1 раз.
Все прочитал, вот так получилось (в proteus работает), подскажите, я правильно все понял? И еще подскажите, если в память надо записать большое число (больше 255) как это правильно делается?
unsigned char kol_imp; //глобальная переменная количество импульсов bit nac1; bit nac2; bit nac3; bit nac4;
void main (void) { podgot(); //вызов функции подготовки микропроцессора kol_imp = ee_read(0x00); if ((kol_imp >19) | (kol_imp < 0)) kol_imp =1; otab(); //отображение количества импульсов
while (1) //бесконечный цикл { if ((RA1 == 1) & (nac1==0) & (RA5==1)) imp_cet(); else if (RA1 == 0) nac1=0;
if ((RA2 == 1) & (nac2==0)) plys(); else if (RA2 == 0) nac2=0;
if ((RA3 == 1) & (nac3==0)) minys(); else if (RA3 == 0) nac3=0;
if ((RA4 == 1) & (RA5 ==1)) proka ();
if (RA5 == 0) RA7 = 1; else RA7 = 0; } } //////////////////////////////////////////////////////////////////////////// void podgot (void) { TRISA = 0b00011110; // направление работы ножек порта А TRISB = 0b00000000; // направление работы ножек порта B CMCON = 0x07; // отключение компараторов PORTA = 0b00000000; // чистим порты A PORTB = 0b00000000; // чистим порты B RBPU = 0; // подтягивающие R (1-откл, 0-вкл) } /////////////////////////////////////////////////////////////////////////// unsigned char ee_read(unsigned char adres) { EEADR = adres; RD = 1; return EEDATA; } /////////////////////////////////////////////////////////////////////////// unsigned char ee_write(unsigned char data, unsigned char adres) { GIE=0; EEADR=adres; EEDATA=data; WREN=1; EECON2=0x55; EECON2=0xAA; WR=1; GIE=1; } /////////////////////////////////////////////////////////////////////////// void imp_cet (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода unsigned int kol_imp_tem; //количество импульсов локальная переменная чтобы не менять глобальную kol_imp_tem = kol_imp; //перенос количества импульсов с глобальной переменной в локальную nac1=1; while (kol_imp_tem != 0) //цикл по количеству импульсов { RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода kol_imp_tem=kol_imp_tem - 1; //уменьшение количества импульсов светодиода } } ///////////////////////////////////////////////////////////////////////////// void plys (void) { nac2 = 1; if (kol_imp < 19) { kol_imp = kol_imp + 1; otab(); ee_write(kol_imp, 0x00); } } //////////////////////////////////////////////////////////////////////////// void minys (void) { if (kol_imp > 0) { nac3 = 1; kol_imp = kol_imp - 1; otab(); ee_write(kol_imp, 0x00); } } ////////////////////////////////////////////////////////////////////////// void proka (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода } ///////////////////////////////////////////////////////////////////////// void otab (void) { switch (kol_imp) { case 0: PORTB = 0b00111111; break; case 1: PORTB = 0b00000110; break; case 2: PORTB = 0b01011011; break; case 3: PORTB = 0b01001111; break; case 4: PORTB = 0b01100110; break; case 5: PORTB = 0b01101101; break; case 6: PORTB = 0b01111101; break; case 7: PORTB = 0b00000111; break; case 8: PORTB = 0b01111111; break; case 9: PORTB = 0b01101111; break; case 10: PORTB = 0b10111111; break; case 11: PORTB = 0b10000110; break; case 12: PORTB = 0b11011011; break; case 13: PORTB = 0b11001111; break; case 14: PORTB = 0b11100110; break; case 15: PORTB = 0b11101101; break; case 16: PORTB = 0b11111101; break; case 17: PORTB = 0b10000111; break; case 18: PORTB = 0b11111111; break; case 19: PORTB = 0b11101111; break; } }
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4601 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Если всё записывается и читается, то правильно Если нужно работать с числами, размером больше 1 байта - делите число на несколько байтов. Это же логично
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения