3个回答
展开全部
相信你是个新手,相信你用的是51的两排8位口实现的功能,那么楼上的解释你可能不太懂(说实话我也不是很懂。)
但是简单一点来说led点阵需要两排8位,一个负责行,一个负责列,比如0是选中的意思,那么行是01111111,列是1011111,那么第一行的第二列灯亮。原理说完,那么左移的话那就简单了,简单而言,行不变,列左移一位,比如上面的行保持01111111,列在下一次变成01111111,就使得第一行的第一列亮灯了。那么在左移的时候,行是不用变,原来是多少就多少;而列呢,每次使用左移符号”<<“左移一位,就达到了左移显示的效果了。
但是简单一点来说led点阵需要两排8位,一个负责行,一个负责列,比如0是选中的意思,那么行是01111111,列是1011111,那么第一行的第二列灯亮。原理说完,那么左移的话那就简单了,简单而言,行不变,列左移一位,比如上面的行保持01111111,列在下一次变成01111111,就使得第一行的第一列亮灯了。那么在左移的时候,行是不用变,原来是多少就多少;而列呢,每次使用左移符号”<<“左移一位,就达到了左移显示的效果了。
追问
能否给我个例程,尽量简洁简单点,谢谢!
追答
* LED点阵实验 (左右流动显示) *
* 说明 通过P0 和 P2 作为点阵接口 * *
#include
unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //纵条表--(主要看这个,理解这个!!)
/*************延时函数*********************/
void delay1(void)
{
unsigned char i,j,k;
for(k=10;k>0;k--) //循环时间是 10*20*248次
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
/*************主函数*****************************/
void main(void)
{
unsigned char i,j;
while(1)
{
for(i=0;i<8;i++) //循环8次逐条点亮8个LED点阵灯
{
P2=taba[i];
P0=0xff;
delay1();
}
}
}
展开全部
比如你有一个这样的数组
__code unsigned char scrdata[24];
每一个元素代表一列数据(8个位),这样就是8行24列
然后你再弄一个这样的数组
unsigned char cur[8];
这个64个位,8x8,正好是一个点阵的大小。
好了,在主函数里面,设定一个定时器,定时器配合全局变量可以延长定时时间(不然只有65536个周期)。
然后弄一个全局变量代表当前显示是第几列开始。
定时器那边到时间了就从scrdata复制数据到cur
主函数就不断循环负责把cur的内容显示到led上。
大功告成。
__code unsigned char scrdata[24];
每一个元素代表一列数据(8个位),这样就是8行24列
然后你再弄一个这样的数组
unsigned char cur[8];
这个64个位,8x8,正好是一个点阵的大小。
好了,在主函数里面,设定一个定时器,定时器配合全局变量可以延长定时时间(不然只有65536个周期)。
然后弄一个全局变量代表当前显示是第几列开始。
定时器那边到时间了就从scrdata复制数据到cur
主函数就不断循环负责把cur的内容显示到led上。
大功告成。
追问
能否给我个例程,尽量简洁简单点,谢谢!
追答
我当时用的是汇编语言写的,C/C++手上没有现成的程序……
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
赞同二楼,就是一个编码的问题,其实建议你看看例程,相信买单片机都会有例程的,自己再改改里面的东西,你就懂了。这个又没有什么驱动程序,不太复杂的。加油
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |