Перейти к содержанию

Тьнька2313 И 7 Сегментник.


Рекомендуемые сообщения

Ясно. Спасибо большое!Вобщем буду изучать дальше, если возникнут вопросы, отпишу.

П.С. А по поводу МАИНА, как уже писали в этой теме, оптимизация процес творческий и бесконечный :)

Изменено пользователем Андрей Шпакунов

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 84
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Нет, всё работает! :) Спасибо большое!

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я на нем и проверел, сейчас лежит на столе, считает.

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

осчитываите переменную от 0 до 99 с периодом в одну секунду, в этом же цикле проверяите > 99? и каждую итерацию числа делите на 10 это будут десятки, делите по модулю 10 это будут единицы. С динамический ничего сложного, в прерывании перебираите разряды и перекодируите в код семисегментника, выводите в порт.

/*Header******************************************************/

unsigned short mask(unsigned short num);
unsigned short digit_no, digit10, digit1, digit, i;

void interrupt() {
   if (digit_no==0) {
       PORTA = 0;                 // Turn off both displays
       PORTD = digit1;            // Set mask for displaying ones on PORTD
       PORTA = 1;                 // Turn on display for ones (LSD)
       digit_no = 1;
   } else {
       PORTA = 0;                 // Turn off both displays
       PORTD = digit10;           // Set mask for displaying tens on PORTD
       PORTA = 2;                 // Turn on display for tens (MSD)
       digit_no = 0;
   }
   TMR0 = 0;                      // Reset counter TMRO
   INTCON = 0x20;                 // Bit T0IF=0, T0IE=1
}

void main() {
   OPTION_REG = 0x80;             // Set timer TMR0
   TMR0 = 0;
   INTCON = 0xA0;                 // Disable interrupt PEIE,INTE,RBIE,T0IE
   PORTA = 0;                     // Turn off both displays
   TRISA = 0;                     // All port A pins are configured as outputs
   PORTD = 0;                     // Turn off all display segments
   TRISD = 0;                     // All port D pins are configured as outputs

   do {
       for (i = 0; i<=99; i++) {  // Count from 0 to 99
           digit = i % 10u;
           digit1 = mask(digit);  // Prepare mask for displaying ones
           digit = (char)(i / 10u) % 10u;
           digit10 = mask(digit); // Prepare mask for displaying tens
           Delay_ms(1000);
       }
   } while (1);                   // Endless loop
}

mask.c file:

/*Header******************************************************/
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
}
}

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

... и каждую итерацию числа делите на 10 это будут десятки, делите по модулю 10 это будут единицы...

Если не трудно,покажите как это в ассемблере компактно написать.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте. Небольшой вопросик не по теме. Понадобились часы, как основу решил взять вот эти: http://radiokot.ru/circuit/digital/home/33/ Переделал их код на кварц 4Мгц и индикаторы с ОК. Но после переделки не работаю кнопки (моделировал в протеусе). Подскажите в чем ошибка?

Моя версия(оригинал можно скачать по ссылке)

.include "tn2313def.inc"

.def Temp1=R16
.def Temp2=R17
.def Chsec=R18 ;секунды
.def Presskey=R19 ;флаг кнопок
.def Ddp=R20 ;запятая

.dseg
Digit: .byte 4

.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

;Reset: ;сброс по питанию
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1: ;счетчик
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;************************************Инициализация****************************************
Reset:

ldi Temp1,RamEnd
out SPL,Temp1 ; инициализация стека

ldi Temp1,0b11111111
out ddrb, Temp1 ; настройка порта b

ldi Temp1,0b01101100
out ddrd, Temp1 ; настройка порта d

ldi Temp1,0b01000000
out Timsk,Temp1 ;разрешить прерывание компаратора

ldi Temp1,0b00000100
out Tccr1b,Temp1 ;тактовый сигнал /256

ldi Temp1,0x3d
out Ocr1ah,Temp1
ldi Temp1,0x09
out Ocr1al,Temp1 ;запись числа сравнения 15625 (0.4сек. при 10мгц)

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1
sts Digit+1,Temp1
sts Digit+2,Temp1
sts Digit+3,Temp1

ldi Chsec,0; обнуление счетчика секунд

ldi Presskey,0 ; обнуление индикатора кнопок

ldi Ddp,0 ;обнуление запятой

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

sei ; разрешение глобальных прерываний


;******************** Программа *********************************************************

Cycle:
rcall Display
rcall Press
rjmp Cycle
;*******************Индикация***********************
Display:

ldi Temp1, 0b00101111
out PortD,Temp1
lds Temp1,Digit
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 1-ого разряда (мл.)

ldi Temp1, 0b01001111
out PortD,Temp1
lds Temp1,Digit+1
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 2-ого разряда

