Advertisement
a5768549

ATmega8_p2

Jul 3rd, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.97 KB | None | 0 0
  1. //ICC-AVR application builder
  2. //atmega8_p2
  3. /*
  4.     功能:
  5.         預設跑七段顯示器迴圈
  6.         按鈕按第一下:七段顯示器從0000跑到9999
  7.         按鈕按第二下:七段顯示器從9999跑到6666,同時記錄回到第一下
  8. */
  9.  
  10. #include<iom8v.h>
  11. #include<macros.h>
  12.  
  13. #define S_1      PORTC &= ~BIT(0);PORTC|=BIT(1) ;PORTC|=BIT(2) ;PORTC|=BIT(3);
  14. #define S_2      PORTC |= BIT(0) ;PORTC&=~BIT(1);PORTC|=BIT(2) ;PORTC|=BIT(3);
  15. #define S_3      PORTC |= BIT(0) ;PORTC|=BIT(1) ;PORTC&=~BIT(2);PORTC|=BIT(3);  
  16. #define S_4      PORTC |= BIT(0) ;PORTC|=BIT(1) ;PORTC|=BIT(2) ;PORTC&=~BIT(3);
  17. #define S_OFF    PORTC |= BIT(0) ;PORTC|=BIT(1) ;PORTC|=BIT(2) ;PORTC|=BIT(3);  
  18. #define S_ON     PORTC &= ~BIT(0);PORTC&=~BIT(1);PORTC&=~BIT(2);PORTC&=~BIT(3);
  19.  
  20. #define w1       PORTD =  0x01; S_1;
  21. #define w2       PORTD =  0x01; S_2;
  22. #define w3       PORTD =  0x01; S_3;
  23. #define w4       PORTD =  0x01; S_4;   
  24. #define w5       PORTD =  0x02; S_4;       
  25. #define w6       PORTD =  0x04; S_4;   
  26. #define w7       PORTD =  0x08; S_4;
  27. #define w8       PORTD =  0x08; S_3;   
  28. #define w9       PORTD =  0x08; S_2;   
  29. #define w10      PORTD =  0x08; S_1;       
  30. #define w11      PORTD =  0x10; S_1;       
  31. #define w12      PORTD =  0x20; S_1;   
  32.    
  33. unsigned int seg[10] =
  34. {
  35.     0x3f,0x06,0x5b,0x4f,
  36.     0x66,0x6d,0x7d,0x07,
  37.     0x7f,0x6f
  38. };
  39.  
  40. //初始化 變量 聲明//////////////////////////////////////////////////////////////
  41. int data = 0;
  42. int flag = 0;
  43. int count = 0;
  44. int th = 0;
  45. int hu = 0;
  46. int ten = 0;
  47. int num = 0;
  48. int i = 0;
  49.  
  50. void key_scan(void)
  51. {
  52.     if((PINB&0x3F)!=0x3F)     //假如1~8顆按鈕有被按下去(=0)
  53.     {
  54.         delay_ms(20);
  55.         if((PINB&0X3B) == 0X3B)//0X3B = S2按鈕
  56.         {
  57.             delay_ms(20);
  58.             if(count == 0)
  59.             {
  60.                 btn1();
  61.                 count = count + 1;
  62.                 delay_ms(100);
  63.             }
  64.             else if(count == 1)
  65.             {
  66.                 btn2();
  67.                 count = 0;
  68.                 delay_ms(100);
  69.             }
  70.             //LED = 1 會等於 LED = 0XF1,LED = 2 會等於 LED = 0XF2,以此類推
  71.         }
  72.     }
  73. }
  74. void btn1(void)
  75. {
  76.     for(i = 0;i<10000;i++)
  77.     {
  78.         S_OFF;
  79.         th = i / 1000;
  80.         PORTD = seg[th];
  81.         S_1;
  82.        
  83.         S_OFF;
  84.         hu = (i / 100) % 10;
  85.         PORTD = seg[hu];
  86.         S_2;
  87.        
  88.         S_OFF;
  89.         ten = (i / 10) % 10;
  90.         PORTD = seg[ten];
  91.         S_3;
  92.        
  93.         S_OFF;
  94.         num = i % 10;
  95.         PORTD = seg[num];
  96.         S_4;
  97.     }
  98. }
  99.  
  100. void btn2(void)
  101. {
  102.      for(i = 9999;i>6665;i--)
  103.      {
  104.         S_OFF;
  105.         th = i / 1000;
  106.         PORTD = seg[th];
  107.         S_1;
  108.        
  109.         S_OFF;
  110.         hu = (i / 100) % 10;
  111.         PORTD = seg[hu];
  112.         S_2;
  113.        
  114.         S_OFF;
  115.         ten = (i / 10) % 10;
  116.         PORTD = seg[ten];
  117.         S_3;
  118.        
  119.         S_OFF;
  120.         num = i % 10;
  121.         PORTD = seg[num];
  122.         S_4;
  123.     }
  124. }
  125.  
  126. void w(void)
  127. {
  128.     switch(flag)
  129.     {
  130.         case 1 : w1;break;
  131.         case 2 : w2;break;
  132.         case 3 : w3;break;
  133.         case 4 : w4;break;
  134.         case 5 : w5;break;
  135.         case 6 : w6;break;
  136.         case 7 : w7;break;
  137.         case 8 : w8;break;
  138.         case 9 : w9;break;
  139.         case 10:w10;break;
  140.         case 11:w11;break;
  141.         case 12:w12;break;
  142.     }
  143. }
  144.  
  145. void delay_us(unsigned int microsecond)
  146. {      
  147.     do
  148.     {
  149.         microsecond--;
  150.     }        
  151.     while (microsecond>1);
  152. }
  153.  
  154. void delay_ms(unsigned int millisecond)
  155. {      
  156.     while (millisecond--)
  157.     {
  158.         delay_us(999);
  159.     }  
  160. }
  161.  
  162. //I、O口初始化
  163. void port_init(void)
  164. {
  165.  DDRB  = 0XC0;//1100 0000
  166.  PORTB = 0XFF;
  167.  PORTC = 0xFF; //m103 output only
  168.  DDRC  = 0xFF;
  169.  PORTD = 0xFF;
  170.  DDRD  = 0xFF;
  171. }
  172.  
  173. //定時器0初始化
  174. void timer0_int(void)
  175. {
  176.     TIMSK = 0x01; //T0/C0溢出中斷使能
  177.     TCCR0 =(1<<CS01) | (1<<CS00);
  178.     TCNT0 = 0X05;//0XFF   256    (0xFF-0X05) *8M/64
  179.    
  180. }
  181. //CPU總體初始化
  182. void init_devices(void)
  183. {
  184.  CLI();
  185.  port_init();
  186.  MCUCR = 0x00;
  187.  GICR  = 0x00;
  188.  TIMSK = 0x00;
  189.  timer0_int();
  190.  SEI();
  191. }
  192.  
  193. #pragma interrupt_handler timer0_ovf_isr:10
  194. void timer0_ovf_isr(void)
  195. {    
  196.     TCNT0 = 0X05;//內部晶振,幾分頻算出時間初值
  197.     data++;
  198.     if(500 == data)// 500*(255-5)*(8M/64)=T
  199.     {
  200.         data = 0;
  201.         S_OFF;
  202.         w();
  203.         flag = flag + 1;
  204.         if(flag == 13)flag = 1;
  205.     }
  206. }//end of void timer0_ovf_isr(void)
  207.  
  208.  
  209. void main(void)
  210. {
  211.    init_devices();
  212.    S_OFF;
  213.    while(1)
  214.    {  
  215.         key_scan();
  216.    }
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement