ssvd писал(а):вот еще такая просьба, еще не собирал проект только накидал в протеусе и CodeVision. Это самые простые бинарные часы.
Скажите все ли правильно в схеме и коде?!
1. Могут выгореть разряды порта, где стоят индикаторы, т. к. нет балластных резисторов. Может это в Proteus-е не нарисовано (ему это до "лампочки"), тогда это полбеды.
2. Разряды PORTB с анодами идикаторов инициализированы в "1" (должны быть в "0"), а PORTD с катодами - в "0" (должны быть в "1"). Т. е. все светодиоды включаться сразу.
3. Затем, когда определится на первом switch нужный разряд катода, останутся включенными катоды 2-х линеек светодиодов. т. к. в программе не бегущий "0" по катодам на PORTD, а бегущая "1", т. е. получиться чёрт-те что.
4. Если часы двоичные, то для часовой линейки на 24 часа, нужен еще один разряд (светодиод). Для 12 часовой шкалы - хватит.
5. Частота кварца не указана. Таймер 1 должен "тикать" через секунду, для отсчета времени, а Таймер 0 - для динамической индикации, не менее, чем с частотой 75 Гц. Оба таймера работают по переполнению, не знаю как решена эта задача.
6. Такое выражение в операторе if(cur_dig++==3){cur_dig=0;}, скорее всего, не должно изменять переменную cur_dig. Оно служит только для логической операции (в данном случае проверке на равенство). Для реинициализации цикла switch, оно пойдет, но конкретный вид выражения будет зависеть от того, где будет изменяться переменная. Либо городить другой цикл, где сразу будет и изменение переменной, и переход на начало цикла.
Далее есть похожие выражения...
P.S. По п. 6 беру свои слова обратно - переменная изменяется. Только нужно инкремент переменной записать в префиксной форме if(++cur_dig==3){cur_dig=0;}
7. Зачем 2 блока switch ? Если определен нужный разряд (катод), то в этом же case: можно вывести нужную цифру и в PORTB.
Для того, чтобы обойтись одним таймером и одним источником прерывания, можно сделать так:
Выбрать режим СТС для Таймер1. Это сброс по совпадению. Исходя из частоты кварца, посчитать какое число нужно записать в регистр сравнения, чтобы прерывание происходило, допустим через 10 ms. Затем, по прерыванию через 10 ms индицировать цифры, переключая разряды, а счет времени вести, накапливая секунду в дополнительной переменной на 100.