Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.33 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <stdio.h>
  4. #include "lcd.h"
  5. #define F_CPU 16000000UL
  6. #include "avr\interrupt.h"
  7. //LCD_puts("________________|________________|--------________________|________________");
  8. //LCD_command(0b1); LCD törlés
  9.  
  10. char b, oszlop, sor, x, push, t[]= {1,2,3,4,5,6,7,8,9,10,0,11}; //10: * és 11: #
  11. int num, m, szintek = 4, akt, b1, k1, be[4], ki[4], bdb, kdb, ledek, led;
  12. extern void init_in_asm(void);
  13. extern void LED_out_in_asm(uint8_t);
  14. extern void seven_segment(uint8_t);
  15.  
  16. char GetInt(void) {
  17.     sor = 0;
  18.     while(1)
  19.     {                           //lenyomott bill-t keresünk 0…3 sorokban
  20.         PORTC=(1<<(sor+3));     //Aktív sor=1. PORTC6..3 biteken. 0b0xxx_x000 (6-3 bit kifelé)
  21.         _delay_ms(50);     //Fesz. szintek terjedéséhez
  22.         x=(~PINC)&7;            //A lenyomott=0 szintet ad (nyitja a tranyót), ezért negálok ~-el.
  23.         if (x) break;           //Találtam 1 db lenyomott billentyut
  24.         sor++;
  25.         if (sor == 4) sor = 0;
  26.     }
  27.     oszlop = 0;
  28.     while((x = x>>1)) oszlop++;    //oszlop=0,1,2  x=1,2,4 lehetett.
  29.     num = (int)t[3*sor+oszlop];       //Ahol t[] ascii kódokkal egy tömb.
  30.     return(num);
  31. }
  32.  
  33. void Inic() {   //ENGEDÉLYEZÉSEK
  34.     DDRB=0xF0;
  35.     DDRD=0xF0;
  36.     DDRC=0x78;
  37.     DDRA=0xFF;
  38. }
  39.  
  40. void Csekkol()
  41. {
  42.         k1 = -1;
  43.         b1 = -1;
  44.         for(int i = 0; i < szintek; i++)
  45.         {
  46.             if(ki[i] == 1)
  47.                 k1 = i;
  48.             if(be[i] == 1)
  49.                 b1 = i;
  50.         }          
  51. }
  52.  
  53. void InnenCsokkent(int belso)
  54. {
  55.     if(belso == 1 && be[akt] != 0)
  56.     {
  57.         for(int i = 0; i < szintek; i++)
  58.         {
  59.             if(be[i] > be[akt])
  60.                 be[i]--;
  61.         }
  62.         if(be[akt] > 0)
  63.         {
  64.             be[akt] = 0;
  65.             bdb--;
  66.         }
  67.     }
  68.     else if (belso == 0 && ki[akt] != 0)
  69.     {
  70.         for(int i = 0; i < szintek; i++)
  71.         {
  72.             if(ki[i] > ki[akt])
  73.                 ki[i]--;
  74.         }
  75.         if(ki[akt] > 0)
  76.         {
  77.             ki[akt] = 0;
  78.             kdb--;
  79.             ledek=(ledek-(0b00010000<<akt));
  80.         }
  81.     }
  82. }
  83.  
  84. void Kiszall()
  85. {
  86.     if(be[akt] > 0)
  87.     {
  88.         LCD_command(0b1);
  89.         LCD_puts("kiszall");
  90.         GetInt();
  91.         InnenCsokkent(1);
  92.     }
  93. }
  94.  
  95. void LiftMozgas()
  96. {
  97.     if((k1 != -1 && akt < k1) || (b1 != -1 && akt < b1))
  98.     {
  99.         akt++;seven_segment(akt);
  100.             LCD_command(0b1);
  101.                 LCD_puts("fel");
  102.         if(ki[akt] > 0 || be[akt] > 0)
  103.         {
  104.        
  105.             LCD_puts(" es nyit");
  106.             GetInt();
  107.         }
  108.     }
  109.     else if((k1 != -1 && akt > k1) || (b1 != -1 && akt > b1))
  110.     {
  111.         akt--;seven_segment(akt);
  112.         LCD_command(0b1);
  113.         LCD_puts("le");
  114.         if(ki[akt] > 0 || be[akt] > 0)
  115.         {
  116.            
  117.             LCD_puts(" es nyit");
  118.             GetInt();
  119.         }
  120.     }
  121.     else
  122.     {
  123.         LCD_command(0b1);
  124.         LCD_puts("itt nyit");
  125.         GetInt();
  126.     }
  127.    
  128.     Kiszall();
  129.     Beszall();
  130. }
  131.  
  132. void Lift()
  133. {
  134.     while(1)
  135.     {
  136.         KulsoBekeres();
  137.         Csekkol();
  138.         LiftMozgas();
  139.     }
  140. }
  141.  
  142. void Beszall()
  143. {
  144.     kiir();
  145.     m = 0;
  146.     while(m != 11)
  147.     {
  148.         LCD_command(0b1);
  149.         LCD_puts("belso: ");
  150.         m = GetInt();
  151.         if(m < 4 && be[m] == 0)
  152.             be[m] = ++bdb;
  153.     }
  154.     InnenCsokkent(0);
  155. }
  156.  
  157. /*LedCsekk(){
  158.  for(i=0;i<szintek;i++){
  159.   if(ki[i]>0)
  160.   ledek=(ledek-(0b00010000<<akt));
  161.  }
  162. }*/
  163.  
  164. void LCD_puts(char *s)
  165. {
  166.     while(*s) LCD_data(*s++);
  167. }
  168.  
  169. char Button(void)          
  170. {
  171.     push = PING;                                    //push - globális változó
  172.     return(push);
  173. }
  174.  
  175. void KulsoBekeres()
  176. {
  177.     char indit;
  178.     LCD_command(0b1);
  179.     LCD_puts("kulso:");
  180.     do
  181.     {
  182.         do
  183.         {
  184.             b = Button();
  185.         }while(b == NULL);
  186.         if(b != NULL && b < 9)
  187.         {
  188.             indit='1';
  189.             LCD_command(0b1);
  190.             switch(b)
  191.             {
  192.                 case 1:
  193.                     LCD_command(0b1);
  194.                     if(ki[0] > 0) break;
  195.                         ledek=ledek+0b00010000;
  196.                     LCD_puts("fsz");
  197.                     ki[0]=++kdb; break;
  198.                 case 2:
  199.                     LCD_command(0b1);
  200.                     if(ki[1] > 0) break;
  201.                         ledek=ledek+0b00100000;
  202.                     LCD_puts("1.em");
  203.                     ki[1]=++kdb; break;
  204.                 case 4:
  205.                     LCD_command(0b1);
  206.                     if(ki[2] > 0) break;
  207.                         ledek=ledek+0b01000000;
  208.                     LCD_puts("2.em");
  209.                     ki[2]=++kdb; break;
  210.                 case 8:
  211.                     LCD_command(0b1);
  212.                     if(ki[3] > 0) break;
  213.                         ledek=ledek+0b10000000;
  214.                     LCD_puts("3.em");
  215.                     ki[3]=++kdb; break;
  216.                 default: break;
  217.             }  
  218.         indit = GetInt();
  219.         }
  220.         else if( b == 16)
  221.         {
  222.             indit = 11;
  223.         }
  224.     }while(indit != 11);
  225.     LCD_command(0b1);
  226.     LED_out_in_asm(ledek);
  227.  
  228.  }
  229.  
  230.  
  231. void kiir(){
  232. unsigned char s[81];
  233. LCD_command(0b1);
  234. sprintf(s,"%d,%d,%d,%d         %d,%d,%d,%d",ki[0],ki[1],ki[2],ki[3],be[0],be[1],be[2],be[3]);
  235. LCD_puts(s);
  236. GetInt();
  237. }
  238.  
  239. int main()
  240. {
  241.     LCD_init();
  242.     init_in_asm();
  243.  
  244.     Inic();
  245.     Lift();
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement