玄狼剑 发表于 2008-1-25 00:11:53

NC3000的lava通讯函数

这是我自己写的nc3000的lava通讯函数
使用yan的编译器编译
#begin 0x89f0
int inadd;
#end

//汇编缓存
char asm;

//汇编调用
void exeasm(int addre)
{
inadd=addre;
#code{0xcc};
}

//打开端口
void ComOpen(char mode)
{
//mode=0        BaudRate=
//mode=1        BaudRate=115200
//mode=0xf        BaudRate=921600
#loaddata asm=

{0x8,0xa5,0x0,0x48,0xa5,0xa,0x48,0xad,0x36,0x4,0x9,0x8,0x85,0x18,0x8d,0x36,0x4,0xa9,0xf

f,0x85,0x60,0xa5,0x3d,0x29,0xfc,0x9,0x2,0x85,0x3d,0xa9,0x20,0x85,0x3c,0xa9,0x2,0x85,0x3

d,0xa5,0x3d,0x29,0xfc,0x9,0x1,0x85,0x3d,0xa9,0x0,0x85,0x3b,0xa5,0x3d,0x29,0xfc,0x9,0x0,

0x85,0x3d,0xa5,0x3d,0x9,0x4,0x85,0x3d,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x1,0x85,0x3d,0x

68,0x28,0xa9,0x30,0x85,0x3d,0xea,0xea,0xea,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa5,0

x3b,0xc9,0x60,0xf0,0x23,0xa5,0x3d,0x29,0xfb,0x85,0x3d,0xea,0xea,0xea,0xea,0xa5,0x3d,0x9

,0x4,0x85,0x3d,0xa0,0x4,0xa2,0xc8,0x20,0xba,0xe0,0xa5,0x3b,0xc9,0x60,0xf0,0x6,0xca,0xd0

,0xf4,0x88,0xd0,0xef,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa9,0x23,0x85,0x3b,0xa5,0x3

d,0x29,0xfc,0x9,0x1,0x85,0x3d,0xa9,0xff,0x85,0x3a,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d

,0xa9,0x2,0x85,0x3c,0xa9,0x80,0x85,0x17,0x68,0x85,0xa,0x68,0x85,0x0,0x28,0x60};
asm=mode;
exeasm(asm);
}

//读取一个字节
char ComGetc()
{
char word;
#loaddata asm=

{0xa9,0x0,0x8d,0x24,0x4,0x85,0xc7,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa5,0x3c,0x29,

0x10,0xd0,0x13,0xad,0x24,0x4,0xc9,0x6,0xf0,0xa,0xa5,0xc7,0x29,0x7f,0x85,0xc7,0xc9,0x1b,

0xd0,0xe9,0x38,0x60,0xa5,0x3a,0x18,0x8d,0xff,0xff,0x60};
asm=(&word)&0xff;
asm=(&word)>>8;
exeasm(asm);
return(word);
}

//关闭端口
void ComClose()
{
#loaddata asm=

{0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa5,0x3d,0x29,0xfb,0x85,0x3d,0xa5,0x3d,0x29,0xf

c,0x9,0x2,0x85,0x3d,0xa9,0x0,0x85,0x3c,0x60};
exeasm(asm);
}

//写一个字节
void ComPutc(char word)
{
#loaddata asm=

{0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa5,0x3b,0x29,0x60,0xc9,0x60,0xd0,0xf8,0xad,0xf

f,0xff,0x85,0x3a,0x60};
asm=(&word)&0xff;
asm=(&word)>>8;
exeasm(asm);
}

//写一段数据
void ComWrite(char &data[],int len)
{
#loaddata asm=

{0xa5,0x80,0x48,0xa5,0x81,0x48,0xa5,0x82,0x48,0xa5,0x83,0x48,0xad,0xff,0xff,0x85,0x80,0

xad,0xff,0xff,0x85,0x81,0xa9,0xff,0x85,0x82,0xa9,0xff,0x85,0x83,0xa0,0x0,0xb1,0x82,0x48

,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa5,0x3b,0x29,0x60,0xc9,0x60,0xd0,0xf8,0x68,0x8

5,0x3a,0xa9,0x0,0x8d,0xf6,0x3,0xe6,0x82,0xd0,0x2,0xe6,0x83,0xa5,0x80,0xd0,0x2,0xc6,0x81

,0xc6,0x80,0xa5,0x80,0x5,0x81,0xd0,0xd1,0x68,0x85,0x83,0x68,0x85,0x82,0x68,0x85,0x81,0x

68,0x85,0x80,0x60};
asm=(&len)&0xff;
asm=(&len)>>8;
asm=((&len)+1)&0xff;
asm=((&len)+1)>>8;
asm=data&0xff;
asm=data>>8;
exeasm(asm);
}

//读取一段数据,返回读取的数据长度
int ComRead(char &data[],int len)
{
int temp;
#loaddata asm=

{0xa5,0x80,0x48,0xa5,0x81,0x48,0xa5,0x82,0x48,0xa5,0x83,0x48,0xa9,0x0,0x85,0x80,0x85,0x

81,0xa9,0xff,0x85,0x82,0xa9,0xff,0x85,0x83,0xa0,0x0,0xa9,0x0,0x8d,0x24,0x4,0x85,0xc7,0x

a5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa5,0x3c,0x29,0x10,0xd0,0x14,0xad,0x24,0x4,0xc9,0x

6,0xf0,0xa,0xa5,0xc7,0x29,0x7f,0x85,0xc7,0xc9,0x1b,0xd0,0xe9,0x38,0xb0,0x24,0xa5,0x3a,0

x18,0xb0,0x1f,0x91,0x82,0xa9,0x0,0x8d,0xf6,0x3,0xe6,0x80,0xd0,0x2,0xe6,0x81,0xe6,0x82,0

xd0,0x2,0xe6,0x83,0xa5,0x80,0xc9,0xff,0xd0,0xb9,0xa5,0x81,0xc9,0xff,0xd0,0xb3,0xa5,0x80

,0x8d,0xff,0xff,0xa5,0x81,0x8d,0xff,0xff,0x68,0x85,0x83,0x68,0x85,0x82,0x68,0x85,0x81,0

x68,0x85,0x80,0x60};
asm=data&0xff;
asm=data>>8;
asm=(&len)&0xff;
asm=(&len)>>8;
asm=(&temp)&0xff;
asm=(&temp)>>8;
asm=((&temp)+1)&0xff;
asm=((&temp)+1)>>8;
exeasm(asm);
return(temp);
}


void ComWaitReady()
{
#loaddata asm=
{0xa5,0x3d,0x29,0xfc,0x85,0x3d,0xa5,0x3b,0x29,0x7,0xd0,0x9,0xa5,0x3b,0x29,0xcb,0xc9,0xc

b,0xd0,0xec,0x60,0xa9,0x1,0x60};
}

//校检函数
char ComXor(char &data[],int size)
{
char crc;
int i;
for(i=0;i<size;i++)
{
crc=crc^data [ i ];
}
return crc;
}

[ 本帖最后由 玄狼剑 于 2008-1-25 15:38 编辑 ]

yan 发表于 2008-1-25 08:15:55

这样不好,每执行一次函数都要载入一次汇编代码。

玄狼剑 发表于 2008-1-25 12:23:53

那应该怎么改?

leesoft 发表于 2008-1-25 12:39:48

把载入与执行分开

红色激情 发表于 2008-1-25 13:04:31

leesoft 发表于 2008-1-25 13:18:58

辩论其实主要是逻辑学范畴

yan 发表于 2008-1-25 13:39:19

原帖由 leesoft 于 2008-1-25 12:39 发表 http://www.emsky.net/bbs/images/common/back.gif 把载入与执行分开 就是,应该加载到$19c0以前的内存中。

zlpandfzs 发表于 2009-7-15 20:59:38

回复 4# 的帖子

LEE老大,我看到你了,虽然这是08年的

ailaily 发表于 2010-12-17 15:41:14

能不能用BASIC实现啊?

POTO 发表于 2010-12-17 20:21:36

原帖由 ailaily 于 2010-12-17 15:41 发表 http://bbs.emsky.net/images/common/back.gif
能不能用BASIC实现啊?
POKE再加上CALL就行。

wehiue 发表于 2010-12-17 22:15:03

我怎么记着BASIC调用系统的通讯后会出错?

没看清,代码里没调用系统中断……
=============
本来还指望这学期能够玩玩串口或者红外呢,结果才学到1602就算完了,并且我到现在为止还没能成功在1602上写一个字母呢

[ 本帖最后由 wehiue 于 2010-12-17 22:30 编辑 ]

玄狼剑 发表于 2011-1-20 14:23:59

现在再看,都不知道当年写的什么东西了....甚至不记得有写过...

tl2655600 发表于 2011-1-23 15:46:19

同感阿同感
页: [1]
查看完整版本: NC3000的lava通讯函数