Блин!! Я уже мертвый!!! НЕ могу понять как работает код!!!
Вот код! @ DEVICE pic16F877, HS_OSC ; Наверно стоит XT_OSC, а это не высокочастотный кварц
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
define OSC 20
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
'-------------------------------------------------------------------------------
' Vareables
'-------------------------------------------------------------------------------
Flag var Byte 'Переменная выбора
Klav var Byte 'Номер кнопки
row var Byte '
'===============================================================================
'------------------------------------------------------ -------------------------
' Инициализация
'-------------------------------------------------------------------------------
'@ device WDT_OFF
ADCON1 = 7 'Все порты цифровые
ADCON0.0 = 0 'АЦП выключен
SSPCON.5 = 0 'Модуль SSP выкл., порты цифровые
TRISB = %00000111 'Порты 0..3 на вход
OPTION_REG=%00001000'On pull-up PORTB,прерывания по спаду RB0/INT,
OPTION_REG.7=0 'пределитель перед WDT
TRISA = %00000 'На выход
TRISC = %00000000 'На выход
'INTCON.7=0 'Disable interapt
INTCON = %10010000 'Разрешение внешнего прерывания
'pause 100 ' Wait for LCD to startup
Cls ' Clear the LCD
'*******************************************************************************
' MAIN
'-------------------------------------------------------------------------------
' Опрос кнопок
'-------------------------------------------------------------------------------
Vol var Byte
Vol=50
On Interrupt goto intRB0
press:
For row=0 To 3
PORTB= (DCD (row +4))^$ff 'Установка порта № строка+4 в 0
If PORTB.3=0 Then
pauseus 20
If PORTB.3=0 Then
Klav=row
GoTo klaviatura
EndIf
EndIf
If PORTB.2=0 Then
pauseus 20
If PORTB.2=0 Then
Klav=row +4
GoTo klaviatura
EndIf
EndIf
Next row
GoTo press
'Обработка переменной клавиатуры
klaviatura:
Lcdout $Fe, 1, "number key=", DEC1 Klav
GoTo press
'-------------------------------------------------------------------------------
' Обработка внешнего прерывания по входу порта В0
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Disable 'Запрешение прерываний перед обработчиком
intRB0:
'INTCON = %00000000 'Запрет прерываний битами
If PORTb.1=1 Then
PAUSE 50
If Vol=63 Then vih
Vol=Vol + 1
else
IF vol=0 Then VIH
PAUSE 50
vol=vol -1
EndIF
'Сюда можно вставить тестовые команды
Lcdout $Fe, $C0, "Volume=", DEC2 Vol
Vih:
INTCON = %10010000 'Разрешение внешнего прерывания и сброс флага
Resume
Enable 'Разрешение прерываний после обработчика
'-------------------------------------------------------------------------------
End
Когда добавляю pause работает чуток стабильнее, но только в одну строну (в -), а в плюс работает рывками, то +2, то -2.
Даташит энкодера ниже.
Я уже все варианты подключения перепробовал, так как не могу понять как работает код. Последний, более ли менее рабочий: A-PORTB.0, C-GROUNG, B-PORTB.1