Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. //program.c
  2.  
  3. #define io_8255 0x80
  4. #define io_8253 0x100
  5. #define io_8259 0x200
  6.  
  7. #define adr_8255_0 io_8255
  8. #define adr_8255_1 (io_8255 + 2)
  9. #define adr_8255_2 (io_8255 + 4)
  10. #define adr_8255_3 (io_8255 + 6)
  11.  
  12. #define adr_8253_0 io_8253
  13. #define adr_8253_1 (io_8253 + 2)
  14. #define adr_8253_2 (io_8253 + 4)
  15. #define adr_8253_3 (io_8253 + 6)
  16.  
  17. #define adr_8259_0 io_8259
  18. #define adr_8259_1 (io_8259 + 2)
  19.  
  20. typedef unsigned char Byte8;
  21. typedef unsigned short Word16;
  22.  
  23. void outp(Word16 addr, Byte8 data) {
  24. _asm{
  25. push ax
  26. push dx
  27.  
  28. mov dx, addr
  29. mov al, data
  30. out dx, ax
  31.  
  32. pop dx
  33. pop ax
  34. }
  35. }
  36.  
  37. Byte8 inp(Word16 addr) {
  38. Byte8 result;
  39.  
  40. _asm{
  41. push dx
  42.  
  43. mov dx, addr
  44. in al, dx
  45. mov result, al
  46.  
  47. pop dx
  48. }
  49.  
  50. return result;
  51. }
  52.  
  53. // tajmer
  54. void init8253(){
  55. outp(adr_8253_3, 0x56); // cnt1 radi osvezavanje na displeju
  56. outp(adr_8253_1, 0x10); // na 16 otkucaja timera se generise prekid
  57.  
  58. outp(adr_8253_3, 0x36); // cnt0 generise prekid na svaku sekundu
  59. outp(adr_8253_0, 0xe8); // na 1000 otkucaja tajmera se generise prekid
  60. outp(adr_8253_0, 0x03); // 1000 = 0x3e8h
  61.  
  62. }
  63.  
  64. // paralelni port
  65. void init8255(){
  66. outp(adr_8255_3, 0x80);
  67. outp(adr_8255_0, 0xFF);
  68. }
  69.  
  70. // kontroler prekida
  71. void init8259(){
  72. outp(adr_8259_0, 0x13); // icw1
  73. outp(adr_8259_1, 0x20); // icw2
  74. outp(adr_8259_1, 0x01); // icw4
  75. outp(adr_8259_1, 0xf8); // ocw1
  76. outp(adr_8259_0, 0x0b); // ocw3
  77. }
  78.  
  79. Byte8 pozicija = 0;
  80. Byte8 cifre[] = {0, 0, 0, 0};
  81. Byte8 min = 0, sec = 0;
  82.  
  83. Byte8 dekodujCifru(Byte8 cifra){
  84. Byte8 ret;
  85. switch(cifra){
  86. case 0:
  87. ret = 0x3f;
  88. break;
  89. case 1:
  90. ret = 0x06;
  91. break;
  92. case 2:
  93. ret = 0x5b;
  94. break;
  95. case 3:
  96. ret = 0x4f;
  97. break;
  98. case 4:
  99. ret = 0x66;
  100. break;
  101. case 5:
  102. ret = 0x6d;
  103. break;
  104. case 6:
  105. ret = 0x7d;
  106. break;
  107. case 7:
  108. ret = 0x07;
  109. break;
  110. case 8:
  111. ret = 0x7f;
  112. break;
  113. case 9:
  114. ret = 0x6f;
  115. break;
  116. default:
  117. ret = 0x00;
  118. break;
  119. }
  120. return ret;
  121. }
  122.  
  123. Byte8 dohvatiCifru(Byte8 pozicija){
  124. Byte8 ret;
  125. if(pozicija > 3){
  126. ret = 10;
  127. } else {
  128. ret = cifre[pozicija];
  129. }
  130. return ret;
  131. }
  132.  
  133. void pritisnutoDugme(){
  134. Byte8 i;
  135. min = 0;
  136. sec = 0;
  137. for(i=0; i<4; i++){
  138. cifre[i] = 0;
  139. }
  140. }
  141.  
  142. void osveziDisplej(){
  143. Byte8 cifraZaPrikaz, zaPrikaz;
  144.  
  145. outp(adr_8255_0, 0xFF); // ugasi displej
  146. pozicija = (pozicija + 1) % 4;
  147.  
  148.  
  149. // zaPrikaz = dohvatiCifru(pozicija);
  150. cifraZaPrikaz = cifre[pozicija];
  151. zaPrikaz = dekodujCifru(cifraZaPrikaz);
  152. outp(adr_8255_1, zaPrikaz);
  153. outp(adr_8255_0, ~(0x01 << pozicija));
  154. }
  155.  
  156. void inkrementirajVreme(){
  157. sec++;
  158. if(sec == 60){
  159. sec = 0;
  160. min++;
  161. if(min == 60){
  162. min = 0;
  163. }
  164. }
  165.  
  166. cifre[0] = min / 10;
  167. cifre[1] = min % 10;
  168. cifre[2] = sec / 10;
  169. cifre[3] = sec % 10;
  170. }
  171.  
  172. void interrupt prekidnaRutina() {
  173. Byte8 irLevel, isr, maska = 0x01;
  174. isr = inp(adr_8259_0);
  175. for(irLevel = 0; irLevel < 4; irLevel++){
  176. if(isr & maska)
  177. break;
  178. maska <<= 1;
  179. }
  180.  
  181. switch(irLevel){
  182. case 0:
  183. pritisnutoDugme();
  184. outp(adr_8259_0, 0x60 | irLevel);
  185. break;
  186. case 1:
  187. inkrementirajVreme();
  188. outp(adr_8259_0, 0x60 | irLevel);
  189. break;
  190. case 2:
  191. osveziDisplej();
  192. outp(adr_8259_0, 0x60 | irLevel);
  193. break;
  194. default:
  195. break;
  196. }
  197. }
  198.  
  199. void glavnaFunkcija() {
  200. init8253();
  201. init8255();
  202. init8259();
  203.  
  204. _asm sti;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement