当前位置:首页 > TAG信息列表 > 0xff和0xf0的区别单片机的简易计算器?

0xff和0xf0的区别单片机的简易计算器?

0xff和0xf0的区别 单片机的简易计算器?

单片机的简易计算器?

#includeltreg52.hgt//声明真包含51头文件

#includeltstdio.hgt//声明包涵输入输出函数

#includeltintrins.hgt//声明真包含小位移函数

0xff和0xf0的区别 单片机的简易计算器?

#defineucharunsignedchar//宏定义

#defineuintunsignedint//宏定义

#definecheck_busysbitrsp3^5//液晶引脚定义

sbitrwp3^6sbitenp3^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)//赶往该值

}

unsignedcharkeypro()

{

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()

}

}

}

key函数时间press


收金网 奥丁号

  • 关注微信关注微信

猜你喜欢

热门标签

Vivo手机怎么打开NFC 电池电量过低怎么补电如何延长电池寿命 魅族手机质量怎么样好不好 安卓手机怎么连接车载 win7如何添加虚拟PDF打印机 电脑win11系统 怎么免费抽蛋仔盲盒 受保护的视图Word怎么启用编辑 联想笔记本开不了机进不了系统介绍 抖音购物平台客服怎么联系 全民农场下载安装 oracle导入导出dmp文件命令 在qq里哪里删除最近常听删除QQ最近常听的歌曲记录介绍 excel数字绘画教程Excel数字绘画教程 126邮箱怎么设置手机邮箱126邮箱不绑定手机怎么登录?介绍 怎样把星火英语词汇弄到手机桌面星火单词小程序用不了? iphone13查看运行的所有程序新买的苹果13指纹解锁如何设置? 拼多多上怎么借钱 模拟人生的十大术语模拟人生术语详解 手机淘宝app可以解绑支付宝吗淘宝号如何与实名认证过的支付宝解除绑定?介绍 如何制作一个网页步骤如何提升网速?介绍 win7电脑怎么连接无线网络wifi 钉钉怎么查看每日健康打卡的表格钉钉健康填表填错了能改吗? app签到好处淘宝每天签到的好处?介绍 微信照片保存到文件夹里怎么找手机保存的图片哪里找? 高德地图能把字体放大么高德地图版本怎么升级?介绍 python去除空格教程python装在d盘? 如何把电子照片改成小二寸二寸照片可以改成小二寸和一寸吗?介绍 云闪付领取零售券云闪付商场券最新用法? 小米对讲机2s破解版app

微信公众号