易码技术论坛

 找回密码
 加入易码
搜索
查看: 2050|回复: 12

[源码] NC3000的lava通讯函数

[复制链接]
发表于 2008-1-25 00:11:53 | 显示全部楼层 |阅读模式
这是我自己写的nc3000的lava通讯函数
使用yan的编译器编译
#begin 0x89f0
int inadd;
#end

//汇编缓存
char asm[179];

//汇编调用
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[152]=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[44]=(&word)&0xff;
asm[45]=(&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[17]=(&word)&0xff;
asm[18]=(&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[13]=(&len)&0xff;
asm[14]=(&len)>>8;
asm[18]=((&len)+1)&0xff;
asm[19]=((&len)+1)>>8;
asm[23]=data&0xff;
asm[27]=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[19]=data&0xff;
asm[23]=data>>8;
asm[96]=(&len)&0xff;
asm[102]=(&len)>>8;
asm[108]=(&temp)&0xff;
asm[109]=(&temp)>>8;
asm[113]=((&temp)+1)&0xff;
asm[114]=((&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 编辑 ]
发表于 2008-1-25 08:15:55 | 显示全部楼层
这样不好,每执行一次函数都要载入一次汇编代码。
 楼主| 发表于 2008-1-25 12:23:53 | 显示全部楼层
那应该怎么改?
发表于 2008-1-25 12:39:48 | 显示全部楼层
把载入与执行分开
发表于 2008-1-25 13:04:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-1-25 13:18:58 | 显示全部楼层
辩论其实主要是逻辑学范畴
发表于 2008-1-25 13:39:19 | 显示全部楼层
原帖由 leesoft 于 2008-1-25 12:39 发表 把载入与执行分开
就是,应该加载到$19c0以前的内存中。
发表于 2009-7-15 20:59:38 | 显示全部楼层

回复 4# 的帖子

LEE老大,我看到你了,虽然这是08年的
发表于 2010-12-17 15:41:14 | 显示全部楼层
能不能用BASIC实现啊?
发表于 2010-12-17 20:21:36 | 显示全部楼层
原帖由 ailaily 于 2010-12-17 15:41 发表
能不能用BASIC实现啊?

POKE再加上CALL就行。
发表于 2010-12-17 22:15:03 | 显示全部楼层
我怎么记着BASIC调用系统的通讯后会出错?

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

[ 本帖最后由 wehiue 于 2010-12-17 22:30 编辑 ]
 楼主| 发表于 2011-1-20 14:23:59 | 显示全部楼层
现在再看,都不知道当年写的什么东西了....甚至不记得有写过...
发表于 2011-1-23 15:46:19 | 显示全部楼层
同感阿同感
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-28 20:53 , Processed in 0.010834 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表