Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //ICC-AVR application builder
- //atmega8_p1
- /*
- 功能:
- 按鈕的變化
- S1短按:顯示LED:2
- S1長按:顯示LED:1
- S2按第一次:顯示LED:3
- S2按第二次:顯示LED:4,同時記錄回到第一次
- */
- #include <iom8v.h>
- #include <macros.h>
- #define LED PORTC
- int flag = 0;
- int count = 0;
- /*******************************************************************************
- * 函數名稱: delay_us()
- * 入口參數: microsecond : 輸入延時微秒的時間
- * 出口參數:
- * 功能描述: 微秒的延時
- *******************************************************************************/
- void delay_us(unsigned int microsecond)
- {
- do
- {
- microsecond--;
- }
- while (microsecond>1);
- }
- /*******************************************************************************
- * 函數名稱: delay_ms()
- * 入口參數: millisecond : 輸入延時毫秒的時間
- * 出口參數:
- * 功能描述: 毫秒的延時
- *******************************************************************************/
- void delay_ms(unsigned int millisecond)
- {
- while (millisecond--)
- {
- delay_us(999);
- }
- }
- /*******************************************************************************
- * 函數名稱: void key_scan(void)
- * 入口參數:
- * 出口參數:
- * 功能描述: 鍵盤掃描
- *******************************************************************************/
- void key_scan(void)
- {
- PORTB = 0XFF;
- delay_ms(10);
- if((PINB&0x3F)!=0x3F) //假如1~8顆按鈕有被按下去(=0)
- {
- delay_ms(20);
- if((PINB&0X3E) == 0X3E) //0X3E = S1按鈕
- {
- delay_ms(20);
- flag = 0;
- while((PINB) == 0X3E)
- {
- flag = flag + 1;
- delay_ms(50);
- }
- if(flag >= 20)
- {
- LED = ~1;
- }
- else if(flag <= 20)
- {
- LED = ~2;
- }
- }
- else if((PINB&0X3B) == 0X3B)//0X3B = S2按鈕
- {
- delay_ms(20);
- if(count == 0)
- {
- LED = 3;
- count = count + 1;
- delay_ms(100);
- }
- else if(count == 1)
- {
- LED = 4;
- count = 0;
- delay_ms(100);
- }
- //LED = 1 會等於 LED = 0XF1,LED = 2 會等於 LED = 0XF2,以此類推
- }
- delay_ms(1);
- }
- PORTC |= BIT(4)|BIT(5);
- delay_ms(10);
- if((PINC&0x30)!=0x30)//0011 0000
- {
- delay_ms(20);
- if((PINC&0x30)!=0x30)
- {
- switch(PINC&0X30)//0001 0000
- {
- case 0X10:LED = 7;break;//S7
- case 0X20:LED = 3;break;//S3
- default:LED = 0XFF;break;
- }
- delay_ms(1);
- }
- }
- }
- /*******************************************************************************
- * 函數名稱:
- * 入口參數:
- * 出口參數:
- * 功能描述:
- *******************************************************************************/
- void port_int(void)
- {
- //stop errant interrupts until set up
- CLI(); //disable all interrupts
- DDRB = 0XC0;//1100 0000
- PORTB = 0XFF;
- DDRC = 0x3F;//0011 1111
- PORTC = 0xFF;
- MCUCR = 0x00;
- GICR = 0x00;
- TIMSK = 0x00; //timer interrupt sources
- SEI();
- }
- /****************************************************************************
- 函數功能:延時子程序
- 入口參數:
- 出口參數:
- ****************************************************************************/
- void delay(void)
- {
- int i;
- for(i=0;i<200;i++);
- }
- /****************************************************************************
- 函數功能:主程序
- 入口參數:
- 出口參數:
- ****************************************************************************/
- void main(void)
- {
- port_int();
- LED = 0XFF;
- while(1)
- {
- key_scan();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement