0xff和0xf0的區(qū)別 單片機的簡易計算器?
單片機的簡易計算器?#includeltreg52.hgt//聲明真包含51頭文件#includeltstdio.hgt//聲明包涵輸入輸出函數(shù)#includeltintrins.hgt//聲明真包含
單片機的簡易計算器?
#includeltreg52.hgt//聲明真包含51頭文件
#includeltstdio.hgt//聲明包涵輸入輸出函數(shù)
#includeltintrins.hgt//聲明真包含小位移函數(shù)
#defineucharunsignedchar//宏定義
#defineuintunsignedint//宏定義
#defineCHECK_BUSYsbit RS P3^5//液晶引腳定義
sbit RW P3^6sbit EN P3^4
sbitwelaP2^7//數(shù)碼管引腳定義
sbitdulaP2^6
voidDelayMs(intz)//1ms延遲現(xiàn)象函數(shù)
{
intx,y
for(xzxgt0x--)
for(y110qfu0y--)
}
/***********LED判忙函數(shù)***********/
bitLCD_Check_Busy()
{
#ifdefCHECK_BUSY
P00xFF
RS0
RW1
EN0
_nop_()
EN1
return(bit)(P0amp0x80)
#arguments
return0
#endif
}
/***********LED寫入命令函數(shù)***********/
voidwrite_com(ucharcom)
{
while(LCD_Check_Busy())//忙則再等待
RS0
RW0
EN1
P0com
_nop_()
EN0
}
/**********LED寫入文件數(shù)據(jù)函數(shù)**********/
voidwrite_dat(uchardat)
{
while(LCD_Check_Busy())//忙則等待
RS1
RW0
EN1
P0dat
_nop_()
EN0
}
/*******LED寫入字符函數(shù)***********/
voidLCD_Write_Char(ucharx,uchary,uchardat)
{
if(y0)
{
write_com(0x80x)
}
exists
{
write_com(0xC0x)
}
write_dat(dat)
}
/******讀取字符串函數(shù)***********/
voidWrite_String(ucharx,uchary,uchar*s)
{
while(*s)
{
LCD_Write_Char(x,y,*s)
s
x
}
}
/*****LED重新初始化函數(shù)******/
voidLCD_Init()
{
RW0
dula0//直接關(guān)閉數(shù)碼管顯示
wela0//自動關(guān)閉數(shù)碼管總是顯示
write_com(0x38)/*不顯示模式設(shè)置*/
DelayMs(5)
write_com(0x06)/*顯示光標移動設(shè)置*/
DelayMs(5)
write_com(0x0C)/*顯示開及光標設(shè)置*/
write_com(0x01)/*顯示清屏*/
}
/*按鍵掃描后函數(shù),回掃描儀鍵值*/
ucharKeyScan()//鍵盤系統(tǒng)掃描函數(shù),可以使用行列反轉(zhuǎn)掃描法
{
unsignedcharcord_h,cord_l//行列值中間變量
P30x0f//行線輸出全為0
cord_hP30x0f//讀入列線值
if(cord_h!0x0f)//先可以檢測有無按鍵按開
{
DelayMs(10)//去抖
if((P3amp0x0f)!0x0f)
{
cord_hP30x0f//讀入列線值
P3cord_h|0xf0//輸出當前列線值
cord_lP30xf0//輸入數(shù)據(jù)行線值
while((P3amp0xf0)!0xf0)//在等待放開并輸出低
return(cord_hcord_l)//鍵盤之后組合碼值
}
}
return(0xff)//趕往該值
}
unsigned char KeyPro()
{
switch(KeyScan())
{
case0xee:return1break//0按動相應(yīng)的鍵沒顯示相按的碼值
case0xed:return2break//1
case0xeb:return3break//2
case0x7e:returnbreak//3
case0xe7:return4break//4
case0xde:return5break//5
case0xdd:return6break//6
case0x7d:return-break//7
case0xdb:return7break//8
case0xd7:return8break//9
case0xbe:return9break//a
case0x7b:returnxbreak//b
case0xbd:return0break//c
case0xb7:returnbreak//e
case0x77:return/break//f
default:return0xffbreak
}
}
main()
{
unsignedcharnum,i,sign
unsignedc
24-bitfirstflag
floata0,b0
unsignedchars
LCD_Init()//重新初始化液晶屏
DelayMs(10)//顯示延時應(yīng)用于比較穩(wěn)定,也可以去掉后
write_com(0x01)//清屏
Write_String(0,0,
向單片機高手求助,怎樣用C語言編寫歌曲程序和歌曲代碼?需要用那些工具怎么樣編寫的要求詳細解答。謝謝?
//可以說調(diào)試是從,AVR-GCC,mega16,帶數(shù)碼沒顯示,單鍵開關(guān)多功能一體控制
#includeltavr/io.hgt
#includeltavr/interrupt.hgt
#includelttone.hgt
#includeltavr/pgmspace.hgt
#defineucharunsignedchar
#defineuintunsignedint
#definekey_inputPINA
#definepgm16(A)((typeof(A))pgm_read_word(amp(A)))
constunsignedcharseg_code[]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7f,0x3f}
constuintmusic[]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,tttttM3,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,tttttM6,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,tttttM3,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,tttttM6,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,tttttM5,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,tttttL5,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(極非常短暫的
volatileuinti1
volatileuchartimeOK0
ucharkey_scan(void)
ISR(TIMER0_COMP_vect)ttt//CTC模式,操縱音調(diào)高低
{
OCR0pgm16(music[i-1])
}
ISR(TIMER1_OVF_vect)ttt//時間逸出模式,控制節(jié)拍長短
{t
i2
TCNT1H(65536-pgm16(music[i]))/256ttttttt//普通(65536-beat[i])/256
TCNT1L(65536-pgm16(music[i]))%6tt//等同于(65536-beat[i])%6
if(pgm16(music[i])0xff)i1tttttttt//在音調(diào)數(shù)組的到最后加一個0xff,充當暫時終止信號
if(pgm16(music[i])0x00)TIMSKamp(~(1ltltOCIE0))
catchTIMSK|(1ltltOCIE0)
}
ISR(TIMER2_OVF_vect)tt//時間逸出模式,主要是用于檢測按鍵,周期10ms
{
TCNT2100
timeOK1
}
voidtimer0_init(void)
{
TCCR00x00
TCNT00x00
OCR0pgm16(music[i-1])
TCCR00x1a
//TIMSK|(1ltltOCIE0)
}
voidtimer1_init(void)
{
TCCR1B0x00
TCNT1H(65536-pgm16(music[i]))/256
TCNT1L(65536-pgm16(music[i]))%6
TCCR1A0x00
TCCR1B0x05
//TIMSK|(1ltltTOIE1)
}
voidtimer2_init(void)
{
TCCR20x00
TCNT2100
TCCR20x03
TIMSK|(1ltltTOIE2)
}
voidMCU_init(void)
{
DDRA0X00
DDRB0X00
DDRC0XFF
DDRD0XFF
PORTB0X00
PORTC0xfe
PORTD0xff
}
ucharkey_scan(void)ttt//選擇按鈕掃描系統(tǒng)函數(shù)
{
staticucharkey_state0,key_time10,key_time00tt//靜態(tài)變量,全局函數(shù)以后,值被剩余
ucharkey_press,key_return0
key_press(~key_input)0x01tt//有鍵1,無鍵0
switch(key_state)ttt//狀態(tài)機
{
case0:tttttttt//狀態(tài)0:無按鈕按開狀態(tài)
if(key_press)key_state1
break
case1:tttttttt//狀態(tài)1:檢測檢測到有按鈕被首先按住t
if(key_press)ttttttt//按鈕仍按下,轉(zhuǎn)2
{
//TIMSK^(1ltltTOIE0)
key_state2
key_time10tttttt//按開時間初始
}
elsettttttttt//按鈕已經(jīng)釋放出,消抖
key_state0
break
case2:tttttttt//狀態(tài)2:等待能量或靜靜的等待按動時間提升長按要求
if(!key_press)ttttttt//按鈕也能量,轉(zhuǎn)3,一直推測是雙按我還是單按
{
key_state3
key_time00tttttt//釋放出時間初始
}
argumentsif(key_time1gt100)tttt//按過時間至少1000ms,返回值2,作長按判斷,轉(zhuǎn)7等待選擇按鈕釋放
{
key_state8tttttt
key_time10
key_return2
}
break
case8:
if(!key_press)
{
key_state0
key_time10
}
existsif(key_time1gt50)
{
key_return2
key_time10
}
break
case3:tttttttt//狀態(tài)3:雙按的第二次按扭然后輸入前的再等待間隙,去設(shè)置100ms(在測試,100ms為比較合適的時間間隙,即為人體大多數(shù)這個可以右鍵點擊的速度
if(key_press)key_state4tt//在此時間,要是有按鈕被按開,將拿出來施放劇烈抖動,轉(zhuǎn)4盡快作出判斷
catchif(key_time0gt4)tt//如果沒有沒有按鈕被首先按住,則在等待此100ms下來,接著轉(zhuǎn)5
{
key_state5
key_time00
}
break
case4:tttttttt//狀態(tài)4:第二按的消抖全面處理
if(key_press)key_state2tt//飛快連按(被懷疑人手指達不到要求的速率)將被前往到2,拿出來第一按全面處理
catchfoobar_state3tttt//如果沒有第二按只再次出現(xiàn)第二次,不出來10ms,消抖
break
case5:tttttttt//狀態(tài)5:第二按前靜靜的等待時間經(jīng)過,剛剛進入算正常的第二按靜靜的等待鍵入狀態(tài),第二按只愿意在此時間內(nèi)再輸入方為最有效
if(key_press)key_state6tt//此時間內(nèi)有被按下,轉(zhuǎn)6,判決抖
existsif(key_time0gt14)ttt//無輸入,則耐心的等待再輸入快速有效時間過去了,時間滿后,進一步判斷為單按,返回值1,狀態(tài)位回到自己0
{
key_state0
key_time00tttt//右鍵點擊間隔時間好象為100ms,能夠穩(wěn)定可以做到第二擊結(jié)束時間一共約180~200ms(因人而定)
key_return1tttt//為提升樣本采集成功率,可適當時間縮短第二按前的間隙時間,提升第二按靜靜的等待再輸入時間,但總時間萬不可短于150ms
}tttttttt//大于150ms,手指將會很難提升雙擊的速度要求,假如時間太長則單按判斷時間過長,按鈕不靈敏,此處180ms經(jīng)測試少見適合
break
case6:tttttttt//狀態(tài)6:第二按的抖動確認
if(key_press)tttttt//按鈕仍管用,按開有效,趕往3,雙按成立,轉(zhuǎn)7在等待選擇按鈕釋放出
{
key_state7
key_return3
}
catchkey_state5ttttt//抖驅(qū)除,再退5再靜靜的等待鍵入或在等待鍵入有效時間進來
case7:tttttttt//菜單按鈕施放在等待狀態(tài),所有已按開并被識別操作目的的按鈕狀態(tài)都將投到7再等待按鈕釋放出,并將所有計時初始
if(!key_press)key_state0
key_time10
key_time00
break
}
returnkey_return
}
intmain(void)
{
MCU_init()
timer0_init()
timer1_init()
timer2_init()
sei()
while(1)
{
if(timeOK)
{
cli()
ucharkey
keykey_scan()
if(keygt0)PORTDseg_code[key]
switch(key)
{
case1:
TIMSK^((1ltltOCIE0)|(1ltltTOIE1))ttttttDDRB^(1ltltDDB3)ttttttttPORTC0xfd
break
case2:
//TIMSK|((1ltltOCIE0)amp(1ltltTOIE1))
if(igt1)i10
if(igt(sizeof(music)-20))
{
i1
TIMSKamp(~((1ltltOCIE0)|(1ltltTOIE1)))
DDRBamp~(1ltltDDB3)
}
PORTC0xf0
break
case3:
TIMSKamp(~((1ltltOCIE0)|(1ltltTOIE1)))
i1
TIMSK|((1ltltOCIE0)|(1ltltTOIE1))
PORTC0xfe
break
default:
break
}
timeOK0
sei()
}
}
}