找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3948|回复: 4
打印 上一主题 下一主题
收起左侧

请教关于LED8*8点阵的问题,请大神们帮帮忙!

[复制链接]
跳转到指定楼层
楼主
ID:126834 发表于 2016-6-15 21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是在这个程序上添加独立按键控制LED点阵的不同显示(例如静止、闪烁、平移)
就是可以让它被独立按键控制,我这个程序是向左平移显示0~9,怎么才能让按键控制它让它静止

程序如下:


#include<reg52.h>
void delay();
unsigned char code digittab[88]={ //行选通
0x00,0x00,0x00,0x00,//缓冲下,0从右端出来啦!!!
0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,//0
0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00,/*1*/
0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00,/*2*/
0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00,/*3*/
0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,/*4*/
0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00,/*5*/
0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00,/*6*/
0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00,/*7*/
0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,/*8*/
0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00,/*9*/
0x00,0x00,0x00,0x00//让9继续滚动完
};
unsigned char code tab[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,}; //列选通
void main()
{
unsigned char i=1,x=0,j=0,tcount=0;
unsigned int ledroll[8];
for(j=0;j<8;j++)
ledroll[j]=digittab[j];
while(1)
{
for(x=0;x<8;x++)//扫描显示出当前字样
{
P1=tab[x];
P0=ledroll[x];
delay();//暂留一下下
}
/*将行选通后移一个*/
if(++tcount>30)//扫描30次
{
tcount=0;
for(j=0;j<8;j++)
ledroll[j]=digittab[j+i];//此处重点
if(++i>=80)//88减8当然等于80啦
i=0;
}
}
}
void delay()//制造视觉暂留效应
{
unsigned int x,y;
for(x=2;x>0;x--)
for(y=123;y>0;y--);
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2016-6-16 00:54 | 只看该作者
设置8个显示缓冲单元,作为8个LED的显示对应位,每次从其中取字节显示.设为X0-X7.(现行方法)
再设置8个显示缓冲备用单元,Y0-Y7.(需要增加)
X0-X7参与动态显示
Y0-Y7不参与动态显示
当按键要求动态显示时,显示取自X0-X7(就是你现在使用的方法)
当按键要求静止显示时,将X0-X7的值(静止时显示的值)送到Y0-Y7,显示取自Y0-Y7,而Y0-Y7是不变化的,就实现静止了.
回复

使用道具 举报

板凳
ID:123289 发表于 2016-6-16 19:56 | 只看该作者
初学者:总是把数据(现场处理过的),拿去直接显示,就是不好的做法,机会性很差.
正确的做法是:把数据(现场处理过的),先送到显示缓冲区(如XS1,XS2...),而后再从显示缓冲区取出数据去显示.
这样显示的机动性就强了,要怎么做就怎么做?
对于你来说.只是修改XS1,或XSn中的数据而矣.
而XS1,或XSn,只是几个字节的内存而矣,随便定义一下即可.
比如,XS1放的是动态数据(随显示内容更改变动),而XS2,只是在需要的时候,从XS1中复制一下,那么:
当你将XS1送去显示时,显示的内容就是不断变化的(如时间)
当你将XS2送去显示时,显示的内容就是不变的(如永远是"13:57",因为你在13:57将XS1复制到了XS2中,而XS2已后就不变了)
所以你只要选择从哪个缓冲区取数据显示,就会得到不同的显示效果.
回复

使用道具 举报

地板
ID:123289 发表于 2016-6-16 20:32 | 只看该作者
本帖最后由 yzwzfyz 于 2016-6-16 20:35 编辑

LED各个位闪烁的方法:
1、做一个标记S03,S03每0.3秒求反一次。(在时间中断中实现,你可以不用0.3秒,改用其它值)
2、用一个字节BX其8个位叫:BX7-BX0(其中的一个叫BXN),分别对应指出哪个LED位正在闪烁。
   例如当BX=10000000(即BX7=1,BX6-0=0)表示只有LED7闪动显示,其它不闪。
3、定义一个字节ID,指示显示哪一个LED,每次时间中断将ID+1,且ID=0-7。比如ID=4,则显示LED4,其它的不显示。
4、定义8个字节RXS7-RXS0,用于存放LED的显示内容(当然需要你事先做好译码工作)。
5、每次中断只显示的一个LED(先关全部,再显示一个),由显示位由ID指出。
6、是否将RXSN(RXS7-RXS0中的一个)送到LED进行显示,由下列计算决定:BXS=/BXN+BXN*S03
   当BXS=1时,表示显示,则将RXSN送至LED显示;当BXS=0时,则将不显示(实际是将黑字送到LED,能常是FFH或00H)。
例如:ID=2,RXS2=“3”(译码后的3),BX2=1(闪动),S03=0。则:BXS=/BX2+BX2*S03=/1+1*0=0,所以不显示,将FFH送至LED2(无显)。
         如果送“_”则形成“_”与“3”互闪。
例如:ID=2,RXS2=“3”(译码后的3),BX2=1(闪动),S03=1。则:BXS=/BX2+BX2*S03=/1+1*1=1,所以显示,将“3”送至LED2。
例如:ID=2,RXS2=“3”(译码后的3),BX2=0(不闪动),S03=x。则:BXS=/BX2+BX2*S03=/0+1*S03=1,所以显示,将“3”送至LED2。

如此闪动就操作简单了:需要哪位闪动,就将哪位对应的BXn置1,即可。不闪就清0。
回复

使用道具 举报

5#
ID:123289 发表于 2016-6-16 20:43 | 只看该作者
LED移位的方式:
继承上面。
假设每秒右移一次,8秒后移完变黑,黑显示值为“FFH”。
则每秒做一个事,即可达成目的:
"FFH"→RXS7→RXS6→RXS5→RXS4→RXS3→RXS2→RXS1→RXS0。
当然应先做RXS1→RXS0,最后做"FFH"→RXS7。
如是移完后显示“--------”,则:
"-"→RXS7→RXS6→RXS5→RXS4→RXS3→RXS2→RXS1→RXS0。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表