Advertisement
lu4kedr

ledky

Oct 5th, 2016
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.45 KB | None | 0 0
  1. // Cviceni c. 2 - Multiplexni rizeni vicemistneho displeje
  2. #include "../avrkit/avrkit.h"
  3. #include <stdio.h>
  4. // umoznuje pouzivat registry jako promenne
  5. #include <avr/io.h>
  6.  
  7. // napiste funkci BCD za 1 bod
  8. unsigned char BCD(unsigned char vstup);
  9.  
  10. // funkce vrátí takovou hodnotu, která bude reprezentovat zobrazení zadaného čísla na segmentovém displayi
  11.  
  12. unsigned char BCD(unsigned char vstup)
  13. {
  14. if (vstup == 0)
  15. return 0x3F;
  16. if (vstup == 1)
  17. return 0x06;
  18. if (vstup == 2)
  19. return 0x5B;
  20. if (vstup == 3)
  21. return 0x4F;
  22. if (vstup == 4)
  23. return 0x66;
  24. if (vstup == 5)
  25. return 0x6D;
  26. if (vstup == 6)
  27. return 0x7D;
  28. if (vstup == 7)
  29. return 0x07;
  30. if (vstup == 8)
  31. return 0x7F;
  32. if (vstup == 9)
  33. return 0x67;
  34. }
  35.  
  36. // 1bod - Vytvořte funkci která bude mít jako vstupní hodnotu datový typ unsigned char.
  37. // Návratová hodnota této funkce bude také unsigned char. Tato funkce vrátí takovou hodnotu, která bude
  38. // reprezentovat zobrazení zadaného čísla na segmentovém displayi. Správnost funkce demonstrujte na programu.
  39. // verze pro simulator
  40. /*
  41. int main()
  42. {
  43. avrkit_init();
  44. DDRB = 0xFF;
  45. DDRC = 0xFF;
  46.  
  47. // pouze pro simulator, v realu nenastavovat!
  48. PORTB = 0xFF;
  49.  
  50. char test[8] = { 8, 7, 6, 5, 4, 3, 2, 1 };
  51.  
  52. while (1)
  53. {
  54. for (int i = 0; i < 8; i++)
  55. {
  56. // vybirame jednotlive prvky pole
  57. if (i == 7)
  58. PORTC = BCD(test[i]) | 0x80;
  59. else
  60. PORTC = BCD(test[i]);
  61.  
  62. PORTB ^= (1 << i);
  63. delay_ms(1);
  64. PORTB ^= (1 << i);
  65. }
  66. }
  67. }
  68. */
  69.  
  70. // 3body - Na displayi zobrazte číslo svého loginu, pomocí multiplexního zobrazení.
  71. // verze pro simulator
  72. /*
  73. int main()
  74. {
  75. // vsechny piny portu B a C nastavim pomoci registru jako vystupni
  76. DDRB = 0xFF;
  77. DDRC = 0xFF;
  78. PORTB = 0xFF;
  79.  
  80. char login[4] = { 8, 0, 0, 0 };
  81.  
  82. while (1)
  83. {
  84. for (int i = 0; i < 4; i++)
  85. {
  86. // multiplexovani
  87. // vybireme a priradime LEDky, v mem pripade postupne 0-0-0-8
  88. if (i == 0)
  89. PORTC = BCD(login[i]) | 0x80;
  90. else
  91. PORTC = BCD(login[i]);
  92.  
  93. // aktivuji segment
  94. PORTB ^= (128 >> i);
  95. delay_ms(1);
  96. // deaktivuji segment
  97. PORTB ^= (128 >> i);
  98. }
  99. }
  100. }
  101. */
  102.  
  103. // 5bodů - Nechte číslo svého loginu přejít na displayi z levé strany na pravou. Posun vždy po 1s.
  104. // verze pro simulator
  105. /*
  106. int main()
  107. {
  108. avrkit_init();
  109.  
  110. DDRB = 0xFF;
  111. DDRC = 0xFF;
  112.  
  113. PORTB = 0xFF;
  114.  
  115. char login[4] = { 0, 0, 0, 8 };
  116.  
  117. while (1)
  118. {
  119. int posun = 0;
  120.  
  121. // posun textu :)
  122. for (int i = 0; i < 5; i++)
  123. {
  124. // nastavuji intenzivni periodu blikani..
  125. for (int delay = 0; delay < 2000; delay++)
  126. {
  127. for (int j = 0; j < 4; j++)
  128. {
  129. PORTC = BCD(login[j]);
  130. PORTB ^= (1 << j + posun);
  131. delay_ms(1/2);
  132. PORTB ^= (1 << j + posun);
  133.  
  134. // extra posun - nedodelane
  135. //PORTC = BCD(login[j]);
  136. //PORTB ^= (1 << j + posun) >> 3;
  137. //delay_ms(1/2);
  138.  
  139. // zobrazeni znaku = 1/2 ms
  140. // zobrazeni loginu = 4 * 1/2 = 2 ms
  141. // posun po 1 sekunde = 1000 / 2 = 500 ms
  142.  
  143. //PORTB ^= (1 << j + posun) >> 3;
  144.  
  145. }
  146. }
  147.  
  148. posun++;
  149. }
  150. }
  151. }
  152. */
  153.  
  154. // 7bodu - Nechte číslo svého loginu přejít na display z levé strany na pravou a poté z pravé na levou. Posun vždy po 1s.
  155. // verze pro simulator
  156. /*
  157. int main()
  158. {
  159. avrkit_init();
  160.  
  161. DDRB = 0xFF;
  162. DDRC = 0xFF;
  163.  
  164. PORTB = 0xFF;
  165.  
  166. char login[4] = { 0, 0, 0, 8 };
  167. int test = 0;
  168. int posun = 0;
  169. int konec = 0;
  170.  
  171. while (1)
  172. {
  173. // odecitam o jednicku a v else jeste jednou, aby se posun nezobrazoval se zpozdenim 2 s
  174. if (posun == 5)
  175. posun--;
  176.  
  177. // posun doleva
  178. if (test == 0)
  179. {
  180. // posun textu :)
  181. for (int i = 0; i < 5; i++)
  182. {
  183. // nastavuji intenzivni periodu blikani.. 1 s
  184. for (int delay = 0; delay < 2000; delay++)
  185. {
  186. for (int j = 0; j < 4; j++)
  187. {
  188. PORTC = BCD(login[j]);
  189. PORTB ^= (1 << j + posun);
  190. delay_ms(1/2);
  191. PORTB ^= (1 << j + posun);
  192.  
  193. if (posun == 4)
  194. test = 1;
  195. }
  196. }
  197.  
  198. posun++;
  199. }
  200. } // konec ifu
  201. else
  202. {
  203. // posun textu :)
  204. for (int i = 0; i < 4; i++)
  205. {
  206. posun--;
  207.  
  208. if (posun == 0)
  209. {
  210. test = 0;
  211. continue;
  212. }
  213.  
  214. // nastavuji intenzivni periodu blikani..
  215. for (int delay = 0; delay < 2000; delay++)
  216. {
  217. for (int j = 0; j < 4; j++)
  218. {
  219. PORTC = BCD(login[j]);
  220. PORTB ^= (1 << j + posun);
  221. delay_ms(1/2);
  222. PORTB ^= (1 << j + posun);
  223. }
  224. }
  225. }
  226. } // konec else
  227. }
  228. }
  229. */
  230.  
  231. // 3body - Na displayi zobrazte dvojmístné číslo. Tedy číslo mezi 0 a 99.
  232. // verze pro simulator
  233. /*
  234. int main()
  235. {
  236. DDRB = 0xFF;
  237. DDRC = 0xFF;
  238. // pro simulator
  239. PORTB = 0xFF;
  240.  
  241. while (1)
  242. {
  243. // pouziti casoveho multiplexu - stridani informaci, v mem pripade cisel 8 a 4
  244. PORTC = BCD(8) | 0x80;
  245. PORTB ^= (1 << 0);
  246. delay_ms(1);
  247. PORTB ^= (1 << 0);
  248.  
  249. PORTC = BCD(4) | 0x80;
  250. PORTB ^= (1 << 1);
  251. delay_ms(1);
  252. PORTB ^= (1 << 1);
  253. }
  254. }
  255. */
  256.  
  257. // 5bodů - Vytvořte čítač, který bude na displayi inkrementovat hodnotu vždy po 1s od hodnoty 0 až po hodnotu 99.
  258. // verze pro simulator - nastaveni PORTB na 0xFF
  259. /*
  260. int main()
  261. {
  262. DDRB = 0xFF;
  263. DDRC = 0xFF;
  264. PORTB = 0xFF;
  265.  
  266. while (1)
  267. {
  268. for (int i = 0; i < 100; i++)
  269. {
  270. if (i < 10)
  271. {
  272. for (int delay = 0; delay < 300; delay++)
  273. {
  274. PORTC = BCD(i);
  275. PORTB ^= (1 << 0);
  276. delay_ms(1);
  277. PORTB ^= (1 << 0);
  278. delay_ms(1);
  279. }
  280. }
  281. else
  282. {
  283. int prvniCifra = i / 10;
  284. int druhaCifra = i % 10;
  285.  
  286. for (int delay = 0; delay < 300; delay++)
  287. {
  288. PORTC = BCD(prvniCifra);
  289. PORTB ^= (1 << 0);
  290. delay_ms(1);
  291. PORTB ^= (1 << 0);
  292.  
  293. PORTC = BCD(druhaCifra);
  294. PORTB ^= (1 << 1);
  295. delay_ms(1);
  296. PORTB ^= (1 << 1);
  297. }
  298. }
  299.  
  300. }
  301.  
  302. }
  303. }
  304. */
  305.  
  306. // 5bodů - Vytvořte čítač, který bude na displayi dekrementovat hodnotu vždy po 1s od hodnoty 99 až po hodnotu 0.
  307. // verze pro simulator - nastaveni PORTB na 0xFF
  308. /*
  309. int main()
  310. {
  311. DDRB = 0xFF;
  312. DDRC = 0xFF;
  313. PORTB = 0xFF;
  314.  
  315.  
  316. while (1)
  317. {
  318. for (int i = 99; i >= 0; i--)
  319. {
  320. if (i < 10)
  321. {
  322. for (int delay = 0; delay < 5000; delay++)
  323. {
  324. PORTC = BCD(i);
  325. PORTB ^= (1 << 0);
  326. delay_ms(1/10);
  327. PORTB ^= (1 << 0);
  328. delay_ms(1/10);
  329. }
  330. }
  331. else
  332. {
  333. int prvniCifra = i / 10;
  334. int druhaCifra = i % 10;
  335.  
  336. for (int delay = 0; delay < 500; delay++)
  337. {
  338. PORTC = BCD(prvniCifra);
  339. PORTB ^= (1 << 0);
  340. delay_ms(1);
  341. PORTB ^= (1 << 0);
  342.  
  343. PORTC = BCD(druhaCifra);
  344. PORTB ^= (1 << 1);
  345. delay_ms(1);
  346. PORTB ^= (1 << 1);
  347. }
  348. }
  349.  
  350. }
  351.  
  352. }
  353. }
  354. */
  355.  
  356. // 7bodů - Vytvořte stopky, které budou zobrazovat sekundy a minuty a odpočítají 1:30min do 0:00 a pak se zastaví.
  357. // verze pro simulator - nastaveni PORTB na 0xFF
  358. /*
  359. int main()
  360. {
  361. DDRB = 0xFF;
  362. DDRC = 0xFF;
  363. PORTB = 0xFF;
  364.  
  365. int x = 31;
  366. int y = 60;
  367. int postup = 0;
  368. int min;
  369. int test = 1;
  370.  
  371. while (1)
  372. {
  373. while (test)
  374. {
  375. for (min = 1; min >= 0; min--)
  376. {
  377. for (int sek = 0; sek < 91; sek++)
  378. {
  379. postup++;
  380.  
  381. if (postup < 32)
  382. {
  383. x--;
  384. min = 1;
  385. }
  386. else
  387. {
  388. y -= 1;
  389. x = y;
  390. min = 0;
  391.  
  392. // jakmile dojdu k nule, tak se prepinam na druhy while a vypisuji jenom same nuly
  393. // zde dochazi k zastaveni na nule
  394. if (y == 0)
  395. {
  396. test = 0;
  397. continue;
  398. }
  399. }
  400.  
  401. for (int delay = 0; delay < 150; delay++)
  402. {
  403. PORTC = BCD(min);
  404. PORTB ^= (1 << 0);
  405. delay_ms(1);
  406. PORTB ^= (1 << 0);
  407.  
  408. int prvniCifraSekundy = x / 10;
  409. int druhaCifraSekundy = x % 10;
  410.  
  411. PORTC = BCD(prvniCifraSekundy);
  412. PORTB ^= (1 << 1);
  413. delay_ms(1);
  414. PORTB ^= (1 << 1);
  415.  
  416. PORTC = BCD(druhaCifraSekundy);
  417. PORTB ^= (1 << 2);
  418. delay_ms(1);
  419. PORTB ^= (1 << 2);
  420.  
  421. }
  422. }
  423. }
  424. }
  425. while (test == 0)
  426. {
  427. for (int delay = 0; delay < 100; delay++)
  428. {
  429. PORTC = BCD(0);
  430. PORTB ^= (1 << 0);
  431. delay_ms(1);
  432. PORTB ^= (1 << 0);
  433.  
  434. PORTB ^= (1 << 1);
  435. delay_ms(1);
  436. PORTB ^= (1 << 1);
  437.  
  438. PORTB ^= (1 << 2);
  439. delay_ms(1);
  440. PORTB ^= (1 << 2);
  441. }
  442. }
  443. }
  444. }
  445. */
  446.  
  447. // 1 bod, 3 body, 5 bodu
  448. // pozor na prikaz delay_ms(x), kde x musi byt cele cislo
  449. // nelze pouzivat napr. x = 1/10 - programatorska chyba
  450. // staci zmenit casouvou periodu - delay 167
  451. // 7 bodu - zacne pocitat od 08:59:00
  452. // verze pro simulator - nastaveni PORTB na 0xFF
  453.  
  454. int main()
  455. {
  456. // inicializace prostredi
  457. avrkit_init();
  458.  
  459. printf( "AVR-KIT ready...\n\n" );
  460. printf( "To stop LED blinking press any button D4-D7.\n" );
  461.  
  462. // nastaveni vsech pinu jako vystupni
  463. DDRB = 0xFF;
  464. DDRC = 0xFF;
  465. PORTB = 0xFF;
  466.  
  467. int prvniCifraHodiny, druhaCifraHodiny, prvniCifraMinuty, druhaCifraMinuty, prvniCifraSekundy, druhaCifraSekundy;
  468. int test2 = 0;
  469. int min;
  470.  
  471. while (1)
  472. {
  473. // nastavim urcenou hodinu 8
  474. for (int hod = 8; hod < 24; hod++)
  475. {
  476. // zacinam pocitat od 59 minuty
  477. if (test2 == 0)
  478. {
  479. test2 = 1;
  480. min = 59;
  481. }
  482. else
  483. min = 0;
  484.  
  485. for (min; min < 60; min++)
  486. {
  487. for (int sek = 0; sek < 60; sek++)
  488. {
  489. // perioda 167
  490. // 1000/6
  491. for (int delay = 0; delay < 167; delay++)
  492. {
  493. prvniCifraHodiny = hod / 10;
  494. druhaCifraHodiny = hod % 10;
  495.  
  496. PORTC = BCD(prvniCifraHodiny);
  497. PORTB ^= (1 << 0);
  498. delay_ms(1);
  499. PORTB ^= (1 << 0);
  500.  
  501. PORTC = BCD(druhaCifraHodiny) | 0x80;
  502. PORTB ^= (1 << 1);
  503. delay_ms(1);
  504. PORTB ^= (1 << 1);
  505.  
  506. prvniCifraMinuty = min / 10;
  507. druhaCifraMinuty = min % 10;
  508.  
  509. PORTC = BCD(prvniCifraMinuty);
  510. PORTB ^= (1 << 2);
  511. delay_ms(1);
  512. PORTB ^= (1 << 2);
  513.  
  514. PORTC = BCD(druhaCifraMinuty) | 0x80;
  515. PORTB ^= (1 << 3);
  516. delay_ms(1);
  517. PORTB ^= (1 << 3);
  518.  
  519. prvniCifraSekundy = sek / 10;
  520. druhaCifraSekundy = sek % 10;
  521.  
  522. PORTC = BCD(prvniCifraSekundy);
  523. PORTB ^= (1 << 4);
  524. delay_ms(1);
  525. PORTB ^= (1 << 4);
  526.  
  527. PORTC = BCD(druhaCifraSekundy) | 0x80;
  528. PORTB ^= (1 << 5);
  529. delay_ms(1);
  530. PORTB ^= (1 << 5);
  531.  
  532. }
  533. }
  534. }
  535. }
  536. }
  537. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement