| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| 4x4 Keypad http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3637 |
Страница 1 от 2 |
| Автор: | Ки4о [ Пет Яну 26, 2007 9:04 pm ] |
| Заглавие: | 4x4 Keypad |
При четене на клавиатура 4х4 освен цифри от 0-9 има и букви А-F + още 2 бутона '#' и '*'.Когато се сканира клавиатурата при въвеждане на данни и едновременното им изобразяване се получават маймуници(правя го на PIC16 ) Това е част от кода: movf temp,0 ; вземане на стойността на бутона от клав. movwf hund_reg ;записване в съответния буфер addlw H'30' ; изобразяване на LCD movwf LCD_temp ; --//-- call Scan_KBD ; отново сканиране на клавиатура и така нататък Та ако си натиснал вместо 0 -> А или * се изписва нещо различно от цифра и после тава една боза..... Въпроса ми е:Когато се работи с буквено-цифрена клавиатура отделно ли се пишат подпрограми за сканиране или след всеки скан на клавиатурата се търси кой е клавиша,дали може той да бъде натиснат в това меню,... (стават много проверки,губи се памет).За момента съм го направил с идеята който натиска бутоните- знае какво прави |
|
| Автор: | Dimitar [ Пет Яну 26, 2007 9:32 pm ] | |||||||||
| Заглавие: | Re: 4x4 Keypad | |||||||||
Нещо немога да ти схвана мисълта за да ти отговоря за програмата, но когато правиш нещо никога не изхождай от презумцията, че който ще работи с него - ще знае какво да прави. Напротив даже - най-добрия тест за откриване на грешки в едно устройство е да го дадеш на някой, който идея си няма как работи. Когато ти си го тестваш - акъла ти никога няма да роди комбинация, която не е правилна - на тъпаците акъла им ражда какви ли не неща |
||||||||||
| Автор: | ToHu [ Пет Яну 26, 2007 9:42 pm ] | ||||||||||||||||||
| Заглавие: | Re: 4x4 Keypad | ||||||||||||||||||
Потвърден факт А относно питането .. нещо не схващам, call Scan_KBD вика функция, чийто резултат се записва във W регистъра, като се върнеш я ползваш директно, това ОК. Идеята до някъде е следната редполагам, на клавиш нула имаш нула, на клавиш 1 имаш едно ..... какво имаш на клавиш А ... защото към 1 добавящ 30 и става хекса, но ако за А връща 10, няма да получиш А, това едното, може би си го събразил. Освен това ако опресняването е на прекъсване, таймер да речем, може да чупиш W регистъра .... и не разбирам две неща 0-9, А-F са 16 бутона, освн ако не съм се объркал нещо .. тези * и # къде са вързани или не си 4х4 или а нщо не разбирам, за да е така триабва да е 3х6 18 бутона не 16. |
|||||||||||||||||||
| Автор: | fuser [ Пет Яну 26, 2007 10:44 pm ] |
| Заглавие: | Re: 4x4 Keypad |
защо не се обадиш да пием по нещо и да обсъдим проблема |
|
| Автор: | miro_atc [ Съб Яну 27, 2007 12:34 am ] | |||||||||
| Заглавие: | Re: 4x4 Keypad | |||||||||
Не знам при ПИК как е, но обикновено при другите процесорчета сканирането на клавиатура не е точно "подпрограма"... Но както и да си направил вече функцията за сканирането, щом работи няма значение... Само дето не мога да разбера какъв ти е проблема да си направиш функции примерно getchar() и getdigit() които викат твоята Scan_KBD() докато не бъде натиснат правилен клавиш и вместо скан-код ти връщат ASCI ? |
||||||||||
| Автор: | Ки4о [ Съб Яну 27, 2007 12:49 pm ] |
| Заглавие: | |
Проблема е следния - (явно не съм смогнал да обесня) - когато очакваме да е натиснат бутон за 5 ( примерно) а вместо това е натиснат # или някаква комбинация от клавиши на дисплея се изобразява друг символ.Temp ми е регистър от който се чете стойността на бутона натиснат от клавиатурата(след проверка дали действително е натиснат бутон,ако не е натиснат - чака се докато се натисне),добавя се към него Н'30' за да се получи ASCII стойността му и се праща към LCD-то за изобразяване . Ако след всяко натискане на бутон проверявам дали е буква,цифра,комбинация от буква/цифра отнема много време и памет.Ако се направят 3 подпрограми - една само цифрите да чете,една само буквите и една комбинациите става така че на някой места от програмата трябва да викам и трите подпрограми последователно защото може да искам да прекратя режим на въвеждане на данни (цифри) и да отида към друго меню.Тази програмя я пиша на асемблер а не на С и не мога да ползвам предложението на @miro. Клавиатурата е с 16 бутона-0,1,2,3,4,5,6,7,8,9,A,B,С,D,*,# ,Извинявам се за грешката по-горе * ми отговаря на Е,# на F.Когато получа стойността на бутона в temp,добавяйки Н'30' директно получавам ASCII а, * и # са ми Еsc и Ентер.Работата е там че като се сканира за число и не е натиснато числото а * например се получава 0x0E +0x30 -> друг аски символ. Силно съм се замислил над решението - сканирам за число и изход едновременно.Ако се подаде друга комбинация- програмата не реагира и си иска число или изход.Работата е че кода става тромав а търся по-елегантно решение.Надявам се да съм обяснил проблема дето ме човърка. @fuser, ще пием по бира но в момента съм много под пара,само малко да ми мине от главата и съм на линия |
|
| Автор: | Predator_MF [ Съб Яну 27, 2007 1:19 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
На тоя "проблем" със последните два символа "*" и "#" има много решения, сещам се за две най-прости в момента (тъй като пишеш на ASM) - 1. Правиш табличка със символите от клавиатурата 2. Два "if-a" на ASM проверяват специално за тези два знака И в двата случая ще ти е по-удобно, ако имаш функция "get_kbchar()" която да ти връща не ASCII кода на бутона, а поредния му номер. В първия случай правиш една табличка с ASCII кодовете на бутоните -
и с някаква малка функция (10-ина реда ми идват на ум още сега, но мисля че и сам ще се справиш) "kb_to_ascii()" обръщаш съответния натиснат бутон от число във ASCII. Във втория случай - IF на ASM се прави с 4 реда в PIC, не вярвам да се затрудниш особено да напишеш два IF-a които да проверяват дали номера на бутона е 14 или 15, ако не можеш, свиркай ще ти измислим код веднага. Другия ти проблем - искаш да изкарваш само "правилно" натиснати бутони (в примера ти като очакваш да е натиснат бутон 5 а е натиснат някакъв друг) - пак можеш да го решиш със проста табличка, в която елементите ще показват кои символи ще се показват на дисплея, пример:
С една функция проверяваш дали натиснатия бутон е някой от тези, ако не е, просто го игнорираш. Има варианти още много разбира се, не виждам какво обаче в тия функции ти се струва тромаво, микросекунда ли цепиш или FLASH-а не ти стига ?! |
|||||||||||||||||||
| Автор: | evc [ Съб Яну 27, 2007 1:41 pm ] | |||||||||
| Заглавие: | ||||||||||
Най-простичко си мисля ей така можеш да го направиш:
|
||||||||||
| Автор: | mndsl [ Съб Яну 27, 2007 1:54 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Човека пише програма на асемблер, а ти му даваш код на С! |
|||||||||||||||||||
| Автор: | evc [ Съб Яну 27, 2007 2:40 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
И през ум не ми е минавало да му пиша програмата, исках да му кажа, че преобразуването може да стане с проста таблица, но ето го преведено на асемблер тогава:
|
|||||||||||||||||||
| Автор: | Ки4о [ Съб Яну 27, 2007 3:06 pm ] |
| Заглавие: | |
Работат е там че работя с много таблици - и нещо мястото взе да не стига - проца е 16F877 но работата с таблици е удобна в банка0 от другите банки ако трябва да се четат таблици - става каша,не че не се оправям в нея,ама.. Правя го по втория начин - на менюта дето се искат само цифри и */#,останалото игнорирам и на менюта само с букви - игнорирам цифрите.Това го оправих преди малко и работи- Благодаря на всички дали съвети до сега Забозявам нещата като следя за комбинации от 2 натиснати клавиша едновременно Сега това ще го правя,но още нещо нямам идея точно как.Въпроса е как се прави това по принцип- кода сам ще си го напиша. |
|
| Автор: | evc [ Съб Яну 27, 2007 3:37 pm ] |
| Заглавие: | |
Аз лично избягвам да ползвам комбинации от два натиснати клавиша! Прави се като не прекъсваш сканирането при откриване на натиснат клавиш, а продължаваш до края. На твое място бих изхабил още един байт и бих връщал от подпрограмата за сканиране на клавиатурата два байта, като всеки бит от тях ще ми отговаря на съответния бутон - "1" - натиснат, "0" - отпуснат. Сканираш поредния бутон и ако е натиснат вдигаш кери флага и завърташ двата байта наляво. Ако не е натиснат - нулираш кери флага преди завъртането. Така 16 пъти за 16-те бутона. |
|
| Автор: | miro_atc [ Съб Яну 27, 2007 9:39 pm ] | |||||||||
| Заглавие: | ||||||||||
Стандартно се прави с клавиатурен драйвер... Вариант за "драйвер" е една функция която се вика през фиксиран интервал от време (10-20ms). Когато имаш прекъсване на пиновете (повечето процесори имат), прекъсване на кой да е клавиш стартира цикличното извикване на тая функция и забранявава следващи прекъвания от тия пинове. На всяко влизане функцийката сканира клавиатурата и тако докато се сканира че няма повече натиснати клавиши. Тогава циклличното извикване (по таймер) се изкллючва и се разрешава прекъсванията от клавиатурните пинове.... Функцийката си следи натиснитите клавиши и генерира кей-код за събития като "натиснат" клавиш, "отпуснат" клавиш и "садържан" клавиш и тия кодове се пъхат в малко fifo. Всеки код е само за един клавиш, но application-страната която вади от фифото може да следи за едновременно натиснати клавиши ако проверява за поредица применро НАТИСНАТ_А, НАТИСНАТ_В, ОТПУСНАТ_В, ОТУСНАТ_А... Хубавато на тая схема е че всичко зависи от приложението - ако иска се интересува от едновременно натиснати клавиши, а ако не иска не се интересува. Второто позволява да си бачка добре и при дефектен клавиш (задържал). Ето ти примерна функция, сорри че е на С, ама ако ти харесва идеята надявам се ще си я портнеш на асемблер:
Функията ползва 16 байта в която си брой дебонса на всеки клавиш и един int (16 бита) за състоянието на всеки клавиш.. |
||||||||||
| Автор: | Ки4о [ Съб Яну 27, 2007 10:08 pm ] |
| Заглавие: | |
Проблема го реших.Благодаря на всички отзовали се за съветите и сорсовете. |
|
| Автор: | fuser [ Нед Яну 28, 2007 6:47 pm ] |
| Заглавие: | |
сподели решението с нас ... няма да е лошо да го знаем!!! аз пък ползвам различни подпрограми към самият дисплей и когато се наложи да покажа цифра, буква или знак - минавам през съответната подпрограма. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|