2016 - 2024

感恩一路有你

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

浏览量:1202 时间:2023-07-29 07:37:04 作者:采采

单片机的简易计算器?

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

}

}

}

key 函数 时间 press

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。