关于51单片机16*64LED点阵左移程序~~高手进~~~~

行驱74HC154,列驱8个74HC595程序如下#include<reg51.h>#include<intrins.h>#defineucharunsignedchar... 行驱74HC154,列驱8个74HC595 程序如下
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit CCLK=P2^0; //数据在上升沿进入移位寄存器sbit LOAD=P2^1; //74HC595串行数据输入端sbit HCLK=P2^2; //上升沿时将数据输出到并行端口sbit OG=P0^0;uchar A[16][1]={0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02};/*"计",右*/uchar F[16][1]={0x00,0x04,0x08,0x08,0x00,0x00,0xEF,0x08,0x08,0x08,0x08,0x08,0x28,0x18,0x08,0x00};/*"计",左*//*延时函数*/void Delay(unsigned int wait){ unsigned char a; for(;wait>0;wait--) for(a=0;a<125;a++); }/*向74HC595发送数据*/void Send(uchar byte){ uchar b,temp1; temp1=byte; for(b=0;b<8;b++) { temp1=temp1<<1; LOAD=CY; CCLK=0; _nop_(); _nop_(); CCLK=1; }}void leftoned (){ uchar u,p;for(u=0;u<16;u++) { A[u][0]=(A[u][0])>>1; if((F[u][0])&0x01){A[u][0]=(A[u][0])|0x80;} F[u][0]=(F[u][0])>>1; if((A[u][0])&0x01){F[u][0]=(F[u][0])|0x80;} //就是这里的A[u][0]已经不是初始值了导致出现了偏差
}}void main (){ uchar *ip1,*ip2,temp1,temp2,d,e;while(1){ for(d=0;d<30;d++){ip1=&A[0];ip2=&F[0];for(e=0;e<16;e++) { temp1=*ip1;temp2=*ip2; Send(temp1);//测试程序一个“计”显示了四遍。。。 Send(temp2); Send(temp1); Send(temp2); Send(temp1); Send(temp2); Send(temp1); Send(temp2); ip1++;ip2++; HCLK=0; _nop_(); _nop_(); HCLK=1; P3=e; OG=0; Delay(3); OG=1;} } leftoned(); } }

结果出现了图片这种偏差 要怎么解决。。。另外这个程序中“计”的字模数组的定义是uchar 二不是uchar code 使得程序占空间较多 若是改为uchar code 定义 要如何实现一个灯一个灯的左移?
展开
 我来答
没事来玩幽白
2014-04-25 · TA获得超过339个赞
知道小有建树答主
回答量:504
采纳率:0%
帮助的人:298万
展开全部
这不仅仅是简单的移位,我也做过,你生成字型码的时候是横着扫描吗?如果是,移位也会横向,如果不是,移位的话会乱码。存放字型码的最好是Uchar code,这样占用数据空间会减小。你移位的时候用中间变量和指针进行操作。
还有,你扫码方式,我做的是1/4行扫。你的如果是逐行扫描就不太一样 了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式