c语言0x7f是什么意思 51单片机idata怎么用?

[更新]
·
·
分类:互联网
2213 阅读

c语言0x7f是什么意思

51单片机idata怎么用?

51单片机idata怎么用?

data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。
idata是用类似C中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
xdata: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
code 是在 0000H .. 0FFFFH 之间的一个代码地址,程序存储区 (64k 地址范围),对应汇编指令
MOVC @DPTR

ascii最大的码值是什么?

ASCII码最大的是127。ASCII是基于拉丁字母的一套电脑编码系统,它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符,标准ASCII码也叫基础ASCII码,所以基础ascii码值最大值是0x7f127,扩展ASCII码值最大值是0xFF255。查询ASCII技巧,方便查询ASCII码对应的字符:新建一个文本文档,按住ALT 要查询的码值

向单片机高手求助,怎样用C语言编写歌曲程序和歌曲代码?需要用那些工具怎么样编写的要求详细解答。谢谢?

//绝对调试通过,AVR-GCC,mega16,带数码显示,单键开关多功能控制
#include ltavr/io.hgt
#include ltavr/interrupt.hgt
#include lttone.hgt
#include ltavr/pgmspace.hgt
#define uchar unsigned char
#define uint unsigned int
#define key_input PINA
#define pgm16(A) ((typeof(A))pgm_read_word(amp(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,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(极短暂的
volatile uint i1
volatile uchar timeOK0
uchar key_scan(void)
ISR(TIMER0_COMP_vect)ttt//CTC模式,控制音调高低
{
OCR0pgm16(music[i-1])
}
ISR(TIMER1_OVF_vect)ttt//时间溢出模式,控制节拍长短
{t
i 2
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))
else TIMSK|(1ltltOCIE0)
}
ISR(TIMER2_OVF_vect)tt//时间溢出模式,用于检测按键,周期10ms
{
TCNT2100
timeOK1
}
void timer0_init(void)
{
TCCR00x00
TCNT00x00
OCR0pgm16(music[i-1])
TCCR00x1a
//TIMSK|(1ltltOCIE0)
}
void timer1_init(void)
{
TCCR1B0x00
TCNT1H(65536-pgm16(music[i]))/256
TCNT1L(65536-pgm16(music[i]))%6
TCCR1A0x00
TCCR1B0x05
//TIMSK|(1ltltTOIE1)
}
void timer2_init(void)
{
TCCR20x00
TCNT2100
TCCR20x03
TIMSK|(1ltltTOIE2)
}
void MCU_init(void)
{
DDRA0X00
DDRB0X00
DDRC0XFF
DDRD0XFF
PORTB0X00
PORTC0xfe
PORTD0xff
}
uchar key_scan(void)ttt//按钮扫描函数
{
static uchar key_state0,key_time10,key_time00tt//静态变量,调用以后,值被保留
uchar key_press,key_return0
key_press(~key_input)0x01tt//有键1,无键0
switch(key_state)ttt//状态机
{
case 0:tttttttt//状态0:无按钮按下状态
if(key_press)key_state1
break
case 1:tttttttt//状态1:检测到有按钮被按下t
if(key_press)ttttttt//按钮仍按下,转2
{
//TIMSK^(1ltltTOIE0)
key_state2
key_time10tttttt//按下时间初始
}
elsettttttttt//按钮已经释放,消抖
key_state0
break
case 2:tttttttt//状态2:等待释放或等待按下时间达到长按要求
if(!key_press)ttttttt//按钮已经释放,转3,继续判断是双按还是单按
{
key_state3
key_time00tttttt//释放时间初始
}
else if ( key_time1gt100)tttt//按下时间达到1000ms,返回值2,作长按判断,转7等待按钮释放
{
key_state8tttttt
key_time10
key_return2
}
break
case 8:
if(!key_press)
{
key_state0
key_time10
}
else if ( key_time1gt50)
{
key_return2
key_time10
}
break
case 3:tttttttt//状态3:双按的第二次按钮输入前的等待间隙,设定100ms(经过测试,100ms为比较合适的时间间隙,即为人体普通可以双击的速度
if(key_press)key_state4tt//在此时间,如果有按钮被按下,将当作释放抖动,转4进一步作出判断
else if ( key_time0gt4)tt//如果没有按钮被按下,则等待此100ms过去,然后转5
{
key_state5
key_time00
}
break
case 4:tttttttt//状态4:第二按的消抖处理
if(key_press)key_state2tt//快速连按(被认为人手指达不到要求的速率)将被返回到2,当作第一按处理
else key_state3tttt//如果第二按只出现一次,不到10ms,消抖
break
case 5:tttttttt//状态5:第二按前等待时间到达,进入正常的第二按等待输入状态,第二按只允许在此时间内输入方为有效
if(key_press)key_state6tt//此时间内有被按下,转6,判决抖动
else if( key_time0gt14)ttt//无输入,则等待输入有效时间过去,时间满后,判定为单按,返回值1,状态位回到0
{
key_state0
key_time00tttt//双击间隔时间一般为100ms,能够稳定做到第二击完成时间总共约180~200ms(因人而异)
key_return1tttt//为增加采样成功率,可适当缩短第二按前的间隙时间,增加第二按等待输入时间,但总时间不可短于150ms
}tttttttt//小于150ms,手指将很难达到双击的速度要求,如果时间太长则单按判断时间过长,按钮不灵敏,此处180ms经测试较为合适
break
case 6:tttttttt//状态6:第二按的抖动判断
if(key_press)tttttt//按钮仍有效,按下有效,返回3,双按成立,转7等待按钮释放
{
key_state7
key_return3
}
else key_state5ttttt//抖动消除,退回5继续等待输入或等待输入有效时间过去
case 7:tttttttt//按钮释放等待状态,所有已按下并被识别操作目的的按钮状态都将转到7等待按钮释放,并将所有计时初始
if(!key_press)key_state0
key_time10
key_time00
break
}
return key_return
}
int main(void)
{
MCU_init()
timer0_init()
timer1_init()
timer2_init()
sei()
while(1)
{
if(timeOK)
{
cli()
uchar key
keykey_scan()
if(keygt0)PORTDseg_code[key]
switch(key)
{
case 1:
TIMSK^((1ltltOCIE0)|(1ltltTOIE1)) ttttttDDRB^(1ltltDDB3)ttttttttPORTC0xfd
break
case 2:
//TIMSK|((1ltltOCIE0)amp(1ltltTOIE1))
if(igt1)i 10
if (igt(sizeof(music)-20))
{
i1
TIMSKamp(~((1ltltOCIE0)|(1ltltTOIE1)))
DDRBamp~(1ltltDDB3)
}
PORTC0xf0
break
case 3:
TIMSKamp(~((1ltltOCIE0)|(1ltltTOIE1)))
i1
TIMSK|((1ltltOCIE0)|(1ltltTOIE1))
PORTC0xfe
break
default:
break
}
timeOK0
sei()
}
}
}