Advertisement
Guest User

Untitled

a guest
May 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define F_CPU 8000000UL
  6. #include <util/delay.h>
  7.  
  8. void initLCD();
  9. void putchLCD(char ch);
  10. void putsLCD(char* ch);
  11. void gotoLC(char line, char col);
  12. void clrLCD();
  13. char kbscan();
  14. void sysinit();
  15. unsigned char rd_LCDreg(unsigned char vRS);
  16. void wr_LCDreg(unsigned char vRS, unsigned char data);
  17. void ckbf();
  18.  
  19. #define IReg 0
  20. #define SReg 0
  21. #define DReg 1
  22.  
  23. #define clrbit(var,bit) var &= ~(1<<bit)
  24. #define setbit(var,bit) var |= 1<<bit
  25.  
  26. #define NOKEY 0x7f
  27.  
  28. #define C1 1
  29. #define C2 2
  30. #define C3 3
  31.  
  32. #define OC0 3
  33.  
  34. #define OCIE2 7
  35. #define IF 7
  36.  
  37. volatile unsigned char kbhit = 0;
  38. volatile char kbcode;
  39.  
  40. int main(){
  41.  
  42. unsigned char pit = 0;
  43. unsigned char stare = C1;
  44. char buf_pit[4];
  45. unsigned long int a,b,c;
  46.  
  47. sysinit();
  48.  
  49. TCCR2 = 0b00001110;
  50. OCR2 = 250-1;
  51.  
  52. // __ __Fast PWM
  53. // | |
  54. TCCR0 = 0b01101100;
  55. // || |||
  56. // || ------ clk(i/o)/256
  57. // ||
  58. // ---------Clear OC0 on compare match, set OC0 at bottom
  59. OCR0 = 128;
  60.  
  61. setbit(DDRB, OC0);
  62.  
  63. //demascheaza cererea de intrerupere OCF2 de la timerul 2
  64. setbit(TIMSK, OCIE2);
  65.  
  66. //seteaza IF in SREG
  67. setbit(SREG, IF);
  68.  
  69.  
  70. while(1){
  71.  
  72.  
  73. //c pitagoreic start
  74. if( kbhit && kbcode>='0' && kbcode<='9'){
  75. kbhit=0;
  76. switch(stare){
  77. case C1: //cifra 0
  78. gotoLC(1,1);
  79. putsLCD(" ");
  80. buf_pit[0]=kbcode;
  81. gotoLC(1,1);
  82. putchLCD(kbcode);
  83. stare=C2;
  84. break;
  85.  
  86. case C2:
  87. buf_pit[1]=kbcode;
  88. gotoLC(1,2);
  89. putchLCD(kbcode);
  90. stare=C3;
  91. break;
  92.  
  93. case C3:
  94. buf_pit[2]=kbcode;
  95. buf_pit[3]='\0';
  96. gotoLC(1,3);
  97. putchLCD(kbcode);
  98. gotoLC(1,5);
  99. putsLCD("Busy...");
  100. c = atoi(buf_pit);
  101.  
  102. //scrie "Busy..." pe linia 1, din coloana 5
  103. //calculeaza c
  104.  
  105. for(a = 1;a<=999;a++){
  106. for(b = 1;b<=999;b++){
  107. if((a*a + b*b) == c*c ){
  108. pit = 1;
  109. goto FINISH;
  110. }
  111. }
  112. }
  113.  
  114. FINISH : gotoLC(1,5);
  115.  
  116. if(pit){
  117. putsLCD(" PYTH");
  118. pit = 0;
  119. }
  120. else{
  121. putsLCD(" NPYTH");
  122. }
  123. stare=C1;
  124.  
  125. break;
  126. }//end switch
  127. }
  128. // end c pitagoreic
  129.  
  130. }//end while
  131. }//end main
  132.  
  133. ISR(TIMER2_COMP_vect){
  134. //ceas
  135. static unsigned char cycles=0;
  136. static unsigned char s = 0;
  137. static unsigned char m = 24;
  138. static unsigned char h = 9;
  139. unsigned char digit;
  140. //
  141.  
  142. //tastatura
  143. static unsigned char code_now=0x7f;
  144. static unsigned char loop_cnt=0;
  145. unsigned char code_ante;
  146. //
  147.  
  148. //luminozitatea
  149. static int lumi=50;
  150. char buf_lumi[4];
  151. //
  152. unsigned char AC;
  153.  
  154. ckbf();
  155. _delay_us(8);
  156. AC = rd_LCDreg(SReg) & 0x7F;
  157.  
  158.  
  159. gotoLC(2,1);
  160. if(h>9){
  161. digit = h/10 + '0';
  162. putchLCD(digit);
  163. digit = h%10 + '0';
  164. putchLCD(digit);
  165. } else {
  166. putchLCD(' ');
  167. digit = h%10 + '0';
  168. putchLCD(digit);
  169. }
  170. putchLCD(':');
  171. digit = m/10 + '0';
  172. putchLCD(digit);
  173. digit = m%10 + '0';
  174. putchLCD(digit);
  175.  
  176. putchLCD(':');
  177. digit = s/10 + '0';
  178. putchLCD(digit);
  179. digit = s%10 + '0';
  180. putchLCD(digit);
  181.  
  182. if(loop_cnt==4){ //4 sau alta valoare
  183. loop_cnt=0;
  184. code_ante = code_now;
  185. code_now = kbscan();
  186. if( code_ante == NOKEY && code_now != NOKEY){
  187. kbhit=1;
  188. kbcode=code_now;
  189. }
  190. }
  191.  
  192.  
  193.  
  194. //PWM start
  195. if(kbhit && (kbcode == 'C' || kbcode == 'D')){
  196. kbhit = 0;
  197. if(kbcode == 'C'){
  198. lumi += 5;
  199. if(lumi > 100)
  200. lumi = 100;
  201. }
  202. if(kbcode == 'D'){
  203. lumi -= 5;
  204. if(lumi < 0)
  205. lumi = 0;
  206. }
  207. OCR0 = lumi*255/100;
  208. gotoLC(2,12);
  209. putsLCD(" ");
  210. gotoLC(2,11);
  211. putsLCD("L=");
  212. itoa(lumi,buf_lumi,10);
  213. putsLCD(buf_lumi);
  214. putsLCD("%");
  215. }
  216. //PWM end
  217.  
  218. cycles++;
  219.  
  220. //ceas start
  221. if(cycles == 125){
  222. cycles = 0;
  223. s++;
  224. if(s==60){
  225. s = 0;
  226. m++;
  227. }
  228. if(m==60){
  229. m = 0;
  230. h++;
  231. }
  232. if(h==24){
  233. h=0;
  234. }
  235. }
  236. if(cycles == 67) {
  237. gotoLC(2,3);
  238. putchLCD(' ');
  239. gotoLC(2,6);
  240. putchLCD(' ');
  241. }
  242.  
  243.  
  244.  
  245. if(TIFR & 1<<OCF2){
  246. clrLCD();
  247. putsLCD("ERROR");
  248. while(1){}
  249. }
  250. //ceas end
  251.  
  252. setbit(AC, 7);
  253. wr_LCDreg(IReg, AC);
  254. ckbf();
  255. _delay_us(8);
  256. loop_cnt++;
  257.  
  258.  
  259. }//end ISR
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement