【自学51单片机】7--LED点阵学习

发布者:温馨幸福最新更新时间:2021-10-20 来源: eefocus关键字:51单片机  LED点阵  8*8 手机看文章 扫描二维码
随时随地手机看文章

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;

}


}

关键字:51单片机  LED点阵  8*8 引用地址:【自学51单片机】7--LED点阵学习

上一篇:【自学51单片机】8 -- 按键的学习,单片机最小系统
下一篇:keil中C51关键字code用法

推荐阅读最新更新时间:2024-11-22 13:45

AT89C51单片机在变频调速恒压供水系统中的应用
论述了变频调速恒压供水的原理及由AT89C51组成的变频调速恒压供水控制系统的硬件组成和软件设计方法。 1工作原理 变频调速恒压供水与水塔或楼顶的高位水箱供水相比,具有投资省、节约能源、水质遭二次污染的机会少等优点,越来越多的城市和生活小区已经或正打算采用变频调速恒压供水。变频调速恒压供水系统构成如图1。 其工作原理是:控制器通过检测实际水压值,比较设定水压值和实际水压值的差别,按PID控制规律运算后,输出控制信号至变频器,变频器则根据控制器的输入信号调节水泵电机的供电电压和频率。 当用水量增加时,控制器控制变频器使电动机的电压和频率加大,水泵转速升高,出水量增加;当用水量减少时,控制器控制变频器使电动机的电压和
[单片机]
AT89C<font color='red'>51单片机</font>在变频调速恒压供水系统中的应用
STM8单片机CAN滤波器的设置
大家好,我是小舒,今天和大家分享一下CAN滤波器相关的内容,滤波器主要用来设置CAN的接收ID,当CAN总线上所挂接的节点较多,数据量较大的话,对单节点的接收判断可能造成较大的压力、占用较多的资源。为了解决这个问题,可以通过设置滤波器实现只接收特定ID。ST系列单片机的滤波器设置非常绕,很容易把自己绕晕了,下面以STM8为例和大家分享一下。 注意,此文需要看多遍。 前言 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到RAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一
[单片机]
国外运营商员工称红色iPhone 8本周推出
去年春季苹果曾推出红色iPhone 7系列   新浪手机讯 4月9日上午消息,国外运营商维珍移动(Virgin Mobile)已经通知员工,苹果公司将在本周推出红色iPhone 8和iPhone 8 Plus。   从年初开始,就有消息说苹果公司正计划推出新配色的iPhone 8,如今运营商通知更加确定了这一消息,维珍移动将在周一将这两款新手机添加到其库存列表中。   据说红色iPhone 8和iPhone 8 Plus将有预订期。这可能意味着该设备将在本月晚些时候正式上市。但有趣的是维珍移动的消息中没有提到红色iPhone X。而目前普遍的传闻是这款旗舰产品也会有新配色,不过究竟是大红色还是传说中的“腮红金”还没有定论。 在去年
[手机便携]
出现“Unable to create configuration 'Debug' using tool chain ‘STM8
用IAR打开STM8时,出现“Unable to create configuration 'Debug' using tool chain ‘STM8’, 出现这个问题的原因是按装的IAR不正确,要装ST for STM8 版本的,而不能用ST for ARM版本的 ST for ARM图标 ST for STM8 图标
[单片机]
出现“Unable to create configuration 'Debug' using tool chain ‘STM<font color='red'>8</font>’
京东方A:携10.5代线先发优势 开创8k新时代
京东方10.5代线投产,重塑全球大尺寸面板格局。京东方合肥10.5代液晶面板产线已于2017年12月20日投产,2018年随着京东方10.5代线进入量产,将取代夏普堺市10代线全球最高世代线地位,重塑全球大尺寸面板产能格局。京东方合肥10.5代线总投资400亿元,计划产能120K/月,以生产65英寸/75英寸超高分辨率显示屏为主,将加快推进京东方朝大尺寸液晶面板出货冠军迈进。 10.5代线优势明显,京东方领衔10.5代产能竞赛。液晶面板的大尺寸化发展趋势下,现有高世代线(8.5代线以下)及夏普10代线受限于产能影响和切割效率,不能很好地满足日益增长的市场需求,而10.5代线切割65英寸和75英寸面板效率可达到95%。未来五年,
[手机便携]
全球首发高通骁龙7 Gen1!曝OPPO Reno8系列本月发
今天,博主@熊猫很禿然爆料,本月将要发布的新品有OPPO Reno系列、Redmi Note系列、vivo S系列、iQOO Neo系列以及iQOO Z系列等等,其中OPPO Reno系列为Reno8新品。   根据此前曝光的信息,OPPO Reno8系列全球首发高通骁龙7 Gen1处理器,这颗芯片采用4nm工艺制程打造,由4颗Cortex A710大核和4颗Cortex A510小核组成,GPU为Adreno 662。   与骁龙778G、骁龙780G对比,骁龙7 Gen1的工艺制程更为先进(骁龙780G为三星5nm工艺,骁龙778G为台积电6nm工艺),同时大核升级为ARM Cortex A710,这是高通在骁龙8、联
[手机便携]
全球首发高通骁龙7 Gen1!曝OPPO Reno<font color='red'>8</font>系列本月发
三星S8预定好于预期 苹果IOS市场份额下降8.9%
eeworld网晚间消息:三星和苹果的手机王者之争,在2017年又在打响。虽然去年三星Galaxy Note7因为电池爆炸遭遇大规模的召回,但IOS阵营似乎也不是那么稳定。根据Kantar Worldpanel收集和分享的新数据,从2014年7月以来,苹果iOS在中国城市智能手机市场的份额已经降至最低。 报告列举了和去年同期比较结果,iOS在中国市场份额下跌8.9个百分点,从22.1%回落至13.2%。苹果竞争对手Android仍然是中国的主导力量,占全国智能手机市场份额达到86.4%,同比增长9.3个百分点。虽然iPhone 7和iPhone 7 Plus仍然是中国市场畅销设备,但苹果无法与当地厂商竞争,如OPPO和VIVO,他
[手机便携]
英特尔称Windows 8时代USB 3.0才会成主流
虽然USB 3.0接口已经体现出了明显的速度优势,且广为用户期待,但Intel、AMD的芯片组短期内都不打算为其提供原生支持。Intel芯片组产品线营销总监Steve Peterson在德国汉诺威参加CeBIT全球会议时更是直言,他认为只有到了微软的下一代客户端操作系统Windows 8普及的时代,USB 3.0才会真正成为主流。   Windows 7发布于去年十月底,在那时候其继任者就早已提上开发日程。按照目前的普遍预计,Windows 8最早有望在2011年底发布,但也有可能要等到2012年,后者也符合微软产品路线图。   Steve Peterson透露说,Intel正在与微软合作,确保Windows 8能够全面支持U
[模拟电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved