Vadim1369 хочет сделать "крякалку" на контроллере, у которого нет ни DAC ни PWM. SRAM 64 байта и Program Memory 1024 words.
Обычно, контроллер подбирают под задачу...
Код: Выделить всё
Main
incf psevdosec ; Инкремент секунд
movfw psevdosec
movwf temp ; Делаем дубликат, чтобы не портить оригинал
movlw b'00111111' ; Зануляем разряды минут
andwf temp
movlw b'00111100' ; Вычитаем 60
subwf temp
btfsc STATUS,Z
goto Inc_Min_Low ; Если насчитали 60 секунд, инкремент младшей части минут
goto Main
Inc_Min_Low
movlw b'00111111' ; Обнуляем секунды
iorwf psevdosec
incf psevdosec ; Инкремент младшей части минут
btfsc STATUS,Z
goto Inc_Min_Hi ; Если насчитали больше 3 минут, инкремент старшей части минут
goto Main
Inc_Min_Hi
incf psevdomin ; Инкремент старшей части минут, и в случае переполнения автоматически инкремент часов
goto Main
Если максимум 18 часов достаточно - просто, считайте секунды двухбайтовым счётчиком.Пока_без_кота писал(а):Просьба покритиковать, предложить получше
Пока_без_кота писал(а):3 байта (часы, минуты, секунды)
Сколько же, все таки, байт. Или въ путаете битъ и байтъ.Пока_без_кота писал(а):6 младших байт 1-й ячейки - секунды, 2 старших байта этой же ячейки - младшая часть минут, 4 младших байта 2-й ячейки старшая часть минут, 4 старших байта 2-й ячейки - часы.
Albert_V писал(а): 18 часов ..... двухбайтовым счётчиком
Код: Выделить всё
movlw (0<<T1CKPS1)|(0<<T1CKPS0)|(1<<T1OSCEN)|(1<<NOT_T1SYNC)|(1<<TMR1CS)|(1<<TMR1ON)
; Предделитель 1:1, генератор включен, синхронизация внешнего сигнала выключена, внешний источник тактового сигнала, таймер включен
movwf T1CON
Код: Выделить всё
Hex_2_ASCII ; Переводим ASCII-код в HEX представление ('0'-0h,'1'-1h,...,'E'-0Eh,'F'-0Fh)
movfw rx_byte ; Копируем принятый байт
sublw 39h ; Вычитаем наш код из ASCII-кода '9'
btfss STATUS,C
goto Label_1 ; Если > '9', надо вычитать 37h
movlw 30h ; Если <= '9', надо вычитать 30h
subwf rx_byte,w
goto Label_2
Label_1
movlw 37h
subwf rx_byte,w
Label_2
return
Код: Выделить всё
bin2hex
andlw 0x0f ; Isolate the low 4 bits
addlw -.10 ; Value greater than 10?
skpnc ; Skip if not
addlw 'A'-'0' ; Else adjust for 'A'..'F'
addlw '0'+.10 ; Convert to ASCII
return
Код: Выделить всё
hex2bin
movwf temp
btfsc temp,6
addlw 9h
andlw 0Fh
return
Код: Выделить всё
asc_bin:
mov a,tmp_rx ; читаем принятый полубайт
jnb ACC.6,asc_h0 ; проверяем бит, соответствующий 4
; в старшей тетраде
add a,#0x09 ; добавка для A-F
asc_h0:
anl a,#0x0F ; выделяем младшую тетраду старшего символа
retКод: Выделить всё
movlw 'F' ; Число в ASCII (TEST)
movwf TEMP
;---------------
movlw 30 ; Hex
btfsc TEMP,6
movlw 37 ; Hex
subwf TEMP,F ; В TEMP результат в HEX
;---------------