ldi Temp1, 0b01100111
out PortD,Temp1
lds Temp1,Digit+2
rcall Decoder
andi Ddp,0b00000001 ;обрезка по маске
cpi Ddp,1 ;разность 
breq Indicout ;если ноль то индикация без запятой
ldi Temp2,0b00100000
add Temp1,Temp2 ;добавление сегмента h запятая
Indicout: out PortB,Temp1
rcall Delay ; индикация 3-ого разряда

ldi Temp1, 0b01101011
out PortD,Temp1
lds Temp1,Digit+3
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 4-ого разряда

ret

;***********************************Подпрограммы*****************************************

;***********дешифратор*********************************
Decoder:

ldi ZL,Low(Matrix*2)
ldi ZH,High(Matrix*2)
ldi Temp2,0
add ZL,Temp1
adc ZH,Temp2
lpm
mov Temp1,r0

ret
;**********************************************************

;***********массив*****************************************
Matrix:
  ;edhcgafb   edhcgafb
.db 0b11010111,0b00010001 ;01
.db 0b11001101,0b01011101 ;23
.db 0b00011011,0b01011110 ;45
.db 0b11011110,0b00010101 ;67
.db 0b11011111,0b01011111 ;89
;**********************************************************

;***********задержка***************************************
Delay:
ldi Temp1,0
ldi Temp2,5
dll: dec Temp1
brne dll
dec Temp2
brne dll
ret
;**********************************************************

;***************Обработчик прерывания**********************
Timer1_comp1:

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

inc Ddp ; увелечение запятой

inc Chsec ; увелечение секунд
cpi Chsec,60 ; разность 1мин
brne Output2 ; если не ноль то выход

;================================

ldi Chsec,0 ; обнуление счетчика секунд

;================================

lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Test2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Output2 ; выход2

;=================================

Test2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Test3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Output2 ; выход2


;=================================

Test3:

ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда

cpi Temp1,10 ;разность
breq Test4 ;если  ноль тест4

sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Output1 ; выход1

;=================================

Test4:

ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда

sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Output1 ; выход 1

;=================================

Output1:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Output2 ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Output2 ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

Output2:
reti
;**********************************************************

;**************************Обработчик конопок**************
Press:
in Temp1,PinD ; чтение порта d
andi Temp1,0b00000011 ; обрезка по маске
cpi Temp1,0b00000011 ;разность
breq Nobut ; если ноль (нет нажатых) выход 

;===================================

cpi Temp1,0b00000010
brne Press_hour ; если не ноль то нажата кнопка ред. часов

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000010 ; запись индикатора кнопок


lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Tst2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Outpress ; выход

;=================================

Tst2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Tst3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Outpress ; выход

;=================================

Tst3:
ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда
rjmp Outpress ; выход
;******************
Press_hour:

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000001 ; запись индикатора кнопок

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда
cpi Temp1,10 ;разность
breq Tst4 ;если  ноль тест4
sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Tst24 ; проверка на 24

;============================

Tst4:
ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда
sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Outpress ;выход

Tst24:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Outpress ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Outpress ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

rjmp Outpress ;выход

Nobut:
ldi Presskey,0 ; обнуление индикатора кнопок
Outpress:
ret

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Для начала, в программе обработки прерываний, нужно сохранить реггистр статуса. Тебе уже об этом один раз говорили в #47.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Вот, добавил:

;***************Обработчик прерывания**********************
Timer1_comp1:

PUSH TEMP1
IN TEMP1,SREG

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

inc Ddp ; увелечение запятой

inc Chsec ; увелечение секунд
cpi Chsec,60 ; разность 1мин
brne Output2 ; если не ноль то выход

OUT SREG,TEMP1
POP TEMP1
RETI 
;================================

ldi Chsec,0 ; обнуление счетчика секунд

;================================

lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Test2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Output2 ; выход2

;=================================

Test2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Test3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Output2 ; выход2


;=================================

Test3:

ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда

cpi Temp1,10 ;разность
breq Test4 ;если  ноль тест4

sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Output1 ; выход1

;=================================

Test4:

ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда

sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Output1 ; выход 1

;=================================

Output1:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Output2 ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Output2 ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

Output2:
reti

Но после этого на индикаторах только средний сегмент и точка.В чем ошибка?

Изменено пользователем Андрей Шпакунов

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Оригинал:

;       edhcgafb   edhcgafb
.db 0b11010111,0b00010001 ;01
.db 0b11001101,0b01011101 ;23
.db 0b00011011,0b01011110 ;45
.db 0b11011110,0b00010101 ;67
.db 0b11011111,0b01011111 ;89

Мое:

;       edhcgafb   edhcgafb
       .db 0b00101000,0b11101110 ;01
.db 0b00110010,0b10100010 ;23
.db 0b11100100,0b10100001 ;45
.db 0b00100001,0b11101010 ;67
.db 0b00100000,0b10100000 ;89

Изменено пользователем Андрей Шпакунов

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Вот архив с листингом.

myclock.rar

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

И сохранение статус реггистра почему забанено?

Вы просто не туда воткнули его восстановление.

