; Регулятор мощности на PIC16F628A, 10 уровней регулировки			             ;
; Индикация светодиодная, 2 кнопки для повышения и понижения уровня. 			 ;
;--------------------------------------------------------------------------------;
; Усолье-Сибирское, Март 2009, Гаврилов Антон ra0sms@bk.ru        		      	 ;
; 							 ;	 
;--------------------------------------------------------------------------------;
			LIST		p=16F628A   ; Внутренний генератор, Порты RA6 RA7 работают
									; как цифровые порты, WDT выключен,
			__CONFIG	03F19H		; Бит защиты не установлен
;------------------------------------------------------------------------------------;									
Status		equ		03h	            ; Установка регистров специального назначения
OptionR		equ		01h	            ; --//--	
PortA	    equ	    05h	            ; --//--
PortB	    equ	    06h	            ; --//--
TrisA	    equ	    05h	            ; --//--
TrisB	    equ	    06h	            ; --//--
PC  	    equ	    02h	            ; --//--
VRCON       equ     1Fh             ; Источник опорного U.
CMCON       equ     1Fh             ; Модуль компараторов.
T1CON       equ     10h             ; Таймер TMR1.
T2CON       equ     12h             ; Таймер TMR2.
CCP1CON     equ     17h             ; Модуль CCP.
RCSTA       equ     18h             ; Модуль USART.
EEData		equ		9Ah
EEAdr		equ		9Bh
EECon1		equ		9Ch	
EECon2		equ		9Dh
INTCON		equ		0Bh
;------------------------------------------------------------------------------------;		
Per	        equ	    7Fh	            ; Регистр количества периодов		
Pwr	        equ	    70h	            ; Регистр уроня мощности
Reg_1	    equ	    71h	            ; Регистр для формирования задержки
Reg_2	    equ	    72h             ; --//--
;------------------------------------------------------------------------------------;
F	        equ	    1	            ; Запись в регистр
W	        equ	    0	            ; Запись в аккумулятор
RP0	        equ	    5	            ; Выбор банка памяти
RP1	        equ	    6	            ; --//--
C1	        equ	    7           	; Выход компаратора
Out	        equ	    7	            ; Выходной порт
Plus	    equ	    5	            ; Порт на кнопку увеличения мощности
Minus	    equ     4           	; Порт на кнопку понижения мощности
Z	        equ	    2	            ; Флаг Z
RD			equ		0
WR			equ		1
WREN		equ		2
GIE			equ		7
;------------------------------------------------------------------------------------;
			org		2100h
			de		06h
            org		0
	        goto	Start
;-------------------------------- Начало программы ----------------------------------;
; RA4 - кнопка -; RA5 - кнопка +; RB0-RB7, RA6,RA7 - на выход;
;------------------------------------------------------------------------------------;
Start	    bsf 	    Status,RP0	; Выбор банка памяти   
            bcf     	Status,RP1 	; --//-- 
            clrf	    VRCON		; Откл. ИОП	
        	clrf	    TrisB		; Все порты В на выход
        	movlw	    b'00110000'	; Порты  RA4, RA5 на вход
        	movwf	    TrisA		; остальные выход
        	bcf      	Status,RP0
        	clrf       	RCSTA       ; Отключение USART.
            clrf       	T1CON       ; ----"----  TMR1.
            clrf       	T2CON       ; ----"----  TMR2.
            clrf       	CCP1CON     ; ----"----  CCP.
        	movlw		b'00000111'	; Откл. Компаратор 
        	movwf		CMCON		; --//--
            clrf        PortB
	        call		Read		; Установка начального уровня мощности 
Opros   	bcf			Status,Z	
        	btfsc		PortA,Plus	; Опрос кнопки повышения
	        goto		Minys		; Если не нажата переходим к опросу кнопки понижения
            call        Pse55
            call        Pse55
            btfsc		PortA,Plus	; Предотвращение дребезга контактов
            goto        Minys
	        incf		Pwr,F		; Если нажата, увеличиваем уровень мощности
	        movlw		.11			; Проверка на достижение максимума
	        subwf		Pwr,W		; --//--
	        btfss		Status,Z	; --//--
			goto		$+3			; Если нет, переходим к опросу кнопки понижения
			movlw		.10			; Если да, остаемся на максимуме, мощность не увеоичиваем
			movwf		Pwr			; --//--
			call		Write
Minys   	bcf			Status,Z
			btfsc		PortA,Minus	; Опрос кнопки понижения мощности
            goto        Go
            call        Pse55
            call        Pse55
	        btfsc		PortA,Minus	; Опрос кнопки понижения мощности
            goto        Go
			decf		Pwr,F       ; Если нажата, уменьшаем уровень мощности
		    movlw       .3
            subwf       Pwr,W
			btfss		Status,Z	; Проверка на достижение минимума
			goto		$+3			; Если нет, то переходим к формированию импульсов
			movlw		.4			; Если да, то уменьшение не происходит
			movwf		Pwr			; остаемся на минимальном уровне
			call		Write
Go			movf		Pwr,W	
			addwf		PC,F		; Переход на формирование импульсов для выбранного уровня мощности
			nop		
            nop
            nop
            nop			
			goto		Pwr4		; 40% от максимума
			goto		Pwr5		; 50% от максимума
			goto		Pwr6		; 60% от максимума
			goto		Pwr7		; 70% от максимума
			goto		Pwr8		; 80% от максимума
			goto		Pwr9		; 90% от максимума
			goto		Pwr10		; 100% от максимума
;------------------------------------------------------------------------------------;
Pse1        movlw       .1
            movwf       Reg_1
            movlw       .0
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3
            return
Pse9        movlw       .175
            movwf       Reg_1
            movlw       .12
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3
            return
Pse91       movlw       .45
            movwf       Reg_1
            movlw       .119
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3         
			return					; --//--
Pse82       movlw       .125
            movwf       Reg_1
            movlw       .107
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3         	
			return					; --//--
Pse73       movlw       .205
            movwf       Reg_1
            movlw       .95
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3         	
			return			
Pse64       movlw       .28
            movwf       Reg_1
            movlw       .84
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3         	
			return			
Pse55       movlw       .108
            movwf       Reg_1
            movlw       .72
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3         	
			return				
Pse46       movlw       .188
            movwf       Reg_1
            movlw       .60
            movwf       Reg_2
            decfsz      Reg_1, F
            goto        $-1
            decfsz      Reg_2, F
            goto        $-3         	
			return	
Read		bsf			Status,RP0
			bcf			Status,RP1
			movlw		.0
			movwf		EEAdr
			bsf			EECon1,RD
			movf		EEData,W
			movwf		Pwr
			bcf			Status,RP0
			return
Write		bsf         Status,RP0                                  
            movlw       .0           
            movwf       EEAdr                                          
            movf        Pwr,W       
            movwf       EEData                               
            bsf         EECon1,WREN 
	        bcf         INTCON,GIE  
            movlw       55h         
            movwf       EECon2      
            movlw       0AAh        
            movwf       EECon2     
			bsf         EECon1,WR
			btfsc       EECon1,WR   
            goto        $-1
			bcf         EECon1,WREN 
	        bsf         INTCON,GIE  
            bcf         Status,RP0  
			return
Pwr9		movlw		b'11111111'	; Подпрограмма для 90% мощности
			movwf		PortB		; Светодиодная индикация
			bsf			PortA,0
			bcf			PortA,3
            bcf			PortA,Out	; --//--
			call		Pse9
			bsf			PortA,Out	; Формирования выходных импульсов
			call		Pse91		; --//--	
			goto		Opros		; Переход к опросу кнопок
Pwr8		movlw		b'11111111'	; Подпрограмма для 80% мощности
			movwf		PortB		; Светодиодная индикация
			bcf			PortA,0
			bcf			PortA,3
			bcf			PortA,Out	; Формирования выходных импульсов
			call		Pse9
            call		Pse9		; --//--
			bsf			PortA,Out	; --//--
			call		Pse82		; --//--
			goto		Opros		; Переход к опросу кнопок
Pwr7		movlw		.3			; Подпрограмма для 70% мощности
			movwf		Per
			movlw		b'01111111'
			movwf		PortB		; Светодиодная индикация
     		bcf			PortA,0
			bcf			PortA,3
			bcf			PortA,Out	; Формирования выходных импульсов
			call		Pse9	
            call		Pse9
            call		Pse9
			bsf			PortA,Out	; --//--
			call		Pse73		; --//--
			goto		Opros		; Переход к опросу кнопок
Pwr4		movlw		.4			; Подпрограмма для 40% мощности
			movwf		Per
			movlw		b'00001111'
			movwf		PortB		; Светодиодная индикация
    		bcf			PortA,0
			bcf			PortA,3
			bcf			PortA,Out	; Формирования выходных импульсов
			call		Pse1	
			goto		Opros		; Переход к опросу кнопок	
Pwr6		movlw		.4			; Подпрограмма для 60% мощности
			movwf		Per
			movlw		b'00111111'
			movwf		PortB		; Светодиодная индикация
metka6		bcf			PortA,0
			bcf			PortA,3
			bcf			PortA,Out	; Формирования выходных импульсов
			call		Pse9	
            call		Pse9
            call		Pse9
            call		Pse9
			bsf			PortA,Out	; --//--
			call		Pse64		; --//--
			goto		Opros		; Переход к опросу кнопок
Pwr5		movlw		.4			; Подпрограмма для 50% мощности
			movwf		Per
			movlw		b'00011111'
			movwf		PortB		; Светодиодная индикация
metka5		bcf			PortA,0
			bcf			PortA,3
			bcf			PortA,Out	; Формирования выходных импульсов
			call		Pse9
            call		Pse9
            call		Pse9
            call		Pse9
            call		Pse9
            call		Pse9
            call		Pse9
			bsf			PortA,Out	; --//--
			call		Pse64		; --//--
			goto		Opros		; Переход к опросу кнопок
Pwr10		movlw		b'11111111'	; Подпрограмма для 100% мощности
			movwf		PortB		; Светодиодная индикация
			bsf			PortA,0
			bsf			PortA,3
			bsf			PortA,Out	; Формирования выходных импульсов
			call		Pse91	
			call		Pse9		; --//--
			goto		Opros		; Переход к опросу кнопок
			end
	