历史上的今天
返回首页

历史上的今天

今天是:2024年10月20日(星期日)

正在发生

2021年10月20日 | 【自学51单片机】7--LED点阵学习

2021-10-20 来源:eefocus

1、LED点阵介绍

LED点阵由多个LED小灯构成,以8*8LED点阵介绍,实物图和内部原理图如下。

图7-2左侧8个引脚为内部LED小灯阳极,上侧8个引脚为阴极。


2、点亮LED点阵

2.1 原理

点亮LED点阵与点亮LED小灯原理相似,根据LED点阵电路图分析即可,详细见第三章。


2.2 点亮全部LED点阵程序

利用定时器中断和数码管动态显示原理,就不进行说明,详细见第六章


3、取模软件简单介绍

取模软件可以将LED点阵图形的数据转换为程序中的数据。取模软件中黑色为LED熄灭,值为1,白色为LED点亮,值为0。如下图绘制了一个心形。

下面来说明取模软件参数的选取。

取模方式:根据LED点阵结构原理图,PO口控制的是一行,选择“横向取模”,控制的是一列,则选择“纵向取模”。


字节倒序:根据LED点阵结构原理图,若PO口左侧控制的是低位,右侧控制高位,勾选该选项,否则不勾选。


4、点阵动画显示

原理:对多张图片进行取模,利用程序算法切换图片形成动画。


4.1 横向左右移动(I ❤ U)动画程序

//LED点阵I love you 左右横向移动

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code image[60][8]={ //图片字模表

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},  //往左动画

{0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}, //动画帧2

{0xFF,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F}, 

{0xFF,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F}, 

{0xFF,0x0F,0x9F,0x9F,0x9F,0x9F,0x9F,0x0F}, 

{0xFF,0x87,0xCF,0xCF,0xCF,0xCF,0xCF,0x87}, 

{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, 

{0xFF,0xE1,0x73,0x73,0x73,0xF3,0xF3,0xE1}, 

{0xFF,0x70,0x39,0x39,0x39,0x79,0xF9,0xF0}, 

{0xFF,0x38,0x1C,0x1C,0x1C,0x3C,0x7C,0xF8}, 

{0xFF,0x9C,0x0E,0x0E,0x0E,0x1E,0x3E,0x7C}, 

{0xFF,0xCE,0x07,0x07,0x07,0x0F,0x1F,0x3E}, 

{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F}, 

{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF}, 

{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}, 

{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3}, 

{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9}, 

{0xFF,0x73,0x60,0x60,0x60,0x70,0x78,0xFC}, 

{0xFF,0x39,0x30,0x30,0x30,0x38,0x3C,0x7E}, 

{0xFF,0x9C,0x98,0x98,0x98,0x9C,0x1E,0x3F}, 

{0xFF,0xCE,0xCC,0xCC,0xCC,0xCE,0x0F,0x1F}, 

{0xFF,0x67,0x66,0x66,0x66,0x67,0x07,0x0F}, 

{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87}, 

{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3}, 

{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},

{0xFF,0xE6,0xE6,0xE6,0xE6,0xE6,0xE0,0xF0}, 

{0xFF,0xF3,0xF3,0xF3,0xF3,0xF3,0xF0,0xF8}, 

{0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF8,0xFC}, 

{0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE}, 

{0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF}, //动画帧 30

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //往右动画

    {0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE},

    {0xFF,0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC},

    {0xFF,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8},

    {0xFF,0xF0,0xF9,0xF9,0xF9,0xF9,0xF9,0xF0},

    {0xFF,0xE1,0xF3,0xF3,0xF3,0xF3,0xF3,0xE1},

    {0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3},

    {0xFF,0x87,0xCE,0xCE,0xCE,0xCF,0xCF,0x87},

    {0xFF,0x0E,0x9C,0x9C,0x9C,0x9E,0x9F,0x0F},

    {0xFF,0x1C,0x38,0x38,0x38,0x3C,0x3E,0x1F},

    {0xFF,0x39,0x70,0x70,0x70,0x78,0x7C,0x3E}, 

    {0xFF,0x73,0xE0,0xE0,0xE0,0xF0,0xF8,0x7C},

    {0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9},

    {0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3},

    {0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},

    {0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF},

    {0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F},

    {0xFF,0xCE,0x06,0x06,0x06,0x0E,0x1E,0x3F},

    {0xFF,0x9C,0x0C,0x0C,0x0C,0x1C,0x3C,0x7E},

    {0xFF,0x39,0x19,0x19,0x19,0x39,0x78,0xFC},

    {0xFF,0x73,0x33,0x33,0x33,0x73,0xF0,0xF8},

    {0xFF,0xE6,0x66,0x66,0x66,0xE6,0xE0,0xF0},

    {0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},

    {0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3},

    {0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87},

    {0xFF,0x67,0x67,0x67,0x67,0x67,0x07,0x0F},

    {0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0x0F,0x1F},

    {0xFF,0x9F,0x9F,0x9F,0x9F,0x9F,0x1F,0x3F},

    {0xFF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F},

    {0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF}, //动画帧60


};


void main()

{

EA = 1;//使能总使能

ENLED = 0;//使能U4,选择点亮点阵

ADDR3 = 0;

TMOD = 0x01;//为T0配置模式一

TH0 = 0xFC;//为T0赋值,定时1ms

TL0 = 0x67;

ET0 = 1; //使能T0中断

TR0 = 1; //开启T0

while(1);

}


void intertuptTimer0() interrupt 1

{

static unsigned char i = 0;//动态扫描索引

static unsigned int tmr = 0;//250ms软件定时器

static unsigned char index = 0;//图片刷新索引


TH0 = 0xFC; //重新加载初值

TL0 = 0x67;

//以下代码为点阵动态扫描刷新

P0 = 0xFF;//消除鬼影

switch(i)

{

case 0: ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=image[index][0];break;

case 1: ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=image[index][1];break;

case 2: ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=image[index][2];break;

case 3: ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=image[index][3];break;

case 4: ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=image[index][4];break;

case 5: ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=image[index][5];break;

case 6: ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=image[index][6];break;

case 7: ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;

default:break;

}

//以下代码完成每250ms改变一帧图像

tmr++;

if(tmr >= 250)//达到250ms改变一次图片索引

{

tmr = 0;

index++;

if(index >= 60) //图片索引达60后归零

{

index = 0;

}

}

}


左右移动动画和上下移动动画,会因LED点阵原理图中是横向取模或纵向取模而显得难度不同,若LED点阵是横向取模,则上下移动动画容易实现(因不同图片字模数据是连续的),而左右移动动画不易实现(因不同图片字模数据是不连续的)。博主用的LED点阵为横向取模,上下移动动画程序就不展示了,上面展示了左右移动动画程序。


4.2 LED点阵动画9 - 0倒计时程序

 //LED点阵动画9-0倒计时

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code image[11][8]={ //图片字模表

{0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3},  //数字0

    {0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3},  //数字1

    {0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81},  //数字2

    {0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3},  //数字3

    {0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF},  //数字4

    {0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3},  //数字5

    {0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3},  //数字6

    {0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7},  //数字7

    {0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3},  //数字8

    {0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1},  //数字9

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  //全亮


};


void main()

{

EA = 1;//使能总使能

ENLED = 0;//使能U4,选择点亮点阵

ADDR3 = 0;

TMOD = 0x01;//为T0配置模式一

TH0 = 0xFC;//为T0赋值,定时1ms

TL0 = 0x67;

ET0 = 1; //使能T0中断

TR0 = 1; //开启T0

while(1);

}


void intertuptTimer0() interrupt 1

{

static unsigned char i = 0;//动态扫描索引

static unsigned int tmr = 0;//1s软件定时器

static signed char index = 9;//图片刷新索引


TH0 = 0xFC; //重新加载初值

TL0 = 0x67;

//以下代码为点阵动态扫描刷新

P0 = 0xFF;//消除鬼影

switch(i)

{

case 0: ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=image[index][0];break;

case 1: ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=image[index][1];break;

case 2: ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=image[index][2];break;

case 3: ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=image[index][3];break;

case 4: ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=image[index][4];break;

case 5: ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=image[index][5];break;

case 6: ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=image[index][6];break;

case 7: ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;

default:break;

}

//以下代码完成每1s改变一帧图像

tmr++;

if(tmr >= 1000)//达到1s改变一次图片索引

{

tmr = 0;

index--;

if(index < 0) //图片索引达-1后赋值为10

{

index = 10;

}

}

}


4.3 流水灯、数码管和LED点阵同时点亮程序

#include


sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


void main()

{

    EA = 1; //使能总中断

ENLED = 0; //使能U3,U4,因动态扫描,点亮数码管,ADDR0-3需动态变化

TMOD = 0x10;//配置T1为模式一

TH1 = 0xFE; //为T1赋0xFE33,定时0.5ms

TL1 = 0x33;

ET1 = 1; //使能T1中断

TR1 = 1;//开启定时器T1

while(1);//在语句中一直循环,直到定时器T1中断

}


//以下为定时器T1的中断函数

void InterruptTimer1()  interrupt 3

{

static unsigned char i = 0; //动态扫描索引


TH1 = 0xFE; //为T1赋0xFE33,定时0.5ms

TL1 = 0x33;


//以下代码为LED小灯、数码管和LED点阵动态扫描

P0 = 0xff;//显示消隐

switch(i)

{

//点亮LED小灯部分

case 0: ADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=0;break;


//数码管的动态扫描部分

case 1: ADDR3=1;ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=0;break;

case 2: ADDR3=1;ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=0;break;

case 3: ADDR3=1;ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=0;break;

case 4: ADDR3=1;ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=0;break;

case 5: ADDR3=1;ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=0;break;

case 6: ADDR3=1;ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=0;break;


//LED点阵的动态扫描部分

case 7: ADDR3=0;ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=0;break;

case 8: ADDR3=0;ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=0;break;

case 9: ADDR3=0;ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=0;break;

case 10: ADDR3=0;ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=0;break;

case 11: ADDR3=0;ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=0;break;

case 12: ADDR3=0;ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=0;break;

case 13: ADDR3=0;ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=0;break;

case 14: ADDR3=0;ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=0;break;

default:break;

}


}

推荐阅读

史海拾趣

Ememory Technology Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。

ESTEK公司的发展小趣事

在电子行业日益注重环保的背景下,ESTEK公司积极响应号召,致力于研发和生产绿色环保的电子产品。公司投入大量资金和资源,研发出了一系列符合环保标准的电子元件和设备。这些产品在市场上受到了广泛欢迎,不仅为公司带来了可观的经济效益,也为环保事业做出了积极贡献。

ACP Optoelectronic Technology Co Ltd公司的发展小趣事

ACP Optoelectronic Technology Co Ltd,在创立初期便专注于光电技术的研发。某年,公司研发团队成功开发出一种新型光电传感器,其性能远超当时市场上的同类产品。这一技术突破迅速吸引了行业内的关注,公司因此获得了大量订单,业绩迅速攀升。随着技术的不断完善和市场的不断拓展,ACP Optoelectronic Technology Co Ltd逐渐在光电领域崭露头角。

Allegro公司的发展小趣事

为了进一步提升技术实力和市场份额,ACP Optoelectronic Technology Co Ltd积极寻求与其他企业的战略合作。公司先后与多家知名电子企业签订了技术合作协议,共同开发新产品,共享市场资源。这些合作不仅提升了ACP Optoelectronic Technology Co Ltd的技术水平,也为其带来了更多的商业机会,推动了公司的快速发展。

DATEL Inc公司的发展小趣事

随着公司业务的不断扩展,DATEL Inc.开始实施全球化战略。公司积极开拓国际市场,与全球各地的合作伙伴建立了紧密的合作关系。通过引进国际先进技术和管理经验,DATEL Inc.的产品质量和服务水平得到了进一步提升。同时,公司还加强了对海外市场的营销和推广力度,成功将DATEL Inc.的品牌推向了全球。

