Advertisement
a5768549

ATmega8_p4

Jul 5th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.16 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.    
  23. unsigned int seg[10] =
  24. {
  25.     0x3f,0x06,0x5b,0x4f,
  26.     0x66,0x6d,0x7d,0x07,
  27.     0x7f,0x6f
  28. };
  29.  
  30. //初始化 變量 聲明//////////////////////////////////////////////////////////////
  31. int data = 0;
  32. int flag = 0;
  33. int th = 0;
  34. int hu = 0;
  35. int ten = 0;
  36. int num = 0;
  37. int i = 0;
  38. int speed = 50;
  39. int again = 0;
  40.  
  41. void key_scan(void)
  42. {
  43.     if((PINB&0x3F)!=0x3F)     //假如1~8顆按鈕有被按下去(=0)
  44.     {
  45.         if((PINB&0x3F)!=0x3F)
  46.         {
  47.             delay_ms(20);
  48.             switch(PINB)
  49.             {
  50.                 case 0X3E:
  51.                     while((PINB) == 0X3E)
  52.                         {
  53.                             flag = flag + 1;
  54.                             up_count();
  55.                
  56.                             if(flag == 9999)
  57.                             {
  58.                                 flag = 0;
  59.                             }
  60.                             delay_ms(10);
  61.                         }
  62.                 break;//S1
  63.                
  64.                 case 0X3B:
  65.                     timer0_open();
  66.                 break;//S2
  67.                
  68.                 case 0X37:
  69.                     while((PINB) == 0X37)
  70.                     {
  71.                         speed = speed + 1;
  72.                         speed_count();
  73.  
  74.                         if(speed == 100)
  75.                         {
  76.                             speed = 0;
  77.                         }
  78.                         delay_ms(20);
  79.                     }
  80.                 break;//S6
  81.                
  82.                 case 0X3D:
  83.                     timer0_close();
  84.                 break;//S4
  85.                    
  86.                 default:break;
  87.             }              
  88.             delay_ms(1);
  89.         }
  90.     }
  91. }
  92.  
  93. void stop_fuc(void)
  94. {
  95.     if(again == 1)
  96.     {
  97.         timer0_close();
  98.         for(i = 0;i<3;i++)
  99.         {
  100.             S_OFF;
  101.             delay_ms(500);
  102.             S_ON;
  103.             delay_ms(500);
  104.         }
  105.         again = 0;
  106.         flag = 0;
  107.     }
  108. }
  109.  
  110. void speed_count(void)
  111. {
  112.     for(i = 0;i<40;i++)
  113.     {
  114.         S_OFF;
  115.         th = speed / 1000;
  116.         PORTD = seg[th];
  117.         S_1;
  118.         delay_us(500);
  119.         S_OFF;
  120.         hu = (speed / 100) % 10;
  121.         PORTD = seg[hu];
  122.         S_2;
  123.         delay_us(500);
  124.         S_OFF;
  125.         ten = (speed / 10) % 10;
  126.         PORTD = seg[ten];
  127.         S_3;
  128.         delay_us(500);
  129.         S_OFF;
  130.         num = speed % 10;
  131.         PORTD = seg[num];
  132.         S_4;
  133.         delay_us(500);
  134.     }
  135. }
  136.  
  137. void up_count(void)
  138. {
  139.     S_OFF;
  140.     th = flag / 1000;
  141.     PORTD = seg[th];
  142.     S_1;
  143.     delay_us(900);
  144.     S_OFF;
  145.     hu = (flag / 100) % 10;
  146.     PORTD = seg[hu];
  147.     S_2;
  148.     delay_us(900);
  149.     S_OFF;
  150.     ten = (flag / 10) % 10;
  151.     PORTD = seg[ten]|0x80;
  152.     S_3;
  153.     delay_us(900);
  154.     S_OFF;
  155.     num = flag % 10;
  156.     PORTD = seg[num];
  157.     S_4;
  158.     delay_us(900);
  159. }
  160.  
  161. void delay_us(unsigned int microsecond)
  162. {      
  163.     do
  164.     {
  165.         microsecond--;
  166.     }        
  167.     while (microsecond>1);
  168. }
  169.  
  170. void delay_ms(unsigned int millisecond)
  171. {      
  172.     while (millisecond--)
  173.     {
  174.         delay_us(999);
  175.     }  
  176. }
  177.  
  178. //I、O口初始化
  179. void port_init(void)
  180. {
  181.  DDRB  = 0XC0;
  182.  PORTB = 0XFF;//按鈕
  183.  
  184.  PORTC = 0xFF;
  185.  DDRC  = 0xFF;
  186.  PORTD = 0xFF;
  187.  DDRD  = 0xFF;//七段顯示器
  188. }
  189.  
  190. void timer0_close(void)
  191. {
  192.     CLI();
  193.     TIMSK = 0x01;
  194.     TCCR0 =(0<<CS01) | (0<<CS00);
  195.     TCNT0 = 0X05;//0XFF   256    (0xFF-0X05) *8M/64
  196.     SEI();
  197. }
  198.  
  199. void timer0_open(void)
  200. {
  201.     CLI();
  202.     TIMSK = 0x01;
  203.     TCCR0 =(1<<CS01) | (1<<CS00);
  204.     TCNT0 = 0X05;                   //timer起始值(255-5)
  205.     SEI();
  206. }
  207.  
  208. //CPU總體初始化
  209. void init_devices(void)
  210. {
  211.  CLI();
  212.  port_init();
  213.  MCUCR = 0x00;
  214.  GICR  = 0x00;
  215.  
  216.  TIMSK = 0x01;
  217.  TCCR0 =(0<<CS01) | (0<<CS00);
  218.  TCNT0 = 0X05;
  219.  
  220.  SEI();
  221. }
  222. //向量值
  223. #pragma interrupt_handler timer0_ovf_isr:10    
  224. void timer0_ovf_isr(void)
  225. {    
  226.     TCNT0 = 0X05;
  227.     data++;
  228.    
  229.     if(data == speed && again == 0)             // 50*(255-5)*(8M/64)=0.1s
  230.     {
  231.         data = 0;
  232.         flag -= 1;
  233.         if(flag == 0)
  234.         {
  235.             again = 1;
  236.         }
  237.         up_count();
  238.         S_OFF;
  239.     }
  240. }
  241.  
  242.  
  243. void main(void)
  244. {
  245.    init_devices();
  246.    S_OFF;
  247.    while(1)
  248.    {  
  249.         key_scan();
  250.         up_count();
  251.         stop_fuc();
  252.    }
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement