本帖最后由 chenbb8 于 2012-8-24 19:20 编辑
虽然LZ的编程思路和一般人不一样,但是这个BUG还是来的很古怪,因此我也很感兴趣。昨晚洗完澡已经比较迟了,并且对于C51和LZ的硬件连接都不熟悉,精神也不在状态,所以放了LZ的鸽子。
今天在上网机上观察了下LZ的程序,应该没有使用专用的驱动芯片,也没有直接使用IO口驱动,
而是使用了一个叫595的数字芯片。
程序关键的zuoyi()也没发现明显的BUG。
因此偷偷的将LZ的程序拷贝的自己的电脑上分析。
将LZ程序中的seg数组和zuoyi()程序复制到DEV-C++(GCC)这个IDE上。
取消xdata声明,因为GCC没有这些奇怪的声明,并填充22个这样的字模:
{0x40,0x00,0x50,0x00,0x48,0x3F,0x48,0x00,0x40,0x00,0xFE,0xFF,0x40,0x00,0x40,0x04,
0x40,0x04,0x40,0x27,0x20,0x24,0x22,0x24,0x12,0x24,0x8A,0x27,0x06,0xF8,0x02,0x40},
然后将zuoyi()函数修改如下:(内部电脑的数据传输到上位机上要经过很复杂的审批,所以下面的修改是在上网机上改的
,因为没有编译器检查,也许会出现语法上的错误。另外建议LZ不要用大小写来区分变量,今天我的状态也不好,看的晕忽忽的)
void zuoyi()
{
u8 i,j;
u8 Bit,BIT; //定义两个位,保存移位时CY的数据
for(i=0;i<16;i++)
{
Bit=BIT=0;
for(j=22;j>0;j--)
{
Bit = seg[j-1][2*i] & 0x80; //记录最高位
seg[j-1][2*i] <<= 1; //左移将最高位移入CY
if( BIT != 0 ) seg[j-1][2*i] |= 0x01; //将上次移出的最高位移放到最低位
BIT = seg[j-1][2*i+1] & 0x80; //记录最高位
seg[j-1][2*i+1] <<= 1; //左移将最高位移入CY
if( Bit != 0 ) seg[j-1][2*i+1] |= 1; //将上次移出的最高位移放到最低位
}
seg[21][2*i]=seg[21][2*i]|BIT; //在循环结束后将最后一次移位时的CY做第一次移位的最低位
//完成一行字模的一次移位
}
}
然后在主函数中调用10次,每次调用完都将第一个字模的32个元素用printf函数打印出来。结果同样是没发现毛病,顺利的位移了。
然后又做了以下的修改,看不懂也没关系。我只是用来看下可不可以优化,等编好后才记起来:我没办法通过DEV-C++测试优化程度,在单片机里面都还可以
用定时器计算运算时间的~不过也是没有问题。
void zuoyi111()
{
u8 i,j;
u8 Bit,BIT; //定义两个位,保存移位时CY的数据asd
u8 (*p)[32] = &seg[21]; //定义一个指向Seg数组第21行的指针数组
for (i=0;i<16;i++)
{
Bit=BIT=0;
p = &seg[21];
for(j=22;j>0;j--)
{
Bit = (*p) [2*i] & 0x80; //记录最高位
(*p) [2*i] <<= 1; //左移将最高位移入CY
if( BIT != 0 ) (*p) [2*i] |= 0x01; //将上次移出的最高位移放到最低位
BIT = (*p) [2*i+1] & 0x80; //记录最高位
(*p) [2*i+1] <<= 1; //左移将最高位移入CY
if( Bit != 0 ) (*p) [2*i+1] |= 1; //将上次移出的最高位移放到最低位
p--; //指向上一行
}
seg[21][2*i]=seg[21][2*i]|BIT; //在循环结束后将最后一次移位时的CY做第一次移位的最低位
//完成一行字模的一次移位
}
}
LZ还是先将你自己的zuoyi()先调用10次,再使用595显示出来看下效果。如果没有问题的话就是别的地方导致的。
我在开始的时候说LZ的编程思路和别人不一样,原因是一般人都不会这样整个位移字模- -!!
一般人会将字模弄成code型,然后在读取需要用到的部分到内存的一个缓冲区中做位移,这样字模就是不会被破坏掉,并且由于只位移了感兴趣的部分,所以速度快。
思想灵活点的人会模糊掉行列的概念,凭什么一定要老老实实的往SEG发送行?发送列不行么?只要取模软件支持就行了。
这样的话可以省去位移这步,利用一个指针uint16_t *p = (uint16_t)&seg[0][0];将二唯数组当做一唯的来用,
并利用滑动滤波的相关概念,直接移动一个列指针就完事了。
LZ自己慢慢思考~今晚我不留下来加班了,我要去网吧玩游戏,周末晚上是本光棍唯一的休息时间,闪 |