
; ***********************************************
; *   Программа управления шаговым двигателем	*
; * В.С.Яценков. Микроконтроллеры MicroCHIP.	*
; * Практическое руководство. стр.249-253	*
; ***********************************************
; назначение выводов в схеме
; RB1(7)  - кнопка вращения вправо
; RB2(8)  - кнопка вращения влево
; RB4(10) - выход В2
; RB5(ll) - выход В1
; RB6(12) - выход А2
; RB7(13) - выход A1

	list     p=16F84 
	include  p16f84a.inc

	__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


;*** базовые значения

Left	EQU 1 			; номер вывода кнопки "влево"
Right	EQU 2 			; номер вывода кнопки "вправо"
del	EQU 0xFF		; константа длительности задержки
INIT_A  EQU b'11111111'		; настройка порта А: все каналы на ввод
INIT_B	EQU b'00001111'		; настройка порта В: RB0-RB3 ввод, RB4-RB7 вывод
count	EQU 0x0C                ; переменная подпрограммы задержки
step    EQU 0x0D                ; счетчик номера текущего шага
org	0x00

;*** начальная инициализация
	clrf 	PORTA 		; очистили выходные защелки порта А
	clrf    PORTB		; и порта В
	bsf STATUS, RP0		; включили банк 1
	movlw   INIT_A 		;
	movwf   PORTA 		; настроили PORT A
	movlw   INIT_B 		;
	movwf   PORTB		; настроили порт В
	bcf OPTION_REG,7	; включили встроенную нагрузку
	bsf STATUS, RP0		; включили банк 0
	clrf    step		; обнуляем переменную step
	clrw                    ; при включении фиксируем
	call    Table           ; ротор двигателя
	movwf   PORTB		; в положении нулевого шага

main 	call    delay           ; формирование задержки
	call    delay	        ; (временного интервала между шагами)

;*** опрос кнопки "Вправо" и обработка нажатия
Rights	btfsc PORTB, Right 	; если Right=0, выполнить шаг вправо
	goto	LeftS           ; иначе перейти на LeftS
	incf    step,f         ; step=step+l
	movlw 	4
	subwf 	step,w
	btfsc  	STATUS,C       	; если step>3,
	clrf    step            ; установить step=0
	movf 	step,w         ; иначе
	call    Table           ; перекодировать номер шага в выходной
				; код
	movwf   PORTB        	; выставить новые значения на выводах
	goto    main 

;*** опрос кнопки "Влево" и обработка нажатия
LeftS 	btfsc   PORTB, Left     ; если Left=0, выполнить шаг влево
	goto   main             ; иначе перейти на метку main
	decf   step,f          ; step=step-1 movlw .3
	btfsc  step,7          ; если step<0,
	movwf  step              ; установить step=3
	movf   step,w            ; иначе
	call   Table           ; перекодировать номер шага в выходной
				; код
	movwf PORTB           	; выставить новые значения на выводах 
	goto   main

;*** таблица перекодировки номера шага в уровни на выводах порта 
Table 	addwf   PCL,f
	retlw  	b'01010000'
	retlw 	b'01100000'
	retlw  	b'10100000'
	retlw  	b'10010000'

;*** подпрограмма формирования задержки между шагами 
delay 	movlw   del
	movwf 	count 
loop   	decfsz  count,f
	goto	loop
	return
	END