Разработка подпрограммы часов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Разработка подпрограммы часов



Теперь можно приступить к реализации подпрограммы часов. Напомню, что при написании этой подпрограммы мы уверены, что попадаем в неё один раз в секунду, поэтому можно эту подпрограмму рассматривать отдельно и независимо от остальной программы. Более того, эту подпрограмму можно разместить в отдельном файле и подключить ее к проекту. Так мы и сделаем.

В этой подпрограмме часов мы реализуем счётчик секунд, но для его работы, естественно, потребуется ещё одна переменная. Содержимое файла с первым вариантом подпрограммы часов приведено в листинге 25.5.

 

Листинг 25.5. Исходный текст подпрограммы, реализующей счётчик секунд.

 

unsigned char SEC=60; //Переменная счётчика секунд

 

/********************************************************************

Подпрограмма реализации часов

********************************************************************/

void Clock(void)

{if(--SEC==0) //Если прошла одна минута, то

SEC=60; //настроить делитель на коэффициент деления 60

}

 

Переменная SEC объявляется до первого использования, в самом начале файла. Именно в этой переменной и будет осуществляться подсчёт количества прошедших секунд. Как и в предыдущем случае будет достаточно однобайтовой переменной. Первоначальное значение этой переменной присваивается сразу же при её объявлении, а переключение счётчика секунд организуется подобно работе предварительного делителя, рассмотренного в предыдущем варианте программы.

Теперь усложним подпрограмму часов и введём в их состав счётчик минут. Для того, чтобы подпрограмма была более наглядной при этом немного изменим организацию счётчика секунд. При разработке счётчика минут обратим внимание, что его содержимое нужно отображать на светодиодном индикаторе. При этом показания минут должны увеличиваться. Поэтому счётчик минут выполним с помощью команды увеличения содержимого переменной на единицу. Новый вариант подпрограммы часов приведен в листинге 25.6.

 

Листинг 25.6. Исходный текст подпрограммы, реализующей счётчики секунд и минут.

 

unsigned char SEC=60; //Переменная счётчика секунд

unsigned char MIN=0; //Переменная счётчика минут

 

/********************************************************************

Подпрограмма реализации часов

********************************************************************/

void Clock(void)

{if(--SEC!=0) //Если одна минута ещё не прошла, то

return; //вернуться из подпрограммы в основной цикл

SEC=60; //настроить счётчик секунд на коэффициент деления 60

if(++MIN!=60) //Если один час ещё не прошёл, то

return; //вернуться из подпрограммы в основной цикл

MIN=0; //обнулить показания счётчика минут

}

 

В приведённом исходном тексте подпрограммы для увеличения показания счётчика минут использована команда суммирования. В результате количество машинных команд, требующихся для реализации условного оператора, резко увеличится. Для этого давайте воспользуемся дизассемблированным текстом подпрограммы, приведенным в листинге 25.7.

 

Листинг 25.7. Дизассемблированный текст подпрограммы, реализующей счётчики секунд и минут.

 

7: void Clock(void)

8: {if(--SEC!=0) //Если одна минута ещё не прошла, то

9: return; //вернуться из подпрограммы в основной цикл

C:0x0099 D5080D DJNZ SEC(0x08),C:00A9

10: SEC=60; //настроить счётчик секунд на коэффициент деления 60

C:0x009C 75083C MOV SEC(0x08),#0x3C

11: if(++MIN!=60) //Если один час ещё не прошёл, то

12: return; //вернуться из подпрограммы в основной цикл

C:0x009F 0509 INC MIN(0x09)

C:0x00A1 E509 MOV A,MIN(0x09)

C:0x00A3 B43C03 CJNE A,#0x3C,C:00A9

13: MIN=0; //обнулить показания счётчика минут

C:0x00A6 E4 CLR A

C:0x00A7 F509 MOV MIN(0x09),A

14: }

C:0x00A9 22 RET

11: void Timer0_Init(void)

 

Мы видим, что одинаковые по внешнему виду команды условного оператора приводят к различному машинному коду, отличающемуся в два раза, как по объему, так и по быстродействию. Именно поэтому использовать команду увеличения стоит использовать только тогда, когда это определяется какими либо причинами, как, например, в нашем случае.

Теперь добавим в программу счетчик часов. Реализуем его подобно счётчику минут. Новый вариант подпрограммы часов приведен в листинге 25.8.

 

Листинг 25.8. Исходный текст подпрограммы, реализующей счётчики секунд, минут и часов.

 

unsigned char SEC=60; //Переменная счётчика секунд

unsigned char MIN=0; //Переменная счётчика минут

unsigned char Chas=0; //Переменная счётчика часов

 

/********************************************************************

Подпрограмма реализации часов

********************************************************************/

void Clock(void)

{if(--SEC!=0) //Если одна минута ещё не прошла, то

return; //вернуться из подпрограммы в основной цикл

SEC=60; //настроить счётчик секунд на коэффициент деления 60

if(++MIN!=60) //Если один час ещё не прошёл, то

return; //вернуться из подпрограммы в основной цикл

MIN=0; //обнулить показания счётчика минут

if(++Chas!=24)//Если сутки ещё не прошли, то

return; //вернуться из подпрограммы в основной цикл

Chas=0; //обнулить показания счётчика часов

}

 

Счётчик часов реализуется подобно счетчику минут. Единственное отличие заключается в том, что в сутках двадцать четыре часа, поэтому счётчик часов будет обнуляться после достижения этого значения.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 268; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.91.0.68 (0.036 с.)