Advertisement
Guest User

Untitled

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