| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Индексиране на битове от променлива в CodevisionAVR http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4082 |
Страница 1 от 1 |
| Автор: | Ugeen [ Съб Апр 21, 2007 10:30 am ] |
| Заглавие: | Индексиране на битове от променлива в CodevisionAVR |
Колеги до сега не ми се беше налагало да правя проверка дали някой бит от променлива е 0 или 1 в C (CodevisionAVR).Още по-вече, че ми се налага да ползвам индекс който да указва номера на бита който ще проверявам. Примерно имам дефинирана променлива : unsigned char Temp; Искам да проверявам последователно всички битове (от 0-7) на клетка Temp като ползвам цикъл и индексно указване номера на бита посредством индекс i,като при всеки кръг от цикъла индекса да нараства (i++).По принцип целта ми е да хвана номера на бита в Temp които е "0".Някой има ли идея как да стане това? |
|
| Автор: | Ugeen [ Съб Апр 21, 2007 10:35 am ] |
| Заглавие: | |
Видях такъв ред за това ,но не върши работа.Какво е вашето мнение. if(Temp&(1<<i)==0) { .............. } |
|
| Автор: | Nikola Kirov [ Съб Апр 21, 2007 10:56 am ] | |||||||||
| Заглавие: | ||||||||||
трябва да работи. Тялото се изпълнява ако съответния бит е 0.
тялото се изпълнява ако съответния бит е 1 тези конструкции работят на всички компилатори без изключение |
||||||||||
| Автор: | danov [ Съб Апр 21, 2007 11:02 am ] | |||||||||
| Заглавие: | ||||||||||
А защо не ти върши работа? Точките ще се изпълнят само ако бит i е 0. П.П. Изпревариха ме |
||||||||||
| Автор: | Ugeen [ Съб Апр 21, 2007 11:03 am ] |
| Заглавие: | |
Пак ще пробвам да не би грешката да е другаде |
|
| Автор: | Ugeen [ Съб Апр 21, 2007 11:43 am ] |
| Заглавие: | |
За да е по-ясно мъча се да сканирам една клавиатура с 4 реда и 3 колони(телефонна).Вързана е на PORTC на една ATMEGA8.Битовете от 0-3 са изходи ,а от 4-6 са входове с повдигащи резистори.(RESET е програмиран като вход) flash char Keycodes[12]={'1','2','3','4','5','6','7','8','9','*','0','#'}; char Key; unsigned char row,col,tmp,wait; void Scankeypad(void) { for(row=0;row<4;row++) { PORTC=~(1<<row); delay_us(100); tmp=PORTC; for(col=0;col<3;++col) { if(tmp&(1<<col+4)==0) { i=((row*4)+col); Key=Keycodes[i]; goto Done; } } } Done: } Това е кода но не иска да ми пише в клетка Key и да го извежда на LCD-to.Този Proteus ли ме лъже,не мога да разбера. |
|
| Автор: | Nikola Kirov [ Съб Апр 21, 2007 12:00 pm ] |
| Заглавие: | |
Първо. Ти за AVR с Jtag не си ли чувал? Второ. Нали се сещаш че виртуалния секс не е като истинския. Работата с Proteus е точно като виртуалния секс. Трето. 1<<col+4 = (1<<col)+4 Четвърто това PORTC=~(1<<row); вдига всички битове на PORTC. Ти на този порт имаш още един свободен пин. Внимавай да не го ползваш за изход |
|
| Автор: | Ugeen [ Съб Апр 21, 2007 12:21 pm ] |
| Заглавие: | |
Съгласен съм с някои забележки ,но в ATMEGA8 ,PORTC е 7 bit.Преправих кода така,за да е по-сигурно.Намерих си и една грешка ,която е лош навик от PIC-овете. ( tmp=PORTC-грешно ,трябва да е tmp=PINC).Пак не иска да работи.При симулация ми дава на дисплея 1 и не реагира на бутоните въпреки че се виждат сините точки които обхождат редовете.Това col+4,показваше че четенето на колоните ще става от бит 4 нататък. void Scankeypad(void) { for(row=0;row<4;row++) { PORTC=0xff; PORTC&=~(1<<row); delay_us(100); tmp=PINC; for(col=0;col<3;++col) { i=col+4; if(tmp&(1<<i)==0) { i=((row*4)+col); Key=Keycodes[i]; goto Done; } } } Done: } |
|
| Автор: | danov [ Съб Апр 21, 2007 12:39 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
трябва да е:
или трябва да си оправиш Keycodes. |
|||||||||||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|