Frequency Management International公司的发展小趣事

FMI深知质量是企业生存和发展的根本。因此,公司一直将质量管理放在首位,建立了完善的质量管理体系。从原材料采购到生产加工、成品检验等各个环节都严格把关,确保产品质量符合客户要求。同时,FMI还注重客户服务体验的提升,为客户提供及时、专业的技术支持和解决方案。这些努力使得FMI在客户心中树立了良好的口碑和形象。

问答坊 | AI 解惑

PB5.0定制SDK问题,两天未果.请高手支招

长话短说.问题如下.   生成OS正常,但生成SDK时就出现下面这个问题,百度 GOOGLE一下,结果就一条记录,还是某前辈提出的问题没人回.   已经把PB装了两遍了.郁闷中: HHC5010: Error: Cannot open \"d:\\pb\\MyWince\\SDK\\ ...…

查看全部问答>

寻求帮助!榨油厂豆粕生产人机交互系统设计

榨油厂豆粕生产人机交互系统设计 1   掌握PLC的基本原理 2   掌握PLC的硬件以及指令 3   掌握用组态软件编制人机界面的方法 4   完成上下位微机的软件编制与调试 5   按要求完成毕业论文 ...…

查看全部问答>

WINCE界面切换支持?

小弟在做一个多语言选择的WINCE5.0的操作系统.加入了中文、日文和MUI支持,默认是中文.可是在控制面板->区域设置->用户界面语言,用户界语言选择中只有中文,并且是disable状态,不能切换!请问如何让它成为有效状态,可能选择语言!谢谢。…

查看全部问答>

救命呀!

用P1。0-P1。5这6个输出口作为东西,南北两个方向的红。绿。黄的路口指示灯。分别接入不同颜色的二极管。程序一开始时,即进入状态1(东西方向绿灯亮,南北方向红灯亮),计数道20秒时间后进入中间状态1(东西方向绿灯灭,东西方向黄闪3秒,间隔0。 ...…

查看全部问答>

新加坡来上海引进人才活动

新加坡政府机构contact singapore和上海的星星火公司合作,为新加坡招募1000名有经验的工程师。期待有技能的高端人才报名,前往新加坡工作一展宏图 http://www.marketing-research.cn/s/554   兄弟们看看这消息!新加坡来上海引进人才活动 ...…

查看全部问答>

讨论:你是如何选择淘宝卖家的

今天在淘宝逛了一下,发现买家、卖家的评价很有趣!~有的卖家因为买家给差评或者中评就开骂买家,我觉得这样的商家是非常垃圾的,所以我觉得大家买东西在看买家的评价的同时也注意一下卖家的评价!~当然有写买家违心的评价,或者言辞过于...也是可 ...…

查看全部问答>

湖南电子信息实训基地怎么样?

本帖最后由 dontium 于 2015-1-23 13:29 编辑 我是湖北的一名农村孩子,对单片机智能控制有着浓厚的兴趣,但应为是专科学校,加上自己基础问题,大学期间没有学到什么东西。现在毕业了想找份行内的工作都不行..... 所以想进个培训班,再强化自己 ...…

查看全部问答>

TI Stellaris M3 外设驱动库中文指南

TI Stellaris M3 外设驱动库中文指南!!…

查看全部问答>

干扰不知道怎么处理

大家帮我解答一下问题,汽车设备上的控制板到TFTlcd的电缆中途干扰现象该怎么处理好呢?…

查看全部问答>

圆点博士小四轴飞行器各部件重量和尺寸数据,供大家参考

圆点博士小四轴飞行器各部件重量和尺寸数据,供大家参考. 不断有坛友询问各部件的尺寸和重量,楼主整理下: ====总重量============== 圆点博士小四轴飞行器总重量约30克 ======小四轴板=============== 圆点博士小四轴飞行器PCB板子尺寸: 73.5 ...…

查看全部问答>