Advertisement
a5768549

ATmega8_p1

Jul 2nd, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.56 KB | None | 0 0
  1. //ICC-AVR application builder
  2. //atmega8_p1
  3. /*
  4.     功能:
  5.         按鈕的變化
  6.         S1短按:顯示LED:2
  7.         S1長按:顯示LED:1
  8.         S2按第一次:顯示LED:3
  9.         S2按第二次:顯示LED:4,同時記錄回到第一次
  10. */
  11.  
  12. #include <iom8v.h>
  13. #include <macros.h>
  14.  
  15. #define LED PORTC
  16. int flag = 0;
  17. int count = 0;
  18. /*******************************************************************************
  19. * 函數名稱: delay_us()
  20. * 入口參數: microsecond : 輸入延時微秒的時間
  21. * 出口參數:
  22. * 功能描述: 微秒的延時        
  23. *******************************************************************************/
  24. void delay_us(unsigned int microsecond)
  25. {      
  26.     do
  27.     {
  28.         microsecond--;
  29.     }
  30.     while (microsecond>1);
  31. }
  32. /*******************************************************************************
  33. * 函數名稱: delay_ms()
  34. * 入口參數: millisecond : 輸入延時毫秒的時間
  35. * 出口參數:
  36. * 功能描述: 毫秒的延時    
  37. *******************************************************************************/
  38. void delay_ms(unsigned int millisecond)
  39. {      
  40.     while (millisecond--)
  41.     {
  42.         delay_us(999);
  43.     }
  44. }
  45. /*******************************************************************************
  46. * 函數名稱: void key_scan(void)
  47. * 入口參數:
  48. * 出口參數:
  49. * 功能描述: 鍵盤掃描
  50. *******************************************************************************/
  51. void key_scan(void)
  52. {
  53.     PORTB = 0XFF;
  54.     delay_ms(10);
  55.     if((PINB&0x3F)!=0x3F)     //假如1~8顆按鈕有被按下去(=0)
  56.     {
  57.         delay_ms(20);
  58.         if((PINB&0X3E) == 0X3E) //0X3E = S1按鈕
  59.         {
  60.             delay_ms(20);
  61.             flag = 0;
  62.             while((PINB) == 0X3E)
  63.             {
  64.                 flag = flag + 1;
  65.                 delay_ms(50);
  66.             }
  67.             if(flag >= 20)
  68.             {
  69.                 LED = ~1;
  70.             }
  71.             else if(flag <= 20)
  72.             {
  73.                 LED = ~2;
  74.             }
  75.         }
  76.         else if((PINB&0X3B) == 0X3B)//0X3B = S2按鈕
  77.         {
  78.             delay_ms(20);
  79.             if(count == 0)
  80.             {
  81.                 LED = 3;
  82.                 count = count + 1;
  83.                 delay_ms(100);
  84.             }
  85.             else if(count == 1)
  86.             {
  87.                 LED = 4;
  88.                 count = 0;
  89.                 delay_ms(100);
  90.             }
  91.             //LED = 1 會等於 LED = 0XF1,LED = 2 會等於 LED = 0XF2,以此類推
  92.         }
  93.     delay_ms(1);
  94.     }
  95.    
  96.     PORTC |= BIT(4)|BIT(5);
  97.     delay_ms(10);
  98.     if((PINC&0x30)!=0x30)//0011 0000
  99.     {
  100.         delay_ms(20);
  101.         if((PINC&0x30)!=0x30)
  102.         {
  103.             switch(PINC&0X30)//0001 0000
  104.             {
  105.                 case 0X10:LED = 7;break;//S7
  106.                 case 0X20:LED = 3;break;//S3
  107.                 default:LED = 0XFF;break;
  108.             }              
  109.             delay_ms(1);
  110.         }
  111.     }
  112.  
  113. }
  114. /*******************************************************************************
  115. * 函數名稱:
  116. * 入口參數:
  117. * 出口參數:
  118. * 功能描述:
  119. *******************************************************************************/
  120. void port_int(void)
  121. {
  122.       //stop errant interrupts until set up
  123.      CLI(); //disable all interrupts
  124.      DDRB = 0XC0;//1100 0000
  125.      PORTB = 0XFF;
  126.      DDRC  = 0x3F;//0011 1111
  127.      PORTC = 0xFF;
  128.      MCUCR = 0x00;
  129.      GICR  = 0x00;
  130.      TIMSK = 0x00; //timer interrupt sources
  131.      SEI();
  132. }
  133. /****************************************************************************
  134. 函數功能:延時子程序
  135. 入口參數:
  136. 出口參數:
  137. ****************************************************************************/
  138. void delay(void)
  139. {
  140.      int i;
  141.      for(i=0;i<200;i++);
  142. }
  143. /****************************************************************************
  144. 函數功能:主程序
  145. 入口參數:
  146. 出口參數:
  147. ****************************************************************************/
  148. void main(void)
  149. {
  150.      port_int();
  151.      LED = 0XFF;
  152.      while(1)
  153.      {
  154.         key_scan();
  155.      }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement