Asm/C Для AVR сойдет?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Уэф 08 ноября 2004 г. 13:08
В ответ на: Поделитесь плиз пп для PIC16 декодирования SMS (для 7 первых цифр сделал, а дальше запутался вконец) отправлено Igor_C 08 ноября 2004 г. 11:12

extern char HexToChar(char* HexStr);
extern void HexStrToStr(char* str, unsigned char len);
extern void ShlStr(char* str, unsigned char len);
extern long HexToLong(char* SMS);


void PDUToStr(char* PDU, unsigned char len)
{
HexStrToStr(PDU,len - len/8);

while(len--)
{
ShlStr(PDU++,len);
}
*PDU=0;
}
char* ConvertNum(char* Num, unsigned char len)
{
char* result;
char tmp1;
char tmp2;

len>>=1;

if(*Num == '9')
{*++Num = '+';} else {Num+=2;}

result = Num;
while(len--)
{
tmp2 = *Num;
tmp1 = *(Num+1);
*(Num++)=tmp1;
if(tmp2 == 'F')break;
*(Num++)=tmp2;
}
*Num = 0;
return(result);
}

char SMSDecode(void)
{
char *SMS;
unsigned char tmp;
asm("cli");
SMS = rx_buffer0;
tmp = (HexToChar(SMS)<<1)+4;
SMS +=tmp;
tmp = HexToChar(SMS);
if(tmp & 1)tmp++;
if((tmp > 15)||(tmp < 4))return 0;
SMS+=2;
strcpy(SMSdec.PhoneNum, ConvertNum(SMS, tmp));
SMS+= tmp+20;
tmp = HexToChar(SMS);
if(tmp != 16)return 0;
SMS+=2;
PDUToStr(SMS,tmp);
SMSdec.num = HexToLong(SMS);
SMS+=8;
SMSdec.cod = HexToLong(SMS);
asm("sei");
return 1;
}


ShlStr:
movw r30,r16

ld r16,Z
clc
sbrc r16,7
sec
andi r16,0x7F
st Z+,r16
tst r18
rjmp ShlStr2
ShlStr1:
ld r16,Z
rol r16
st Z+,r16
dec r18
ShlStr2:
brne ShlStr1
ret


HexToChar:
movw r30,r16

HexToChar1:
ld r16,Z+
ld r17,Z+

subi r16,0x30
sbrc r16,4
subi r16,7
swap r16

subi r17,0x30
sbrc r17,4
subi r17,7

or r16,r17
ret

HexToLong:
movw r30,r16
rcall HexToChar1
mov r19,r16;
rcall HexToChar1
mov r18,r16
rcall HexToChar1
mov r20,r16
rcall HexToChar1
mov r17,r20
ret

HexStrToStr:
push r26
push r27

movw r26,r16
movw r30,r16
tst r18
rjmp HexStrToStr2

HexStrToStr1:
rcall HexToChar1
st X+,r16

dec r18
HexStrToStr2:
brne HexStrToStr1

pop r27
pop r26
ret

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru