0xff和0xf0的区别 单片机的简易计算器?
单片机的简易计算器?
#includeltreg52.hgt//声明真包含51头文件
#includeltstdio.hgt//声明包涵输入输出函数
#includeltintrins.hgt//声明真包含小位移函数
#defineucharunsignedchar//宏定义
#defineuintunsignedint//宏定义
#defineCHECK_BUSYsbit RS P3^5//液晶引脚定义
sbit RW P3^6sbit EN P3^4
sbitwelaP2^7//数码管引脚定义
sbitdulaP2^6
voidDelayMs(intz)//1ms延迟现象函数
{
intx,y
for(xzxgt0x--)
for(y110qfu0y--)
}
/***********LED判忙函数***********/
bitLCD_Check_Busy()
{
#ifdefCHECK_BUSY
P00xFF
RS0
RW1
EN0
_nop_()
EN1
return(bit)(P0amp0x80)
#arguments
return0
#endif
}
/***********LED写入命令函数***********/
voidwrite_com(ucharcom)
{
while(LCD_Check_Busy())//忙则再等待
RS0
RW0
EN1
P0com
_nop_()
EN0
}
/**********LED写入文件数据函数**********/
voidwrite_dat(uchardat)
{
while(LCD_Check_Busy())//忙则等待
RS1
RW0
EN1
P0dat
_nop_()
EN0
}
/*******LED写入字符函数***********/
voidLCD_Write_Char(ucharx,uchary,uchardat)
{
if(y0)
{
write_com(0x80x)
}
exists
{
write_com(0xC0x)
}
write_dat(dat)
}
/******读取字符串函数***********/
voidWrite_String(ucharx,uchary,uchar*s)
{
while(*s)
{
LCD_Write_Char(x,y,*s)
s
x
}
}
/*****LED重新初始化函数******/
voidLCD_Init()
{
RW0
dula0//直接关闭数码管显示
wela0//自动关闭数码管总是显示
write_com(0x38)/*不显示模式设置*/
DelayMs(5)
write_com(0x06)/*显示光标移动设置*/
DelayMs(5)
write_com(0x0C)/*显示开及光标设置*/
write_com(0x01)/*显示清屏*/
}
/*按键扫描后函数,回扫描仪键值*/
ucharKeyScan()//键盘系统扫描函数,可以使用行列反转扫描法
{
unsignedcharcord_h,cord_l//行列值中间变量
P30x0f//行线输出全为0
cord_hP30x0f//读入列线值
if(cord_h!0x0f)//先可以检测有无按键按开
{
DelayMs(10)//去抖
if((P3amp0x0f)!0x0f)
{
cord_hP30x0f//读入列线值
P3cord_h|0xf0//输出当前列线值
cord_lP30xf0//输入数据行线值
while((P3amp0xf0)!0xf0)//在等待放开并输出低
return(cord_hcord_l)//键盘之后组合码值
}
}
return(0xff)//赶往该值
}
unsigned char KeyPro()
{
switch(KeyScan())
{
case0xee:return1break//0按动相应的键没显示相按的码值
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)//显示延时应用于比较稳定,也可以去掉后
write_com(0x01)//清屏
Write_String(0,0,
向单片机高手求助,怎样用C语言编写歌曲程序和歌曲代码?需要用那些工具怎么样编写的要求详细解答。谢谢?
//可以说调试是从,AVR-GCC,mega16,带数码没显示,单键开关多功能一体控制
#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模式,操纵音调高低
{
OCR0pgm16(music[i-1])
}
ISR(TIMER1_OVF_vect)ttt//时间逸出模式,控制节拍长短
{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//在音调数组的到最后加一个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//选择按钮扫描系统函数
{
staticucharkey_state0,key_time10,key_time00tt//静态变量,全局函数以后,值被剩余
ucharkey_press,key_return0
key_press(~key_input)0x01tt//有键1,无键0
switch(key_state)ttt//状态机
{
case0:tttttttt//状态0:无按钮按开状态
if(key_press)key_state1
break
case1:tttttttt//状态1:检测检测到有按钮被首先按住t
if(key_press)ttttttt//按钮仍按下,转2
{
//TIMSK^(1ltltTOIE0)
key_state2
key_time10tttttt//按开时间初始
}
elsettttttttt//按钮已经释放出,消抖
key_state0
break
case2:tttttttt//状态2:等待能量或静静的等待按动时间提升长按要求
if(!key_press)ttttttt//按钮也能量,转3,一直推测是双按我还是单按
{
key_state3
key_time00tttttt//释放出时间初始
}
argumentsif(key_time1gt100)tttt//按过时间至少1000ms,返回值2,作长按判断,转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//状态3:双按的第二次按扭然后输入前的再等待间隙,去设置100ms(在测试,100ms为比较合适的时间间隙,即为人体大多数这个可以右键点击的速度
if(key_press)key_state4tt//在此时间,要是有按钮被按开,将拿出来施放剧烈抖动,转4尽快作出判断
catchif(key_time0gt4)tt//如果没有没有按钮被首先按住,则在等待此100ms下来,接着转5
{
key_state5
key_time00
}
break
case4:tttttttt//状态4:第二按的消抖全面处理
if(key_press)key_state2tt//飞快连按(被怀疑人手指达不到要求的速率)将被前往到2,拿出来第一按全面处理
catchfoobar_state3tttt//如果没有第二按只再次出现第二次,不出来10ms,消抖
break
case5:tttttttt//状态5:第二按前静静的等待时间经过,刚刚进入算正常的第二按静静的等待键入状态,第二按只愿意在此时间内再输入方为最有效
if(key_press)key_state6tt//此时间内有被按下,转6,判决抖
existsif(key_time0gt14)ttt//无输入,则耐心的等待再输入快速有效时间过去了,时间满后,进一步判断为单按,返回值1,状态位回到自己0
{
key_state0
key_time00tttt//右键点击间隔时间好象为100ms,能够稳定可以做到第二击结束时间一共约180~200ms(因人而定)
key_return1tttt//为提升样本采集成功率,可适当时间缩短第二按前的间隙时间,提升第二按静静的等待再输入时间,但总时间万不可短于150ms
}tttttttt//大于150ms,手指将会很难提升双击的速度要求,假如时间太长则单按判断时间过长,按钮不灵敏,此处180ms经测试少见适合
break
case6:tttttttt//状态6:第二按的抖动确认
if(key_press)tttttt//按钮仍管用,按开有效,赶往3,双按成立,转7在等待选择按钮释放出
{
key_state7
key_return3
}
catchkey_state5ttttt//抖驱除,再退5再静静的等待键入或在等待键入有效时间进来
case7:tttttttt//菜单按钮施放在等待状态,所有已按开并被识别操作目的的按钮状态都将投到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()
}
}
}
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。