Ну подскажите люди добрые суть проблемы:
к МК подключена клавиатура 4х4 , с PD5 ПОСРЕДСТВОМ КЛАВИАТУРЫ задается выходное напряжение через RC цепочку до 9 вольт в принципе без проблем, а далее
требуется при нажатии клавиши 1 и 0 , на выходе должно 10, если 0 и 1 соответственно 0,1 и т.д. т.е от 0,1 до 30 посредством чего ума пока не приложу, может кто нечто подобное делал или где может ссылкой поделитесь...
$crystal = 16000000
$regfile = "m32def.dat"
'*******************************************************************************
' Конфигурация
'*******************************************************************************
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Int1 = Falling 'INT0 - по заднему фронту
Config Portd.5 = Output
Config Portd.3 = Input
Set Portd.3
Key_1 Alias Portd.3
'*******************************************************************************
' Переменные
'*******************************************************************************
'Dim Keycodes(12) As Byte
Dim Wtime As Byte 'время задержки
Dim Keycoderow As Byte 'код строки &B
Dim Keycodecol As Byte 'код столбца &B
Dim Keycode As Byte 'код позиции в таблице Keycodes
Dim Keychar As String * 2 'код кнопки (номер нажатой кнопки)
Dim U As Byte
Dim Temp As Byte
Dim Temp2 As Byte
Const Debouncetime = 15 'Задаем константу 150 мс
'*******************************************************************************
' обьявление процедур
'
'*******************************************************************************
Declare Sub U_i_set() ''
Declare Sub Isobra()
'*******************************************************************************
'*******************************************************************************
' начало прграммы
'*******************************************************************************
Enable Interrupts 'разрешить все прерывания
Enable Int1 'разрешить внешнее прерывание 0
On Int1 Button 'вектор внешнего прерывания 0
Ddrb = &B11110000 'старшая половина порта на выход, младшая - на вход
Portb = &B00001111 'установим высокий уровень по входу
Wtime = 255 'Задержка 255 мс
Start Adc
'------------------------основной цикл программы------------- ------------------
Maincicle:
Do
Call U_i_set ' установка напряжения и тока
Call Isobra ' вывод изображения
Loop
End
'-------------------------------------------------------------------------------
' процедуры
'-------------------------------------------------------------------------------
'*********************подпрогр установки ШИМ напряж и тока**********************
Sub U_i_set()
Pwm1a = U
Select Case Keycode 'Начинаем выбор переменной Keycode
Case 0 : U = 20 '1 '10V-204 Если Keycode = 0, U равен 20
Case 1 : U = 41 '2'20V-408
Case 2 : U = 61 '3'30V-613
Case 4 : U = 82 '4'817
Case 5 : U = 102 '5'1023
Case 6 : U = 123 '6
Case 8 : U = 143 '7
Case 9 : U = 164 '8
Case 10 : U = 184 '9
Case 13 : U = 0 '10
End Select
End Sub
'*******************************************************************************
Wej1:
Do
If Key_1 = 0 Then
Waitms 1 : If Key_1 = 1 Then Goto Wej1 ' Защита от помехи
'Led = 1
Temp2 = 0
If Key_1 = 0 Then
For Temp = 0 To 250
Incr Temp2 : If Temp2 > 214 Then Goto Dolgoe_uderzhanie ' На долгое удержание
If Key_1 = 1 Then Exit For ' Выходим из цикла подсчета времени удержания кнопки
Waitms 14
Next
End If
For Temp = 0 To 99 ' Проверка на нажатие кнопки второй раз
If Key_1 = 0 Then Goto Dvojnoe_nazhatie
Waitms 2
Next
Goto Odinochnoe_nazhatie ' Одиночное нажатие
'Led = 0
End If
My_end:
Waitms 100
Loop
Odinochnoe_nazhatie:
Goto U_i_set
Dvojnoe_nazhatie:
Dolgoe_uderzhanie:
'*************************подпрграмма вывода на дисплей*************************
Sub Isobra()
Cursor Off
Locate 1 , 1
Lcd Keychar
End Sub
'***************** подпрограмма обработки прерывания клавиатуры ***************
Button:
Keycoderow = Pinb 'опросим ноги порта B и определим, на которой низкий уровень
Waitms Debouncetime 'задержка 150 мс
'---------- поменяем назначение входов/выходов половин порта ------------------
Ddrb = &B00001111 'старшая половина порта на вход, младшая - на выход
Portb = &B11110000 'установим высокий уровень по входу
Waitms 1 'выждем антидребезг
Keycodecol = Pinb 'определим, в каком столбце низкий уровень
'---------------- вернем состояние порта к первоначальному ---------------------
Ddrb = &B11110000 'старшая половина порта на выход, младшая - на вход
Portb = &B00001111 'установим высокий уровень по входу
'------------ получим код клавиши исходя из полученных значений ----------------
Select Case Keycoderow 'Выбрать действие в зависимости от
Case 7 : Keycode = 12 'значения переменной Keycoderow
Case 11 : Keycode = 8 'находим в какой позиции строки нажата клавиша
Case 13 : Keycode = 4
Case 14 : Keycode = 0
Case Else : Keycode = 99
End Select
Shift Keycodecol , Right , 4 'считываем позицию из столбца, возвращаем символы строки справа
Select Case Keycodecol
Case 7 : Keycode = Keycode + 3
Case 11 : Keycode = Keycode + 2
Case 13 : Keycode = Keycode + 1
Case 14 : Keycode = Keycode + 0
Case Else : Keycode = Keycode + 99
End Select
'------------------- неверный код клавиши из-за дребезга... -------------------
If Keycode > 15 Then Keycode = 16 'при дребезге отображаем "?"
Keychar = Lookupstr(keycode , Keycodes) 'находим номер нужной кнопки
'Возвращает значение из таблицы строковых данных (keycode , Keycodes)
Gifr = 64 'сотрем дребезговое прерывание 0 из регистра Gifr
Return
End
'*******************************************************************************
'Преобразование кода клавиши в соответствующий символ находится в блоке данных Keycodes.
'Если в вашей клавиатуре иное расположение клавиш, достаточно изменить блок данных.
'*******************************************************************************
Keycodes:
Data "1" , "2" , "3" , "A" , "4" , "5" , "6" , "B" ,
Data "7" , "8" , "9" , "C" , "R" , "0" , "E" , "D" , "?"
'Restore Keycodes 'Указать блок DATA для считывания оператором READ
'For Keycode = 1 To 12 'Определение цикла с переменным параметром
'Read Keycodes(keycode) 'Считать данные из секции DATA
'Next KeycodeОтредактировано amv2000 (2011-05-11 13:43:08)