Advertisement
a5768549

Untitled

Jul 26th, 2019
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.92 KB | None | 0 0
  1. //ICC-AVR application builder
  2. //atmega8_p4
  3. /*
  4.     功能:計時器
  5.         S1按鈕:設定時間(從0000向上數,放開即停)
  6.         S2按鈕:開始倒數(timer開啟)
  7.         S4按鈕:暫停倒數(timer關閉)
  8.         S6按鈕:控制倒數速度(從0000向上數,放開即停,數值可從0~100)
  9.         倒數至0000時閃爍三下
  10. */
  11.  
  12. #include<iom8v.h>
  13. #include<macros.h>
  14.  
  15. #define S_1      PORTC &= ~BIT(0);PORTC|=BIT(1) ;PORTC|=BIT(2) ;PORTC|=BIT(3);
  16. #define S_2      PORTC |= BIT(0) ;PORTC&=~BIT(1);PORTC|=BIT(2) ;PORTC|=BIT(3);
  17. #define S_3      PORTC |= BIT(0) ;PORTC|=BIT(1) ;PORTC&=~BIT(2);PORTC|=BIT(3);  
  18. #define S_4      PORTC |= BIT(0) ;PORTC|=BIT(1) ;PORTC|=BIT(2) ;PORTC&=~BIT(3);
  19. #define S_OFF    PORTC |= BIT(0) ;PORTC|=BIT(1) ;PORTC|=BIT(2) ;PORTC|=BIT(3);  
  20. #define S_ON     PORTC &= ~BIT(0);PORTC&=~BIT(1);PORTC&=~BIT(2);PORTC&=~BIT(3);
  21.  
  22. unsigned int seg[10] =
  23. {
  24.     0x3f,0x06,0x5b,0x4f,
  25.     0x66,0x6d,0x7d,0x07,
  26.     0x7f,0x6f
  27. };
  28.  
  29. //初始化 變量 聲明//////////////////////////////////////////////////////////////
  30. int data = 0;
  31. int data2 = 0;
  32.  
  33. int count = 1;
  34. int count_num = 1;
  35. int btn2_count = 1;
  36. int btn2_3_count = 0;
  37.  
  38. void btn2_1(void)
  39. {
  40.     int i = 0;
  41.     S_OFF;
  42.     for(i = 0;i<500;i++)
  43.     {
  44.     PORTD = seg[0];S_1;
  45.     delay_ms(1);
  46.     PORTD = seg[7];S_2;
  47.     delay_ms(1);
  48.     PORTD = seg[2];S_3;
  49.     delay_ms(1);
  50.     PORTD = seg[4];S_4;
  51.     delay_ms(1);
  52.     }
  53.     S_OFF;
  54.     btn2_count = 2;
  55. }
  56.  
  57. void btn2_2(void)
  58. {
  59.     int i = 0;
  60.     S_OFF;
  61.     for(i = 0;i<500;i++)
  62.     {
  63.     PORTD = seg[0];S_1;
  64.     delay_ms(1);
  65.     PORTD = seg[2];S_2;
  66.     delay_ms(1);
  67.     PORTD = seg[5];S_3;
  68.     delay_ms(1);
  69.     PORTD = seg[6];S_4;
  70.     delay_ms(1);
  71.     }
  72.     S_OFF;
  73.     btn2_count = 3;
  74. }
  75.  
  76. void btn2_3(void)
  77. {
  78.     int th = 0;
  79.     int hu = 0;
  80.     int ten = 0;
  81.     int num = 0;
  82.     S_OFF;
  83.     th = btn2_3_count / 1000;
  84.     PORTD = seg[th];
  85.     S_1;
  86.     delay_us(900);
  87.     S_OFF;
  88.     hu = (btn2_3_count / 100) % 10;
  89.     PORTD = seg[hu];
  90.     S_2;
  91.     delay_us(900);
  92.     S_OFF;
  93.     ten = (btn2_3_count / 10) % 10;
  94.     PORTD = seg[ten]|0x80;
  95.     S_3;
  96.     delay_us(900);
  97.     S_OFF;
  98.     num = btn2_3_count % 10;
  99.     PORTD = seg[num];
  100.     S_4;
  101.     delay_us(900);
  102. }
  103.  
  104. void btn1_fuc(void)
  105. {
  106.    
  107.      switch(count_num)
  108.     {
  109.         case 1 : S_1;break;
  110.         case 2 : S_2;break;
  111.         case 3 : S_3;break;
  112.         case 4 : S_4;break;
  113.     }
  114.    
  115. }
  116.  
  117. void btn1(void)
  118. {
  119.     if ((1 <= count) && (count <= 8))
  120.     {
  121.      PORTD = 1 << (count - 1);
  122.     }
  123.     btn1_fuc();
  124.    
  125. }
  126.  
  127. void key_scan(void)
  128. {
  129.     if((PINB&0x3F)!=0x3F)     //假如1~8顆按鈕有被按下去(=0)
  130.     {
  131.         if((PINB&0x3F)!=0x3F)
  132.         {
  133.             delay_ms(20);
  134.             switch(PINB)
  135.             {
  136.                 case 0X3E:
  137.                     timer0_open();
  138.                 break;//S1
  139.                
  140.                 case 0X3B:
  141.                     timer0_close();
  142.                     switch(btn2_count)
  143.                     {
  144.                         case 1:btn2_1();break;
  145.                         case 2:btn2_2();break;
  146.                         case 3:
  147.                         delay_ms(1000);
  148.                         timer2_open();
  149.                         btn2_count = 99;
  150.                         break;
  151.                     }
  152.                 break;//S2
  153.                
  154.                 case 0X37:
  155.                     timer2_open();
  156.                 break;//S6
  157.                
  158.                 case 0X3D:
  159.                    
  160.                 break;//S4
  161.                    
  162.                 default:break;
  163.             }              
  164.             delay_ms(1);
  165.         }
  166.     }
  167. }
  168.  
  169. void delay_us(unsigned int microsecond)
  170. {      
  171.     do
  172.     {
  173.         microsecond--;
  174.     }        
  175.     while (microsecond>1);
  176. }
  177.  
  178. void delay_ms(unsigned int millisecond)
  179. {      
  180.     while (millisecond--)
  181.     {
  182.         delay_us(999);
  183.     }  
  184. }
  185.  
  186. //I、O口初始化
  187. void port_init(void)
  188. {
  189.  DDRB  = 0XC0;
  190.  PORTB = 0XFF;//按鈕
  191.  
  192.  PORTC = 0xFF;
  193.  DDRC  = 0xFF;
  194.  PORTD = 0xFF;
  195.  DDRD  = 0xFF;//七段顯示器
  196. }
  197.  
  198. void timer0_close(void)
  199. {
  200.     CLI();
  201.     TIMSK = 0x01;
  202.     TCCR0 =(0<<CS01) | (0<<CS00);
  203.     TCNT0 = 0X05;//0XFF   256    (0xFF-0X05) *8M/64
  204.     SEI();
  205. }
  206.  
  207. void timer0_open(void)
  208. {
  209.     CLI();
  210.     TIMSK = 0x01;
  211.     TCCR0 =(1<<CS01) | (1<<CS00);
  212.     TCNT0 = 0X05;                   //timer起始值(255-5)
  213.     SEI();
  214. }
  215.  
  216. void timer2_close(void)
  217. {
  218.     CLI();
  219.     TCCR2 = 0X00;//0000 0011
  220.     TCNT2 = 0X83;//初值
  221.     SEI();
  222. }
  223.  
  224. void timer2_open(void)
  225. {
  226.     CLI();
  227.     TCCR2 = 0X03;//0000 0011
  228.     TCNT2 = 0X83;//初值
  229.  
  230.     SEI();
  231. }
  232.  
  233. //CPU總體初始化
  234. void init_devices(void)
  235. {
  236.  CLI();
  237.  port_init();
  238.  MCUCR = 0x00;
  239.  GICR  = 0x00;
  240.  
  241.  TIMSK = 0x43;
  242.  TCCR0 =(0<<CS01) | (0<<CS00);
  243.  TCNT0 = 0X05;
  244.  
  245.  TCCR2 = 0X00;//0000 0011
  246.  TCNT2 = 0X83;//初值
  247.  
  248.  SEI();
  249. }
  250. //向量值
  251. #pragma interrupt_handler timer0_ovf_isr:10    
  252. void timer0_ovf_isr(void)
  253. {    
  254.     TCNT0 = 0X05;
  255.     data++;
  256.    
  257.     if(data == 50)              // 50*(255-5)*(8M/64)=0.1s
  258.     {
  259.     if(count == 9)
  260.         {
  261.         count = 1;
  262.         count_num += 1;
  263.         }
  264.         if(count_num == 5)
  265.     {
  266.         count_num = 1;
  267.     }
  268.         data = 0;
  269.         S_OFF;
  270.         btn1();
  271.         count = count + 1;
  272.        
  273.     }
  274. }
  275.  
  276. #pragma interrupt_handler timer2_ovf_isf:5
  277. void timer2_ovf_isf(void)
  278. {
  279.   TCNT2 = 0X83;//初值
  280.   data2++;
  281.    
  282.     if(data2 == 50)             // 50*(255-5)*(8M/64)=0.1s
  283.     {
  284.         //S_ON;(測試用
  285.         data2 = 0;
  286.         btn2_3_count += 1;
  287.         if(btn2_3_count == 11)
  288.         {
  289.             btn2_3_count = 0;
  290.             btn2_count = 1;
  291.             timer2_close();
  292.         }
  293.         btn2_3();      
  294.         S_OFF;
  295.     }
  296. }
  297.  
  298. void main(void)
  299. {
  300.    SREG = 0X80;
  301.    init_devices();
  302.    while(1)
  303.    {  
  304.         key_scan();
  305.    }
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement