Advertisement
a5768549

Atmega8_p6

Jul 27th, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.07 KB | None | 0 0
  1. //ICC-AVR application builder
  2. //atmega8_p6
  3. /*
  4.     功能:計時器
  5.         S1按鈕:顯示狀態1到狀態10(乙級燈號表,按一下更新狀態一次,狀態10顯示完必須回到S2按鈕狀態)
  6.         S2按鈕:
  7.                 七段顯示器顯示0000、FFFF 交替閃爍
  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. unsigned int seg[11] =
  21. {
  22.     0x3f,0x06,0x5b,0x4f,
  23.     0x66,0x6d,0x7d,0x07,
  24.     0x7f,0x6f,0x71
  25. };
  26.  
  27. unsigned int btn1_1[6] =
  28. {
  29.     0x01,0x02,0x04,0x08,0x10,0x20
  30. };
  31.  
  32. unsigned int btn1_2[6] =
  33. {
  34.     0x20,0x10,0x08,0x04,0x02,0x01
  35. };
  36.  
  37. unsigned int btn1_3[5] =
  38. {
  39.     0x03,0x06,0x0C,0x18,0x30
  40. };
  41.  
  42. unsigned int btn1_4[5] =
  43. {
  44.     0x30,0x18,0x0C,0x06,0x03
  45. };
  46.  
  47. unsigned int btn1_5[6] =
  48. {
  49.     0x01,0x03,0x07,0x0F,0x1F,0x3F
  50. };
  51.  
  52. unsigned int btn1_6[6] =
  53. {
  54.     0x3F,0x1F,0x0F,0x07,0x03,0x01
  55. };
  56.  
  57. unsigned int btn1_7[3] =
  58. {
  59.     0x0C,0x12,0x21
  60. };
  61.  
  62. unsigned int btn1_8[3] =
  63. {
  64.     0x21,0x12,0x0C
  65. };
  66.  
  67. unsigned int btn1_9[11] =
  68. {
  69.     0x01,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x01
  70. };
  71.  
  72. unsigned int btn1_10[11] =
  73. {
  74.     0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20
  75. };
  76.  
  77. unsigned int btn1_index[10] =
  78. {
  79.     6,6,5,5,6,6,3,3,11,11
  80. };
  81.  
  82. //初始化 變量 聲明//////////////////////////////////////////////////////////////
  83. int data = 0;
  84. int data2 = 0;
  85. int i = 0;
  86. int count = 0;
  87. int count2 = 0;
  88.  
  89. void btn1_count(void)
  90. {
  91.  S_OFF;
  92.     for(i=0;i<btn1_index[count];i++)
  93.     {
  94.         switch(count)
  95.         {
  96.             case 0:
  97.                 PORTC = ~btn1_1[i];
  98.                 delay_ms(1000);
  99.             break;
  100.             case 1:
  101.                 PORTC = ~btn1_2[i];
  102.                 delay_ms(1000);
  103.             break;
  104.             case 2:
  105.                 PORTC = ~btn1_3[i];
  106.                 delay_ms(1000);
  107.             break;
  108.             case 3:
  109.                 PORTC = ~btn1_4[i];
  110.                 delay_ms(1000);
  111.             break;
  112.             case 4:
  113.                 PORTC = ~btn1_5[i];
  114.                 delay_ms(1000);
  115.             break;
  116.             case 5:
  117.                 PORTC = ~btn1_6[i];
  118.                 delay_ms(1000);
  119.             break;
  120.             case 6:
  121.                 PORTC = ~btn1_7[i];
  122.                 delay_ms(1000);
  123.             break;
  124.             case 7:
  125.                 PORTC = ~btn1_8[i];
  126.                 delay_ms(1000);
  127.             break;
  128.             case 8:
  129.                 PORTC = ~btn1_9[i];
  130.                 delay_ms(1000);
  131.             break;
  132.             case 9:
  133.                 PORTC = ~btn1_10[i];
  134.                 delay_ms(1000);
  135.             break;
  136.         }
  137.     }
  138.     PORTC = 0xFF;
  139.     count += 1;
  140.    
  141.     if(count == 10)
  142.     {
  143.         count = 1;
  144.         timer0_open();
  145.     }
  146. }
  147.  
  148. void btn2(void)
  149. {
  150.     S_OFF;
  151.     switch(count2)
  152.     {
  153.         case 0:PORTD = seg[0];S_ON;count2=1;break;
  154.         case 1:PORTD = seg[10];S_ON;count2=0;break;
  155.     }
  156. }
  157.  
  158. void key_scan(void)
  159. {
  160.     if((PINB&0x3F)!=0x3F)     //假如1~8顆按鈕有被按下去(=0)
  161.     {
  162.         if((PINB&0x3F)!=0x3F)
  163.         {
  164.             delay_ms(20);
  165.             switch(PINB)
  166.             {
  167.                 case 0X3E:
  168.                     timer0_close();
  169.                     btn1_count();
  170.                 break;//S1
  171.                
  172.                 case 0X3B:
  173.                     timer0_open();
  174.                 break;//S2
  175.                 default:break;
  176.             }              
  177.             delay_ms(1);
  178.         }
  179.     }
  180. }
  181.  
  182. void delay_us(unsigned int microsecond)
  183. {      
  184.     do
  185.     {
  186.         microsecond--;
  187.     }        
  188.     while (microsecond>1);
  189. }
  190.  
  191. void delay_ms(unsigned int millisecond)
  192. {      
  193.     while (millisecond--)
  194.     {
  195.         delay_us(999);
  196.     }  
  197. }
  198.  
  199. //I、O口初始化
  200. void port_init(void)
  201. {
  202.     DDRB  = 0XC0;
  203.     PORTB = 0XFF;//按鈕
  204.  
  205.     PORTC = 0xFF;
  206.     DDRC  = 0xFF;
  207.     PORTD = 0xFF;
  208.     DDRD  = 0xFF;//七段顯示器
  209. }
  210.  
  211. void timer0_open(void)
  212. {
  213.     CLI();
  214.     TCNT0 = 0x05;
  215.     TIMSK |= BIT(TOIE0);
  216.     TCCR0 |= BIT(CS01) | BIT(CS00);
  217.     SEI();
  218. }
  219.  
  220. void timer0_close(void)
  221. {
  222.     CLI();
  223.     TIMSK &= ~BIT(TOIE0);
  224.     TCCR0 &= ~(BIT(CS02) | BIT(CS01) | BIT(CS00));
  225.     SEI();
  226. }
  227.  
  228. //CPU總體初始化
  229. void init_devices(void)
  230. {
  231.     CLI();
  232.     port_init();
  233.     MCUCR = 0x00;
  234.     GICR  = 0x00;
  235.    
  236.     TIMSK = 0x00;
  237.     TCCR0 = 0x00;
  238.     TCNT0 = 0x05;
  239.     SEI();
  240. }
  241. //向量值
  242. #pragma interrupt_handler timer0_ovf_isr:10    
  243. void timer0_ovf_isr(void)
  244. {    
  245.     TCNT0 = 0X05;
  246.     data++;
  247.     if(500==data)
  248.     {
  249.         data = 0;
  250.         btn2();
  251.     }
  252. }
  253.  
  254. void main(void)
  255. {
  256.     init_devices();
  257.     while(1)
  258.     {  
  259.         key_scan();
  260.     }
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement