<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=6143&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-02-25T22:19:41+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6143&amp;mode</id>
<entry>
<author><name><![CDATA[Rychu]]></name></author>
<updated>2014-02-25T22:19:41+01:00</updated>
<published>2014-02-25T22:19:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72062#p72062</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72062#p72062"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72062#p72062"><![CDATA[
Tam wystarczy przerzucić &quot;return&quot; w funkcji skan_klawiatury przed ostatni nawias klamrowy i działa, przynajmniej u mnie.<br /><br />Ale nie do końca bo cały czas mruga dioda pod PD7.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3113">Rychu</a> — 25 lut 2014, o 22:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-25T21:58:04+01:00</updated>
<published>2014-02-25T21:58:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72057#p72057</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72057#p72057"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72057#p72057"><![CDATA[
Przerobiłem troszkę ten program i jakoś działa.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define k1 (1&lt;&lt;PD0)<br />#define k2 (1&lt;&lt;PD1)<br />#define k3 (1&lt;&lt;PD2)<br /><br />#define w1 (1&lt;&lt;PC5)<br />#define w2 (1&lt;&lt;PC4)<br />#define w3 (1&lt;&lt;PC3)<br />#define w4 (1&lt;&lt;PC2)<br /><br />#define LED0 (1&lt;&lt;PB6)<br />#define LED1 (1&lt;&lt;PB7)<br />#define LED2 (1&lt;&lt;PD5)<br />#define LED3 (1&lt;&lt;PD6)<br />#define LED4 (1&lt;&lt;PD7)<br />#define LED5 (1&lt;&lt;PB0)<br />#define LED6 (1&lt;&lt;PD3)<br />#define LED7 (1&lt;&lt;PD4)<br />uint8_t skan_klawiatury(unsigned char kolumna1, unsigned char kolumna2, unsigned char kolumna3,unsigned char wiersz1,unsigned char wiersz2,unsigned char wiersz3,unsigned char wiersz4);<br /><br />int main(void)<br />{<br />// klawiatura<br />DDRD |=k1|k2|k3;   // kolumny klawiatury jako wyjścia<br />PORTD |= k1|k2|k3;  // stan wysoki na kolumnach<br /><br />DDRC &amp;=~ (w1|w2|w3|w4); // wiersze klawiatury jako wejścia<br />PORTC |= w1|w2|w3|w4; // podpięte do Vcc<br /><br />// ledy<br />DDRB |=LED0|LED1|LED5;  // piny ledów jako wyjście<br />DDRD |=LED2|LED3|LED4|LED6|LED7;<br /><br />PORTB |=LED0|LED1|LED5;  // stan wysoki na ledach (wyłączone)<br />PORTD |=LED2|LED3|LED4|LED6|LED7;<br /><br /><br />while(1)<br />{<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 1 )<br />{PORTB ^=LED0; _delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 2 )<br />{PORTB ^=LED1;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 3 )<br />{ PORTD ^=LED2;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 4 )<br />{PORTD ^=LED3;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 5 )<br />{ PORTD ^=LED4;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 6 )<br />{PORTB ^=LED5;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 7 )<br />{ PORTD ^=LED6;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 8 )<br />{ PORTD ^=LED7;_delay_ms(1000);}<br /><br />}<br />}<br /><br /><br />uint8_t skan_klawiatury(unsigned char kolumna1, unsigned char kolumna2, unsigned char kolumna3,<br />unsigned char wiersz1,unsigned char wiersz2,unsigned char wiersz3,unsigned char wiersz4)<br />{<br />uint8_t i, a=0;<br /><br />for(i=1;i&lt;=3;i++)<br />{<br />PORTD |= k1|k2|k3;<br /><br />if(i==1)PORTD &amp;=~kolumna1;   // stan niski na 1 kolumnie<br />else if(i==2) PORTD &amp;=~kolumna2; // stan niski na 2 kolumnie<br />else if(i==3) PORTD &amp;=~kolumna3; // stan niski na 3 kolumnie<br />asm(&quot;nop&quot;);<br /><br />if(i==1 &amp;&amp; !(PINC &amp; wiersz1)) a=2;<br />if(i==1 &amp;&amp; !(PINC &amp; wiersz2)) a=5;<br />if(i==1 &amp;&amp; !(PINC &amp; wiersz3)) a=8;<br />if(i==2 &amp;&amp; !(PINC &amp; wiersz1)) a=3;<br />if(i==2 &amp;&amp; !(PINC &amp; wiersz2)) a=6;<br />if(i==2 &amp;&amp; !(PINC &amp; wiersz4)) a=1;<br />if(i==3 &amp;&amp; !(PINC &amp; wiersz1)) a=4;<br />if(i==3 &amp;&amp; !(PINC &amp; wiersz2)) a=7;<br /><br />}<br />return a;<br />}[/syntax]<br />Jednak ja bym zrobił skanowanie klawiatury w przerwaniu od jakiegoś timera co kilkanaście lub kilkadziesiąt ms.<br /><br /><br />A tak poza tym to w ten sposób nie zeruje się bitów [syntax=c]DDRC &amp;= ~w1&amp;w2&amp;w3&amp;w4; // wiersze klawiatury jako wejścia[/syntax]tylko w ten[syntax=c]DDRC &amp;=~ (w1|w2|w3|w4); // wiersze klawiatury jako wejścia[/syntax]<br /><br />I po co do funkcji skan_klawiatury przekazujesz tyle argumentów skoro wszystkie argumenty to stałe dosłowne i w każdym wywołaniu tej funkcji są takie same. W tym przypadku można by zrobić tak i też będzie działać<br />[syntax=c]while(1)<br />{<br />if (skan_klawiatury() == 1 )<br />{PORTB ^=LED0; _delay_ms(1000);}<br />if (skan_klawiatury() == 2 )<br />{PORTB ^=LED1;_delay_ms(1000);}<br />if (skan_klawiatury() == 3 )<br />{ PORTD ^=LED2;_delay_ms(1000);}<br />if (skan_klawiatury() == 4 )<br />{PORTD ^=LED3;_delay_ms(1000);}<br />if (skan_klawiatury() == 5 )<br />{ PORTD ^=LED4;_delay_ms(1000);}<br />if (skan_klawiatury() == 6 )<br />{PORTB ^=LED5;_delay_ms(1000);}<br />if (skan_klawiatury() == 7 )<br />{ PORTD ^=LED6;_delay_ms(1000);}<br />if (skan_klawiatury() == 8 )<br />{ PORTD ^=LED7;_delay_ms(1000);}<br /><br />}<br />}<br /><br /><br />uint8_t skan_klawiatury(void)<br />{<br />uint8_t i, a=0;<br /><br />for(i=1;i&lt;=3;i++)<br />{<br />PORTD |= k1|k2|k3;<br /><br />if(i==1)PORTD &amp;=~k1;   // stan niski na 1 kolumnie<br />else if(i==2) PORTD &amp;=~k2; // stan niski na 2 kolumnie<br />else if(i==3) PORTD &amp;=~k3; // stan niski na 3 kolumnie<br />asm(&quot;nop&quot;);<br /><br />if(i==1 &amp;&amp; !(PINC &amp; w1)) a=2;<br />if(i==1 &amp;&amp; !(PINC &amp; w2)) a=5;<br />if(i==1 &amp;&amp; !(PINC &amp; w3)) a=8;<br />if(i==2 &amp;&amp; !(PINC &amp; w1)) a=3;<br />if(i==2 &amp;&amp; !(PINC &amp; w2)) a=6;<br />if(i==2 &amp;&amp; !(PINC &amp; w4)) a=1;<br />if(i==3 &amp;&amp; !(PINC &amp; w1)) a=4;<br />if(i==3 &amp;&amp; !(PINC &amp; w2)) a=7;<br /><br />}<br />return a;<br />}[/syntax]<br />Chyba, że kolega ma jakiś inny plan co do tej funkcji i tylu argumentów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 25 lut 2014, o 21:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Demooon]]></name></author>
<updated>2014-02-25T18:24:14+01:00</updated>
<published>2014-02-25T18:24:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72025#p72025</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72025#p72025"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72025#p72025"><![CDATA[
Wprowadziłem poprawkę, jednak nadal działa tylko pierwsza kolumna, czyli funkcja zwraca mi tylko 1,4 lub 7<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2997">Demooon</a> — 25 lut 2014, o 18:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-25T18:20:01+01:00</updated>
<published>2014-02-25T18:20:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72024#p72024</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72024#p72024"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72024#p72024"><![CDATA[
Wydaje mi się, że błąd masz w tej części<br />[syntax=c]if(i==1)PORTD &amp;=~kolumna1;   // stan niski na 1 kolumnie<br />else if(i==2) PORTD &amp;=~kolumna2; // stan niski na 2 kolumnie<br />else if(i==3) PORTD &amp;=~kolumna3; // stan niski na 3 kolumnie[/syntax]<br />Bo najpierw piny kolumn mają ustawiony stan wysoki. Ale po przekręceniu się pierwszej pętli for na tych pinach jest już stan niski, który już wciąż się na nich utrzymuje. Poza tym podczas odczytu wierszy stan niski powinien być tylko na jednej kolumnie. <br /><br />Dlatego spróbuj może na początku pierwszej pętli for ustawiać na pinach kolumn stan wysoki po to żeby potem po ustawieniu na danej kolumnie stanu niskiego, ten stan był tylko na tej jednej kolumnie.<br />[syntax=c]for(i=1;i&lt;=3;i++)<br />        {<br />                PORTD |= k1|k2|k3;  // stan wysoki na kolumnach<br />                if(i==1)PORTD &amp;=~kolumna1;   // stan niski na 1 kolumnie<br />                else if(i==2) PORTD &amp;=~kolumna2; // stan niski na 2 kolumnie<br />                else if(i==3) PORTD &amp;=~kolumna3; // stan niski na 3 kolumnie[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 25 lut 2014, o 18:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[LogTeam]]></name></author>
<updated>2014-02-25T18:08:06+01:00</updated>
<published>2014-02-25T18:08:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72022#p72022</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72022#p72022"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72022#p72022"><![CDATA[
Bez przerwań też się da <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Można ten multipleks zrobić w pętli for. W sumie nie tylko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=738">LogTeam</a> — 25 lut 2014, o 18:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Demooon]]></name></author>
<updated>2014-02-25T17:56:47+01:00</updated>
<published>2014-02-25T17:56:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72019#p72019</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72019#p72019"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72019#p72019"><![CDATA[
Dziękuje za poradę ale wolałbym na początek bez przerwań/liczników itp. <br />Mógłby ktoś zerknąć okiem na kod, naprowadzić lub wskazać blędy?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2997">Demooon</a> — 25 lut 2014, o 17:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[LogTeam]]></name></author>
<updated>2014-02-25T15:14:44+01:00</updated>
<published>2014-02-25T15:14:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72000#p72000</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72000#p72000"/>
<title type="html"><![CDATA[Re: [C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=72000#p72000"><![CDATA[
Niech kolega popatrzy na ten sposób obsługi<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 19-01-2014<br /> *      Author: Kuba<br /> */<br /> <br />/*       P<br /> *    P  P  P<br /> *<br /> *    P  P  P<br /> *<br /> *    P  P  P<br /> *<br /> *    P  P  P<br /> *<br /> */<br /> <br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/delay.h&gt;<br /> <br />#include &quot;klawiaturka.h&quot;<br /> <br /> <br /> <br />int main (void)<br />{<br />        Timer0_init(); // inicjalizacja timera0<br /> <br />        //Piny odpowiadajace za odpowiednie kolumny (LINE) przyciskow<br />        DDRx_KEY &amp;= ~COLUMN1_PIN1 &amp; ~COLUMN2_PIN2 &amp; ~COLUMN3_PIN3 &amp; ~COLUMN4_PIN4; //Ustawienie pinow jako wejscia<br />        PORT_KEY |= COLUMN1_PIN1 | COLUMN2_PIN2 | COLUMN3_PIN3 | COLUMN4_PIN4; //Stan wysoki na kolumnach<br /> <br /> <br />        //Piny ktorymi multipleksuje<br />        DDRx_OUT |= KEY1_OUT1 | KEY2_OUT2 | KEY3_OUT3 | KEY4_OUT4;     //Ustawienie pinow jako wyjscia<br />        PORT_OUT |= KEY1_OUT1 | KEY2_OUT2 | KEY3_OUT3 | KEY4_OUT4;     //Stan wysoki na wersach<br /> <br /> <br />        //Diody<br />        DDRC |= (1&lt;&lt;PC0) | (1&lt;&lt;PC1) | (1&lt;&lt;PC2) | (1&lt;&lt;PC3) | (1&lt;&lt;PC4) | (1&lt;&lt;PC5) | (1&lt;&lt;PC6) | (1&lt;&lt;PC7);<br />        PORTC |= (1&lt;&lt;PC0) | (1&lt;&lt;PC1) | (1&lt;&lt;PC2) | (1&lt;&lt;PC3) | (1&lt;&lt;PC4) | (1&lt;&lt;PC5) | (1&lt;&lt;PC6) | (1&lt;&lt;PC7);<br /> <br /> <br />        sei(); //zezwolenie na globalne przerwania<br /> <br />        while(1)<br />        {<br />            //sprawdzanie ktory klawisz nacisniety<br />                        if (KEY_DOWN4) PORTC = ~(1&lt;&lt;PC0);<br />                        if (KEY_DOWN5) PORTC = ~(1&lt;&lt;PC1);<br />                        if (KEY_DOWN6) PORTC = ~(1&lt;&lt;PC2);<br />                        if (KEY_DOWN7) PORTC = ~(1&lt;&lt;PC3);<br />                        if (KEY_DOWN8) PORTC = ~(1&lt;&lt;PC4);<br />                        if (KEY_DOWN9) PORTC = ~(1&lt;&lt;PC5);<br />                        if (KEY_DOWN10) PORTC = ~(1&lt;&lt;PC6);<br />                        if (KEY_DOWN11) PORTC = ~(1&lt;&lt;PC7);<br />                        if (KEY_DOWN12) PORTC = ~(1&lt;&lt;PC7);<br /> <br />        }<br />}<br /> <br />////Multipleks dla rozbudowania kodu<br />ISR(TIMER0_COMP_vect)<br />{<br />        static uint8_t licznik = 0;<br /> <br /> <br />     if (licznik==1) VERS1_ON;              //gdy zmienna==1 utaw stan wysoki na PORT1<br />     if (licznik==2) VERS2_ON;              //gdy zmienna==2 ustaw stan wysoki na PORT2<br />     if (licznik==3) VERS3_ON;          //gdy zmienna==3 ustaw stan wysoki na PORT3<br />     if (licznik==4) VERS4_ON;            //gdy zmienna==4 ustaw stan wysoki na PORT4<br /> <br />     licznik ++;                                        //dodawanie licznika<br />     if(licznik&gt;4) licznik = 1;         // jeśli licznik większy niż 4 to ustaw na 1<br />}<br /> <br />void Timer0_init (void)<br />{<br />            // ustawienie TIMER0<br />                TCCR0 |= (1&lt;&lt;WGM01);                            // tryb CTC<br />                TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);         // preskaler 1024<br />                OCR0 = 130;                                                     // rejest przepełnienia - 130 - przerwanie wykonuje sie około 60 razy na sekundę<br />                TIMSK |= (1&lt;&lt;OCIE0);                            // zezwolenie na przerwanie CompareMatch<br />}[/syntax]<br /><br />[syntax=c]/*<br /> * klawiaturka.h<br /> *<br /> *  Created on: 19-01-2014<br /> *      Author: Kuba<br /> */<br /> <br />#ifndef KLAWIATURKA_H_<br />#define KLAWIATURKA_H_<br /> <br />//Definicje kolumn przyciskow<br />#define LINE1  !(PORT_KEY &amp; COLUMN1_PIN1)<br />#define LINE2  !(PORT_KEY &amp; COLUMN2_PIN2)<br />#define LINE3  !(PORT_KEY &amp; COLUMN3_PIN3)<br />#define LINE4  !(PORT_KEY &amp; COLUMN4_PIN4)<br /> <br />//Definicje do ktorych podlaczone sa kolumny przyciskow<br />#define COLUMN1_PIN1  (1&lt;&lt;PD0)<br />#define COLUMN2_PIN2  (1&lt;&lt;PD1)<br />#define COLUMN3_PIN3  (1&lt;&lt;PD2)<br />#define COLUMN4_PIN4  (1&lt;&lt;PD3)<br /> <br />//Definicje pomagajace przy ustawianiu portu<br />#define PORT_KEY  PIND<br />#define DDRx_KEY  DDRD<br /> <br />//Przyciski ktorymi bedziemy multipleksowac<br />#define VERS1_ON  PORT_OUT = ~KEY1_OUT1<br />#define VERS2_ON  PORT_OUT = ~KEY2_OUT2<br />#define VERS3_ON  PORT_OUT = ~KEY3_OUT3<br />#define VERS4_ON  PORT_OUT = ~KEY4_OUT4<br /> <br />//Definicje pinow do ktorych podlaczone sa piny multipleksu<br />#define KEY1_OUT1  (1&lt;&lt;PD4)<br />#define KEY2_OUT2  (1&lt;&lt;PD5)<br />#define KEY3_OUT3  (1&lt;&lt;PD6)<br />#define KEY4_OUT4  (1&lt;&lt;PD7)<br /> <br />//Definicje pomagajace sprawdzanie ktory przycisk wcisniety<br />#define M_PIN1  !(PIN_OUT &amp; KEY1_OUT1) //multipleks pin1<br />#define M_PIN2  !(PIN_OUT &amp; KEY2_OUT2) //multipleks pin2<br />#define M_PIN3  !(PIN_OUT &amp; KEY3_OUT3) //multipleks pin3<br />#define M_PIN4  !(PIN_OUT &amp; KEY4_OUT4) //multipleks pin4<br /> <br />//Definicje pomagajace przy ustawianiu portu<br />#define PORT_OUT  PORTD    //PORT multipleksu<br />#define PIN_OUT  PIND      //PIN multipleksu<br />#define DDRx_OUT  DDRD     //DDR multipleksu<br /> <br />//Definicje ktore pomoga przy sprawdzaniu warunkow, ktory klawisz nacisniety<br />#define KEY_DOWN1  (M_PIN1 &amp; LINE1)<br />#define KEY_DOWN2  (M_PIN2 &amp; LINE1)<br />#define KEY_DOWN3  (M_PIN3 &amp; LINE1)<br />#define KEY_DOWN4  (M_PIN1 &amp; LINE2)<br />#define KEY_DOWN5  (M_PIN2 &amp; LINE2)<br />#define KEY_DOWN6  (M_PIN3 &amp; LINE2)<br />#define KEY_DOWN7  (M_PIN1 &amp; LINE3)<br />#define KEY_DOWN8  (M_PIN2 &amp; LINE3)<br />#define KEY_DOWN9  (M_PIN3 &amp; LINE3)<br />#define KEY_DOWN10  (M_PIN1 &amp; LINE4)<br />#define KEY_DOWN11  (M_PIN2 &amp; LINE4)<br />#define KEY_DOWN12  (M_PIN3 &amp; LINE4)<br />#define KEY_DOWN13  (M_PIN2 &amp; LINE4)<br /> <br />//Inicjalizacja timera<br />void Timer0_init (void);<br /> <br />#endif /* KLAWIATURKA_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=738">LogTeam</a> — 25 lut 2014, o 15:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Demooon]]></name></author>
<updated>2014-02-25T15:10:23+01:00</updated>
<published>2014-02-25T15:10:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=71997#p71997</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=71997#p71997"/>
<title type="html"><![CDATA[[C]Atmega8A  Klawiatura Matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6143&amp;p=71997#p71997"><![CDATA[
Próbuję napisać program do skanowania klawiatury matrycowej 4x3. Korzystam z Atmega8A taktowana wewnętrzym oscylatorem 8MHz. Program ma zmienić stan pinu do którego podłączona jest dioda LEDx po naciśnięciu przycisku o numerze x.<br />Problem polega na tym że działa mi tylko pierwsza kolumna klawiatury, proszę o pomoc, wskazówkę, trop.<br />Oto mój kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#define k1 (1&lt;&lt;PD0)<br />#define k2 (1&lt;&lt;PD1)<br />#define k3 (1&lt;&lt;PD2)<br /><br />#define w1 (1&lt;&lt;PC5)<br />#define w2 (1&lt;&lt;PC4)<br />#define w3 (1&lt;&lt;PC3)<br />#define w4 (1&lt;&lt;PC2)<br /><br />#define LED0 (1&lt;&lt;PB6)<br />#define LED1 (1&lt;&lt;PB7)<br />#define LED2 (1&lt;&lt;PD5)<br />#define LED3 (1&lt;&lt;PD6)<br />#define LED4 (1&lt;&lt;PD7)<br />#define LED5 (1&lt;&lt;PB0)<br />#define LED6 (1&lt;&lt;PD3)<br />#define LED7 (1&lt;&lt;PD4)<br />uint8_t skan_klawiatury(unsigned char kolumna1, unsigned char kolumna2, unsigned char kolumna3,unsigned char wiersz1,unsigned char wiersz2,unsigned char wiersz3,unsigned char wiersz4);<br /><br />int main(void)<br />{<br />// klawiatura<br />DDRD |=k1|k2|k3;   // kolumny klawiatury jako wyjścia<br />PORTD |= k1|k2|k3;  // stan wysoki na kolumnach<br /><br />DDRC &amp;= ~w1&amp;w2&amp;w3&amp;w4; // wiersze klawiatury jako wejścia<br />PORTC |= w1|w2|w3|w4; // podpięte do Vcc <br /><br />// ledy<br />DDRB |=LED0|LED1|LED5;  // piny ledów jako wyjście<br />DDRD |=LED2|LED3|LED4|LED6|LED7;<br /><br />PORTB |=LED0|LED1|LED5;  // stan wysoki na ledach (wyłączone)<br />PORTD |=LED2|LED3|LED4|LED6|LED7; <br /><br /><br />    while(1)<br />    {<br />    if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 0 ) <br />{PORTB ^=LED0; _delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 1 ) <br />{PORTB ^=LED1;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 2 )<br />{ PORTD ^=LED2;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 3 ) <br />{PORTD ^=LED3;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 4 )<br />{ PORTD ^=LED4;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 5 ) <br />{PORTB ^=LED5;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 6 )<br />{ PORTD ^=LED6;_delay_ms(1000);}<br />if (skan_klawiatury(k1,k2,k3,w1,w2,w3,w4) == 7 )<br />{ PORTD ^=LED7;_delay_ms(1000);}<br />  <br />    }<br />}<br /><br /><br />uint8_t skan_klawiatury(unsigned char kolumna1, unsigned char kolumna2, unsigned char kolumna3,unsigned char wiersz1,unsigned char wiersz2,unsigned char wiersz3,unsigned char wiersz4)<br />{<br />uint8_t i,j,a;<br /><br />for(i=1;i&lt;=3;i++)<br />{<br />if(i==1)PORTD &amp;=~kolumna1;   // stan niski na 1 kolumnie<br />else if(i==2) PORTD &amp;=~kolumna2; // stan niski na 2 kolumnie<br />else if(i==3) PORTD &amp;=~kolumna3; // stan niski na 3 kolumnie<br />for(j=1;j&lt;4;j++)<br />{<br />if(i==1 &amp;&amp; !(PINC &amp; wiersz1)) a=1;<br />if(i==1 &amp;&amp; !(PINC &amp; wiersz2)) a=4;<br />if(i==1 &amp;&amp; !(PINC &amp; wiersz3)) a=7;<br />if(i==2 &amp;&amp; !(PINC &amp; wiersz1)) a=2;<br />if(i==2 &amp;&amp; !(PINC &amp; wiersz2)) a=5;<br />if(i==2 &amp;&amp; !(PINC &amp; wiersz4)) a=0;<br />if(i==3 &amp;&amp; !(PINC &amp; wiersz1)) a=3;<br />if(i==3 &amp;&amp; !(PINC &amp; wiersz2)) a=6;<br /><br /><br />return a;<br /><br />}<br /><br /><br />}<br /><br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2997">Demooon</a> — 25 lut 2014, o 15:10</p><hr />
]]></content>
</entry>
</feed>