Восстанавливать нужно перед RETI, который там уже был.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Извините, протупил с типом индикаторов (у меня ОК), вобщем сейчас всё поправил, но точка не мигает, и время странное 1 реальная минута - примерно 3 минуты их. В чем может быть ошибка? Вот код:

;************************************Инициализация****************************************
Reset:

ldi Temp1,RamEnd
out SPL,Temp1 ; инициализация стека

ldi Temp1,0b11111111
out ddrb, Temp1 ; настройка порта b

ldi Temp1,0b01101100
out ddrd, Temp1 ; настройка порта d

ldi Temp1,0b01000000
out Timsk,Temp1 ;разрешить прерывание компаратора

ldi Temp1,0b00000100
out Tccr1b,Temp1 ;тактовый сигнал /256

ldi Temp1,0x3d
out Ocr1ah,Temp1
ldi Temp1,0x09
out Ocr1al,Temp1 ;запись числа сравнения 15625 (0.4сек. при 10мгц)

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1
sts Digit+1,Temp1
sts Digit+2,Temp1
sts Digit+3,Temp1

ldi Chsec,0; обнуление счетчика секунд

ldi Presskey,0 ; обнуление индикатора кнопок

ldi Ddp,0 ;обнуление запятой

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

sei ; разрешение глобальных прерываний


;******************** Программа *********************************************************

Cycle:
rcall Display
rcall Press
rjmp Cycle
;*******************Индикация***********************
Display:

ldi Temp1, 0b00101111
out PortD,Temp1
lds Temp1,Digit
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 1-ого разряда (мл.)

ldi Temp1, 0b01001111
out PortD,Temp1
lds Temp1,Digit+1
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 2-ого разряда

ldi Temp1, 0b01100111
out PortD,Temp1
lds Temp1,Digit+2
rcall Decoder
andi Ddp,0b00000001 ;обрезка по маске
cpi Ddp,1 ;разность 
breq Indicout ;если ноль то индикация без запятой
ldi Temp2,0b00100000
add Temp1,Temp2 ;добавление сегмента h запятая
Indicout: out PortB,Temp1
rcall Delay ; индикация 3-ого разряда

ldi Temp1, 0b01101011
out PortD,Temp1
lds Temp1,Digit+3
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 4-ого разряда

ret

;***********************************Подпрограммы*****************************************

;***********дешифратор*********************************
Decoder:

ldi ZL,Low(Matrix*2)
ldi ZH,High(Matrix*2)
ldi Temp2,0
add ZL,Temp1
adc ZH,Temp2
lpm
mov Temp1,r0

ret
;**********************************************************

;***********массив*****************************************
Matrix:
   	; edhcgafb   edhcgafb
.db 0b11010111,0b00010001 ;01
.db 0b11001101,0b01011101 ;23
.db 0b00011011,0b01011110 ;45
.db 0b11011110,0b00010101 ;67
.db 0b11011111,0b01011111 ;89
;**********************************************************

;***********задержка***************************************
Delay:
ldi Temp1,0
ldi Temp2,5
dll: dec Temp1
brne dll
dec Temp2
brne dll
ret
;**********************************************************

;***************Обработчик прерывания**********************
Timer1_comp1:

PUSH TEMP1
IN TEMP1,SREG

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

inc Ddp ; увелечение запятой

inc Chsec ; увелечение секунд
cpi Chsec,60 ; разность 1мин
brne Output2 ; если не ноль то выход


;================================

ldi Chsec,0 ; обнуление счетчика секунд

;================================

lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Test2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Output2 ; выход2

;=================================

Test2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Test3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Output2 ; выход2


;=================================

Test3:

ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда

cpi Temp1,10 ;разность
breq Test4 ;если  ноль тест4

sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Output1 ; выход1

;=================================

Test4:

ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда

sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Output1 ; выход 1

;=================================

Output1:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Output2 ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Output2 ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

OUT SREG,TEMP1
POP TEMP1
reti

Output2:
reti


;**********************************************************

;**************************Обработчик конопок**************
Press:
in Temp1,PinD ; чтение порта d
andi Temp1,0b00000011 ; обрезка по маске
cpi Temp1,0b00000011 ;разность
breq Nobut ; если ноль (нет нажатых) выход 

;===================================

cpi Temp1,0b00000010
brne Press_hour ; если не ноль то нажата кнопка ред. часов

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000010 ; запись индикатора кнопок


lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Tst2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Outpress ; выход

;=================================

Tst2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Tst3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Outpress ; выход

;=================================

Tst3:
ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда
rjmp Outpress ; выход
;******************
Press_hour:

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000001 ; запись индикатора кнопок

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда
cpi Temp1,10 ;разность
breq Tst4 ;если  ноль тест4
sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Tst24 ; проверка на 24

;============================

Tst4:
ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда
sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Outpress ;выход

Tst24:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Outpress ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Outpress ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

rjmp Outpress ;выход

Nobut:
ldi Presskey,0 ; обнуление индикатора кнопок
Outpress:
ret
;**********************************************************

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...