//絕對除錯透過,AVR-GCC,mega16,帶數位顯示,單鍵開關多功能控制
#include avr/io.h
#include avr/interrupt.h
#include tone.h
#include avr/pgmspace.h
#define uchar unsigned char
#define uint unsigned int
#define key_input PINA
#define pgm16(A) ((typeof(A))pgm_read_word(&(A)))
const unsigned char seg_code[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7f,0x3f};
const uint music[] PROGMEM={M3,F2,M5,B1,M3,F4,M2,F4,M1,B2,L6,F2,M1,F2,MM,M1,F2,L6,F2,L5,B2, L6,F2,M1,B1,MM,M1,F2,L6,F2,M6,F2,L5,F2,M3,F2,M2,F2,MM,M2,F4,M1,F4,L6,F2,M3,F2,M2,B2, M3,F2,MM,M3,F2,MM,M3,F2,M2,F2,M1,B2,L6,F2,M1,F2,L7,F2,L5,F2,L6,B2, L5,F2,L6,F2,MM,L6,F2,L5,F2,M6,F2,M5,F2,MM,M5,F2,M3,F2,M2,F2,MM,M2,F4,M3,F4,M3,F2,M2,F2,M1,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,F2,MM,H1,F2,M6,F2,MM,M6,F2,M5,F2,MM,M5,F2,M3,F2,M5,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,F2,MM,H1,F2,M6,F2,M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,B2, M3,B1,MM,M3,F2,M5,F2,M6,F2,M5,F2,MM,M5,F2,M3,F2,MM,M3,F2,M2,F2,MM,M2,F2,M1,F2,L6,B2, L5,F2,M5,F4,MM,M5,F4,MM,M5,F2,M6,F2,M5,F2,M3,F2,M2,F2,M3,F2,MM,M3,F2,M2,B1,L6,F2,M1,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,B1,M6,F2,MM,M6,F2,M5,F2,MM,M5,F2,M3,F2,M5,B2, M6,F2,H1,B1,M6,F2,H2,F2,H1,B1,M6,F2, M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,B2,MM, M2,F2,MM,M2,F4,M1,F4,M2,F2,M3,F2,M5,F2,MM,M5,F2,MM,M5,F2,M3,F2,M2,F2,MM,M2,F4,M3,F4,M2,F2,M1,F2,L6,B2, L5,F2,M5,F4,MM,M4,F4,MM,M5,F2,M6,F2,M5,F2,M3,F2,M2,F2,M2,F4,M3,F4,MM,M3,F2,M2,B1,L6,F2,M1,B3,0XFF,0XFF};
//因為兩個相同的音符之間無停頓,人為插入了MM(極短暫的
volatile uint i=1;
volatile uchar timeOK=0;
uchar key_scan(void);
ISR(TIMER0_COMP_vect) //CTC模式,控制音調高低
{
OCR0=pgm16(music[i-1]);
}
ISR(TIMER1_OVF_vect) //時間溢位模式,控制節拍長短
{
i =2;
TCNT1H=(65536-pgm16(music[i]))/256; //相當於(65536-beat[i])/256
TCNT1L=(65536-pgm16(music[i]))%6; //相當於(65536-beat[i])%6
if(pgm16(music[i])==0xff)i=1; //在音調陣列的最後加一個0xff,作為終止訊號
if(pgm16(music[i])==0x00)TIMSK&=(~(1OCIE0));
else TIMSK|=(1OCIE0);
}
ISR(TIMER2_OVF_vect) //時間溢位模式,用於檢測按鍵,週期10ms
{
TCNT2=100;
timeOK=1;
}
void timer0_init(void)
{
TCCR0=0x00;
TCNT0=0x00;
OCR0=pgm16(music[i-1]);
TCCR0=0x1a;
//TIMSK|=(1OCIE0);
}
void timer1_init(void)
{
TCCR1B=0x00;
TCNT1H=(65536-pgm16(music[i]))/256;
TCNT1L=(65536-pgm16(music[i]))%6;
TCCR1A=0x00;
TCCR1B=0x05;
//TIMSK|=(1TOIE1);
}
void timer2_init(void)
{
TCCR2=0x00;
TCNT2=100;
TCCR2=0x03;
TIMSK|=(1TOIE2);
}
void MCU_init(void)
{
DDRA=0X00;
DDRB=0X00;
DDRC=0XFF;
DDRD=0XFF;
PORTB=0X00;
PORTC=0xfe;
PORTD=0xff;
}
uchar key_scan(void) //按鈕掃描函式
{
static uchar key_state=0,key_time1=0,key_time0=0; //靜態變數,呼叫以後,值被保留;
uchar key_press,key_return=0;
key_press=(~key_input)0x01; //有鍵1,無鍵0
switch(key_state) //狀態機
{
case 0: //狀態0:無按鈕按下狀態
if(key_press)key_state=1;
break;
case 1: //狀態1:檢測到有按鈕被按下
if(key_press) //按鈕仍按下,轉2
{
//TIMSK^=(1TOIE0);
key_state=2;
key_time1=0; //按下時間初始
}
else //按鈕已經釋放,消抖
key_state=0;
break;
case 2: //狀態2:等待釋放或等待按下時間達到長按要求
if(!key_press) //按鈕已經釋放,轉3,繼續判斷是雙按還是單按
{
key_state=3;
key_time0=0; //釋放時間初始
}
else if ( key_time1=100) //按下時間達到1000ms,返回值2,作長按判斷,轉7等待按鈕釋放
{
key_state=8;
key_time1=0;
key_return=2;
}
break;
case 8:
if(!key_press)
{
key_state=0;
key_time1=0;
}
else if ( key_time1=50)
{
key_return=2;
key_time1=0;
}
break;
case 3: //狀態3:雙按的第二次按鈕輸入前的等待間隙,設定100ms(經過測試,100ms為比較合適的時間間隙,即為人體普通可以雙擊的速度
if(key_press)key_state=4; //在此時間,如果有按鈕被按下,將當作釋放抖動,轉4進一步作出判斷
else if ( key_time04) //如果沒有按鈕被按下,則等待此100ms過去,然後轉5
{
key_state=5;
key_time0=0;
}
break;
case 4: //狀態4:第二按的消抖處理
if(key_press)key_state=2; //快速連按(被認為人手指達不到要求的速率)將被返回到2,當作第一按處理
else key_state=3; //如果第二按只出現一次,不到10ms,消抖
break;
case 5: //狀態5:第二按前等待時間到達,進入正常的第二按等待輸入狀態,第二按只允許在此時間內輸入方為有效
if(key_press)key_state=6; //此時間內有被按下,轉6,判決抖動;
else if( key_time014) //無輸入,則等待輸入有效時間過去,時間滿後,判定為單按,返回值1,狀態位回到0
{
key_state=0;
key_time0=0; //雙擊間隔時間一般為100ms,能夠穩定做到第二擊完成時間總共約180~200ms(因人而異)
key_return=1; //為增加取樣成功率,可適當縮短第二按前的間隙時間,增加第二按等待輸入時間,但總時間不可短於150ms
} //小於150ms,手指將很難達到雙擊的速度要求,如果時間太長則單按判斷時間過長,按鈕不靈敏,此處180ms經測試較為合適
break;
case 6: //狀態6:第二按的抖動判斷
if(key_press) //按鈕仍有效,按下有效,返回3,雙按成立,轉7等待按鈕釋放
{
key_state=7;
key_return=3;
}
else key_state=5; //抖動消除,退回5繼續等待輸入或等待輸入有效時間過去
case 7: //按鈕釋放等待狀態,所有已按下並被識別操作目的的按鈕狀態都將轉到7等待按鈕釋放,並將所有計時初始
if(!key_press)key_state=0;
key_time1=0;
key_time0=0;
break;
}
return key_return;
}
int main(void)
{
MCU_init();
timer0_init();
timer1_init();
timer2_init();
sei();
while(1)
{
if(timeOK)
{
cli();
uchar key;
key=key_scan();
if(key0)PORTD=seg_code[key];
switch(key)
{
case 1:
TIMSK^=((1OCIE0)|(1TOIE1)); DDRB^=(1DDB3); PORTC=0xfd;
break;
case 2:
//TIMSK|=((1OCIE0)&(1TOIE1));
if(i1)i =10;
if (i=(sizeof(music)-20))
{
i=1;
TIMSK&=(~((1OCIE0)|(1TOIE1)));
DDRB&=~(1DDB3);
}
PORTC=0xf0;
break;
case 3:
TIMSK&=(~((1OCIE0)|(1TOIE1)));
i=1;
TIMSK|=((1OCIE0)|(1TOIE1));
PORTC=0xfe;
break;
default:
break;
}
timeOK=0;
sei();
}
}
}
蘋果11的鬧鐘設定每天鬧一次非常簡單,只需要按照以下步驟即可:1.開啟“時鐘”應用程式,點選“鬧鐘”選項卡。2.點選“+”按鈕新增一個新的鬧鐘。3.調整鬧鐘的時間和其他設定,例如鈴聲和震動。4.確保“重複”選項被選中。5.點選“自定義”選項...
兩個人同時拉黑刪除對方,那麼他們兩個人將再也不會是好友了,因為兩個人同時把對方拉出刪除了,拉黑了,那麼兩個人就再也聯絡不上了,也就是說,兩個人的通訊錄裡邊都是找不到彼此了,如果你沒有把他的電話接到腦子話,你叫永遠不知道他的電話號碼是多少?如...
在網路上,比如MSN、手機、微博、QQ等,雙方都刪除作為好友的對方,表示解除關係不再聯絡。刪shān會意。從刀從冊。冊是簡冊,把若干竹簡編穿在一起叫“冊”。簡冊的內容有問題,就用刀除掉,所以從“刀”。本義:削除。【釋義】去掉多餘或不恰當的字...
有以下兩種操作解決辦法:1、設定影片位元率,把影片位元率設定到高於2100以後,清晰度已經到達可以接受的程度。數字越大,影片清晰度越高,但是也要考慮到網路上行速度的感受。2、提高OBS當中其他的硬體引數:除了位元速率之外,如果有一個好的顯示...
答:關於OPPO手機怎麼設定直播清晰的具體分析如下:1.確保網路連線良好:網路狀況是影響直播清晰度的重要因素。在進行直播前,確保您的手機已連線到高速、穩定的Wi-Fi或移動資料網路,並且網路訊號強度良好。2.調整攝像頭焦距:有些手機可能支援...
&您好,強制解除小米裝置鎖定方法如下:方法一:1、首先開啟小米官網並登入,接著點選人工客服。&2、然後選擇小米手機,輸入裝置鎖定併發送。&3、點選申訴解鎖資訊裡藍色字型的點選這裡。&4、最後點選立即解鎖,下載解鎖工具,按照提示解鎖即可。&5...
1、滑鼠右擊電腦桌面右下角顯示器一樣的網路圖示。2、右擊圖示後,會彈出選單欄,點選選單欄的【開啟“網路和Internet”設定】。3、在網路和Internet設定面板的左側,點選【乙太網】。4、點選相關設定下面的【網路和共享中心】。5、在檢...
蘋果手機一般用到自動關機後,插上電源需要10分鐘左右機器才會自動開機,蘋果手機充電注意事項如下:1、第一次充電,有4、5小時就夠了,不必充12小時以上。2、平時隨用隨充,每一個月要用完一次,完整的充一次。3、儘量不要睡覺充,如果實在是沒辦法...
一、如果使計算機日期與時間自動更新? 1、右鍵桌面“時間”,單擊“調整時期/時間“。 2、在開啟的對話方塊中,選中”Interner時間“,單擊”更改設定“,勾選“與Interner時間伺服器同步”然後選擇伺服器地址後,單擊“立即更...
要檢視小米14手機的系統是否是最新版本,可以進入手機的“設定”選單,然後選擇“關於手機”選項。在“關於手機”中,可以找到“系統更新”選項,點選進入後系統會自動檢查更新,並顯示當前系統的版本資訊。如果有新版本可用,會提示使用者進行更新。另外,...