'**************************************************************** '* Name : RotEncTest.pbp * '* Author : holyuser * '* Notice : Copyright (c) 2006 My Home Projects * '* : All Rights Reserved * '* Date : 10.7.2006 г. * '* Version : 1.0 * '* Notes : Експерименты с энкодером ED1112S-20 и PIC16F84A * '**************************************************************** ' ' ' Подключение ЖКИ: ' ЖКИ PIC ' DB4 PortA.0 ' DB5 PortA.1 ' DB6 PortA.2 ' DB7 PortA.3 ' RS PortA.4 (4.7K на Vdd) ' E PortB.3 ' RW PortB.2 ' Vdd 5 volts ' Vss GND ' Vo 20K потенциометр ' DB0-3 - DEFINE LCD_DREG PORTA DEFINE LCD_DBIT 0 DEFINE LCD_RSREG PORTA DEFINE LCD_RSBIT 4 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 3 DEFINE LCD_RWREG PORTB DEFINE LCD_RWBIT 2 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 define BUTTON_PAUSE 50 DEFINE USE_LFSR 1 oldstate var byte newstate var byte RPG_buffer var byte workvar var byte bank0 b0 var byte red var byte bank0 green var byte bank0 wsave var byte $20 system ssave var byte bank0 system psave var byte bank0 system 'двухцветный светодиод 'с общим катодом: redled var portb.4 'анод красного greenled var portb.5 'анод зеленого conform var portb.0 'кнопка энкодера power var portb.1 'NPN транзистор - база 'коллектор на катод светодиода myflags var byte action var myflags.0 maximum con 32 minimum con 0 goto start define INTHAND clock 'Обработчик прерывания asm clock ; сохранение контекста movwf wsave swapf STATUS,0 clrf STATUS ; Bank0 movwf ssave movf PCLATH,0 movwf psave ; начало btfss _redled goto green decfsz _red,F goto exit movf _workvar,W movwf _red movf _workvar,W sublw _maximum movwf _green bcf STATUS,Z movf _green,F btfsc STATUS,Z goto exit bcf _redled bsf _greenled goto exit green decfsz _green,F goto exit movf _workvar,W sublw _maximum movwf _green movf _workvar,W movwf _red bcf STATUS,Z movf _red,F btfsc STATUS,Z goto exit bcf _greenled bsf _redled exit bcf INTCON,T0IF ; восстановление контекста movf psave,W movwf PCLATH swapf ssave,W movwf STATUS swapf wsave,F swapf wsave,W retfie endasm start: oldstate = %11000000 RPG_buffer = 0 workvar = 16 : b0 = 0 : red = 16 : green = 16 myflags = 0 OPTION_REG = %01000000 pause 1000 lcdout $FE,1,#workvar 'очистка дисплея HIGH power HIGH redled output greenled TMR0 = 0 INTCON = %10100000 begin: newstate = portb & %11000000 'чтение энкодера if newstate = oldstate then continue RPG_buffer = RPG_buffer >> 2 'если есть изменение RPG_buffer = RPG_buffer | newstate 'загрузка в буффер select case RPG_buffer 'определение состояния буффера case %11010010 'закончен цикл вперед if workvar < maximum then workvar = workvar + 1 endif case %11100001 'закончен цикп назад if workvar > minimum then workvar = workvar - 1 endif case else 'цикл еще не закончен pause 1 end select oldstate = newstate gosub display continue: if conform = 0 then pause 10 if action = 1 then begin if power = 1 then low power else high power endif action = 1 else if action = 1 then pause 10 action = 0 endif endif goto begin display: lcdout $FE,1,#workvar return end