-
同意LS们……
-
极具参考价值,腾出时间来我也研究下,我要解决的问题是把我下面的函数运行效率提高
//将矩形显存从源地址拷贝到目标地址,规定了起始地址、目标地址和矩形的面积:
//pFrom - 源显存首地址,即 (xFrom, yFrom) 为 (0, 0) 的位置
//xFrom - 源矩形左下角 X 轴坐标(基于像素)
//yFrom - 源矩形左下角 Y 轴坐标(基于像素)
//HeightFrom - 源显存行高度(该高度跟定位同行相邻字节有关)
//pTo - 目标显存首地址,即 (xTo, yTo) 为 (0, 0) 的位置
//xTo - 目标矩形左下角 X 轴坐标(基于像素)
//yTo - 目标矩形左下角 Y 轴坐标(基于像素)
//HeightTo - 目标显存行高度(该高度跟定位同行相邻字节有关)
//width - 矩形像素宽度
//height - 矩形像素高度
//
//目标: Y
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................**********************..........
// ...................................**********************..........
// ...................................**********************..........
// ...................................**********************..........
// 0 ................................................................... X
// 0
//
//源: Y
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ...................................................................
// ..................**********************...........................
// ..................**********************...........................
// ..................**********************...........................
// ..................**********************...........................
// 0 ................................................................... X
// 0
//上面所示(单位:像素),将标有'*'的源矩形显存拷贝到目标矩形显存,则:
//xFrom - 18
//yFrom - 1
//HeightFrom - 14
//xTo - 35
//yTo - 1
//HeightTo - 8
//width - 22
//height - 4
////////////////////////////////////////////////////////////////////////////////
void CopyRectDisplayMemory(u8 *pFrom, u16 xFrom, u16 yFrom, u16 HeightFrom, u8* pTo, u16 xTo, u16 yTo, u16 HeightTo, u16 width, u16 height)
{
u8 *pRowHeadFrom, *pRowHeadTo; //指向源、目标矩形每一行点阵第1个字节的指针
u8 bitsLeftFrom, bitsRightFrom; //源矩形显存每个字节由左右两部分组成
u8 bitsLeftTo, bitsRightTo; //目标矩形显存每个字节由左右两部分组成
u8 byteFrom, byteBack; //源字节显存和目标字节备份显存
u16 i, j;
bitsLeftFrom = 8 - xFrom%8; //6,源矩形显存每个字节由左(侧字节低)6位和右(侧字节高)2位组成
bitsRightFrom = xFrom%8; //2
bitsLeftTo = 8 - xTo%8; //5,目标矩形显存每个字节由左(侧字节低)5位和右(侧字节高)3位组成
bitsRightTo = xTo%8; //3
for(i=0; i<height; i++) //height行
{
StaticScan();
pRowHeadFrom = pFrom;
pRowHeadFrom += (xFrom/8)*HeightFrom;
pRowHeadFrom += yFrom;
pRowHeadFrom += i; //每行源显存第一个(左6位所在)字节位置
pRowHeadTo = pTo;
pRowHeadTo += (xTo/8)*HeightTo;
pRowHeadTo += yTo;
pRowHeadTo += i; //每行目标显存第一个(左5位所在)字节位置
for(j=0; j<(width/8); j++) //先复制整8位列
{ //提取源字节数据(左6位+右2位 组成新的字节保存到 byteFrom)
byteFrom = (*pRowHeadFrom) << bitsRightFrom; //取左边字节的低6位
pRowHeadFrom += HeightFrom; //偏移到右边字节
byteFrom += (*pRowHeadFrom) >> bitsLeftFrom; //取右边字节的高2位
(*pRowHeadTo) &= (0xff << bitsLeftTo); //清掉目标字节低5位
(*pRowHeadTo) += (byteFrom >> bitsRightTo); //加上源字节高5位
pRowHeadTo += HeightTo; //偏移到右边字节
(*pRowHeadTo) &= (0xff >> bitsRightTo); //清掉目标字节高3位
(*pRowHeadTo) += (byteFrom << bitsLeftTo); //加上源字节低3位
}
if(width%8) //剩余不足8位需要复制
{
byteBack = (*pRowHeadTo) << bitsRightTo; //下面备份目标字节
byteBack += (*(pRowHeadTo + HeightTo)) >> bitsLeftTo;
byteBack &= (0xff >> (width%8)); //把要填充的目标位清掉
byteFrom = (*pRowHeadFrom) << bitsRightFrom; //取左边字节的低6位
pRowHeadFrom += HeightFrom; //偏移到右边字节
byteFrom += (*pRowHeadFrom) >> bitsLeftFrom; //取右边字节的高2位
byteFrom &= (0xff << (8 - width%8)); //只保留要复制的目标位
byteFrom += byteBack; //要复制的目标位+备份目标位 组成新字节,复制到目标字节
(*pRowHeadTo) &= (0xff << bitsLeftTo); //清掉目标字节低5位
(*pRowHeadTo) += (byteFrom >> bitsRightTo); //加上源字节高5位
pRowHeadTo += HeightTo; //偏移到右边字节
(*pRowHeadTo) &= (0xff >> bitsRightTo); //清掉目标字节高3位
(*pRowHeadTo) += (byteFrom << bitsLeftTo); //加上源字节低3位
}
}
}
-
衷心谢谢你们的工作.
-
一个简单例子:
typedef enum
{
value_1=1,
value_2=2,
}my_enum_t;
void test_enum(my_enum_t my_enum)
{
}
int main()
{
test_enum(value_1|value_2);
while(1);
return 0;
}
IAR STM8,IARSTM32会出个警告:enumerated type mixed with another type
C++Builder 2010 警告:[BCC32 Warning] File1.cpp(31): W8006 Initializing my_enum_t with int
VC6.0 错误:2664: 'test_enum' : cannot convert parameter 1 from 'const int' to 'my_enum_t'
-
在网上就可以找到相当多的这种资料了。数码管和矩阵扫描,多到无法想象,本来这东西也不难。不外乎就是控制IO口而已。首先要理解,数码管就是若干段LED灯连接起来,有共阳共阴的连接法。所以,你要显示什么数据,就控制对应的IO点亮对应的灯就可以了。一般的做法就是定义一个数组。
矩阵扫描,最简单的扫描方法,就是行控制输出电平,列扫描电平,循环往复,从而确定按键位置。当然行列可换,这东西称呼不同而已。为了达到最好的效果,最好开个定时器来扫描,这样,消抖就简单一点。20ms左右 的定时,即可。简单点的话,可以不用定时器,直接在mian中循环扫描,用延时10ms来消抖。扫描按键和显示数据都在mian中的大循环实现。软件很简单,不会超过1K的代码量,两三百行代码而已。
-
无法擦除和烧录新的程序是因为你原先的程序干扰了擦除和烧录的过程。
从上电到调试器控制住芯片,已经有部分的程序已经运行了,就是这运行的部分程序干扰到了擦除和重新烧录。
如果从BOOTLOADER模式启动芯片,你原先的代码就不会运行,因此可以执行擦除和烧录。
这是很正常的。
-
可以开机的时候打开校准画面,之后把CalibrationData的值,记下来。下次make的时候直接把这个值写到注册表里面就准了啊~
或者直接把触摸屏的X+和X-两跳线对调一下吧~
-
SQLite没见过有你这样的dll名字啊。
-
我想他用于I/O两就可以的不用SPI通信,能有个报警就行啊。
-
引用 18 楼 skyler2008 的回复:
只要有兴趣就OK, 希望你的激情不减! 加油
很难说
-
好奇,关注一下!!!!!
-
引用 1 楼 sunrain_hjb 的回复:
不是单双字节的问题,那可能是char与BYTE的问题。
如前辈所说~~~~~
-
共享内存,之后中断发生后产生一个事件给线程,线程直接读取或者清空即可。
-
引用 2 楼 skynet000 的回复:
理论上是可以的。 将COM1 read出来的数据再写入COM2.
会不会是楼主的COM1和COM2的接口线接反了?
要反过来的。COM1的TX对着COM2的RX,COM1的RX对着COM2的TX才行。可以先量量看
谢谢哇
感觉好像是这样 我也确实没有改线
但是如果用普通的2个COM PORT(分别在2个普通的机器上) 就不需要改线呢?
RX和TX不也是 都是一个连接口的吗?
-
系统升级?BootLoader只能通过烧写来实现,能升级的应该只有NK.nb0或者NK.bin文件…
-
那占用的话,会占用多少啊,好像我映射的文件是好几十M的话
-
同意楼上的,写个串口程序来控制流程。用VC\VB\C#\C++ BUILDER中任何一种高级语言的控件实现就可以。
-
C++怎么看起来只有夸奖
应该说是会做很多事但大部分是背着你偷偷做
-
先查查usb的问题吧
-
把此驱动先拿掉试试看,看看是不是这个问题导致
我们平台上也是GPIO模拟I2C,查询电池电量是周期性的查询,没有任何问题