Делаем ИК-пульт ДУ для фотоаппарата
errorlevel 0,-207,-205,-302,-203#include
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
LED equ 5; ИК-светодиодCFG equ 4; Nikon (1) / Canon (0)
;===============================================================================; Переменные;===============================================================================
CBLOCK 0×020DELDEL_MSIMPCOUNTENDC
;===============================================================================; Сброс;===============================================================================
ORG 0GOTO START
;===============================================================================; Прерывания;===============================================================================
ORG 4RETFIE
;===============================================================================; Подпрограммы;===============================================================================
; Подпрограмма задержки (в микросекундах, 770 мкс max);(Перед вызовом поместить величину задержки в W)DEL_MK MOVWF DELM1 DECFSZ DEL, FGOTO M1RETLW 0
; Подпрограмма задержки (в миллисекундах, 256 мс max);(Перед вызовом поместить величину задержки в W)DEL_M MOVWF DEL_MSMOVLW 0xA5M2 CALL DEL_MKCALL DEL_MKDECFSZ DEL_MS, FGOTO M2RETLW 0
; Подпрограмма вывода импульса для Nikon (заполнение 38,4 кГц);(Перед вызовом поместить длительность импульса в W)NIK MOVWF IMPM3 BCF GPIO, LEDMOVLW 0×02CALL DEL_MKNOPBSF GPIO, LEDMOVLW 0×01CALL DEL_MKNOPDECFSZ IMP, FGOTO M3RETLW 0
; Подпрограмма вывода сигнала для NikonNIKON MOVLW 0×4DCALL NIK; импульс 2 мсMOVLW 0×12CALL DEL_M; пауза 27,8 мсMOVLW 0×47CALL DEL_MKMOVLW 0×0FCALL NIK; импульс 0,4 мсMOVLW 0×01CALL DEL_M; пауза 1,6 мсMOVLW 0×69CALL DEL_MKMOVLW 0×0FCALL NIK; импульс 0,4 мсMOVLW 0×02CALL DEL_M; пауза 3,6 мсMOVLW 0xFFCALL DEL_MKMOVLW 0×0FCALL NIK; импульс 0,4 мсRETLW 0
; Подпрограмма вывода импульса для Canon (заполнение 33 кГц);(Перед вызовом поместить длительность импульса в W)CAN MOVWF IMPM4 BCF GPIO, LEDMOVLW 0×02CALL DEL_MKNOPNOPNOPBSF GPIO, LEDMOVLW 0×01CALL DEL_MKNOPNOPNOPDECFSZ IMP, FGOTO M3RETLW 0
; Подпрограмма вывода сигнала для CanonCANON MOVLW 0×13CALL CAN; импульс 0,5 мсMOVLW 0×05CALL DEL_M; пауза 7,3 мсMOVLW 0×13CALL CAN; импульс 0,5 мсRETLW 0
; Подпрограмма задержки на 1 секунду 0xA1DEL_1S MOVLW 0xFFCALL DEL_MMOVLW 0xFFCALL DEL_MMOVLW 0×88CALL DEL_MRETLW 0
;===============================================================================; Основная программа;===============================================================================
START BCF STATUS, RP0; Выбран банк 0MOVLW B'00000000'MOVWF INTCONMOVLW B'00000111'MOVWF CMCON; Отключаем встроенные компараторы
BSF STATUS, RP0; Выбран банк 1MOVLW B'00000111'MOVWF OPTION_REGCALL 3FFh; Загрузить константу калибровки генератораMOVWF OSCCALMOVLW B'00011111'; Порты (направление)MOVWF TRISIOMOVLW B'00010111'; Подтягивающие резисторыMOVWF WPU
BCF STATUS, RP0; Выбран банк 0
MOVLW B'00100000'; ПортыMOVWF GPIO
;--------------------------
MOVLW 0×12CALL DEL_M
LP1 BTFSS GPIO, CFGCALL CANONBTFSS GPIO, CFGGOTO LP2CALL NIKON
LP2 MOVF GPIO, W; Считать состояние перемычекANDLW B'00000111'ADDLW B'11111000'MOVWF COUNTCOMF COUNT, F
BTFSC STATUS, Z; Выключение, если нетSLEEP
MOVF COUNT, WXORLW 0×01; Включен 1 таймингBTFSC STATUS, ZGOTO SET2
MOVF COUNT, WXORLW 0×02; Включен 2 таймингBTFSC STATUS, ZGOTO SET4
MOVF COUNT, WXORLW 0×03; Включен 3 таймингBTFSC STATUS, ZGOTO SET8
MOVF COUNT, WXORLW 0×04; Включен 4 таймингBTFSC STATUS, ZGOTO SET15
MOVF COUNT, WXORLW 0×05; Включен 5 таймингBTFSC STATUS, ZGOTO SET30
MOVF COUNT, WXORLW 0×06; Включен 6 таймингBTFSC STATUS, ZGOTO SET1M
GOTO SET2M; Включен 7 тайминг
SET2 MOVLW 0×02GOTO TIME
SET4 MOVLW 0×04GOTO TIME
SET8 MOVLW 0×08GOTO TIME
SET15 MOVLW 0×0FGOTO TIME
SET30 MOVLW 0×1EGOTO TIME
SET1M MOVLW 0×3CGOTO TIME
SET2M MOVLW 0×78GOTO TIME
TIME MOVWF COUNTLP3 CALL DEL_1S
DECFSZ COUNT, FGOTO LP3
GOTO LP1
END