关于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 定义 要如何实现一个灯一个灯的左移? 展开
#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 定义 要如何实现一个灯一个灯的左移? 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询