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单片机】8 -- 按键的学习,单片机最小系统
下一篇:keil中C51关键字code用法
推荐阅读
史海拾趣
以下是五个电子行业里Display Engineering Services公司发展起来的相关故事:
故事一:
在科技日新月异的今天,XX公司凭借其在Display Engineering Services领域的专业技术和创新能力,逐渐崭露头角。起初,XX公司只是一家专注于显示屏研发的小型技术公司,但在市场需求的驱动下,公司意识到为客户提供定制化的显示屏解决方案具有巨大潜力。于是,XX公司开始将重心转移到Display Engineering Services上,通过深入了解客户需求,提供从设计、制造到安装的全流程服务。经过数年的努力,XX公司不仅积累了丰富的经验,还建立起一支专业的技术团队,赢得了业界的广泛认可。
故事二:
YY公司的发展历程颇具传奇色彩。该公司最初只是一家为电子产品提供显示屏配件的供应商。然而,随着市场竞争的加剧,YY公司意识到单纯提供配件已无法满足客户需求。于是,公司决定转型为Display Engineering Services提供商,致力于为客户提供显示屏的定制设计和优化服务。YY公司凭借其卓越的技术实力和敏锐的市场洞察力,成功转型,并在短时间内实现了业务的快速增长。如今,YY公司已成为行业内的佼佼者,其显示屏解决方案广泛应用于各个领域。
故事三:
ZZ公司是一家专注于Display Engineering Services的创业公司。在创立之初,公司面临着资金短缺、技术瓶颈等诸多困难。然而,创始人凭借对技术的热爱和对市场的敏锐洞察,带领团队攻克了一个又一个技术难题。同时,ZZ公司还积极寻求外部合作,与多家知名企业建立了紧密的合作关系,共同开发具有市场竞争力的显示屏产品。在团队成员的共同努力下,ZZ公司逐渐在Display Engineering Services领域崭露头角,成为了一家备受瞩目的创新型企业。
故事四:
AA公司的发展历程充满了挑战与机遇。在成立初期,公司面临着激烈的市场竞争和不断变化的客户需求。为了应对这些挑战,AA公司决定加大研发投入,不断提升自身的技术实力。同时,公司还积极拓展国际市场,与全球多家知名企业建立了合作关系。通过不断的技术创新和市场拓展,AA公司逐渐在Display Engineering Services领域树立了良好的品牌形象,赢得了客户的信赖和支持。
故事五:
BB公司是一家历史悠久的Display Engineering Services企业。多年来,公司始终坚持以客户需求为导向,不断提升服务质量和技术水平。为了保持竞争优势,BB公司不断引进先进的生产设备和技术人才,加强内部管理和质量控制。同时,公司还积极参与行业交流和合作,与国内外多家知名企业建立了良好的合作关系。在多年的发展中,BB公司积累了丰富的经验和技术优势,成为了行业内的领军企业之一。其显示屏解决方案广泛应用于各个领域,并获得了多项国内外技术专利和荣誉。
在不断发展壮大的过程中,Chip Quik公司始终注重品牌建设和持续创新。公司加大了对研发部门的投入,不断推出新技术和新产品,以满足市场的不断变化。同时,公司还通过加强品牌宣传和推广,提高了品牌知名度和美誉度,为公司的长远发展奠定了坚实的基础。
这些故事虽然基于假设和一般性的行业趋势,但它们可以反映出一家电子行业中类似公司可能经历的发展路径和挑战。希望这些故事能够为您了解Chip Quik公司或其他电子行业公司的发展提供一定的参考。
随着全球电子市场的不断扩大,B&F Fastener Supply公司开始将目光投向海外市场。公司积极开拓国际市场,与多个国家和地区的电子企业建立合作关系。同时,B&F还加大了对海外市场的投入力度,通过设立海外分支机构、参加国际展会等方式提升品牌知名度和市场份额。
这些故事虽然基于假设和推测,但试图展现了B&F Fastener Supply公司在电子行业中的可能发展历程。请注意,这些故事并非真实事件,仅用于说明公司在电子行业发展的可能性和方向。
为了进一步加强在全球市场的地位,C&K在2011年进行了一次重要的收购。这次收购不仅扩大了公司的业务范围,还提升了其设计和制造能力。通过这次收购,C&K得以在全球范围内提供更广泛的产品和服务,进一步巩固了其在电子行业中的领先地位。
在电子材料领域取得初步成功后,DURABLE公司意识到市场拓展的重要性。公司开始积极拓展海外市场,与全球知名电子产品制造商建立合作关系。通过深入了解不同地区的市场需求和消费者偏好,DURABLE不断调整产品策略,推出符合当地市场需求的产品。同时,公司还加强了与渠道合作伙伴的合作,通过完善的销售网络和售后服务体系,提升了产品的市场占有率和客户满意度。
面对电子行业的快速变化和技术更新,DURABLE公司始终保持着敏锐的洞察力和创新精神。公司不断加大对新技术和新产品的研发力度,积极探索物联网、人工智能等前沿技术在电子行业的应用。通过一系列的技术创新和产品升级,DURABLE成功实现了从传统电子材料供应商向智能电子解决方案提供商的转型升级。这一转型不仅提升了公司的核心竞争力,还为公司的未来发展奠定了坚实基础。
2440+CE5,ap中增加TIMER2定时中断,为何无法进入中断?? (冰天雪地跪求) 主程序: : PLC2->DT[900]=Init_TIMER2_Interrupt(); : } static UINT32 g_TIMER2Irq = IRQ_TIMER2; static UINT32 g_TIMER2SysIntr = SYS ...… 查看全部问答∨ |
|
可以读出ROM中固化的序列号,但是读取温度就是0x07ff。能读出ROM中的内容应该说明读写时序没问题,但是又读不出正确的温度。难道说是温度转化功能失效了? 注:连接为外部供电,4.7k上拉。单一元器件。温度转化时间绝对在750ms以上。… 查看全部问答∨ |
|
stm32103xx请教DMA(DMA_Mode)使用问题! stm32手册上这样描述:循环模式:循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作 ...… 查看全部问答∨ |
|
目前做个项目,想把Lua移植到stm32上,编译通过了,但是总是在调试时候进入到HardFault_Handler中,好像是堆栈设置太小,现在一头雾水,请求大侠帮忙啊!… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 看视频赢京东卡 | 泰享实测之水哥秘籍第三期
- 了解TE CONNECTIVITY室外照明连接解决方案精彩专题,参与有好礼!
- 直播已结束|Littelfuse 智能楼宇电子设备安全与可靠性解决方案
- 下载Intel白皮书 赢精彩好礼
- 用富士通Cortex-M3 Easy Kit开发板,DIY出你的精彩!l
- [直播预报名] TI 最新蓝牙技术培训,2017 震撼首发!
- 报名赢【挂灯、浴巾】等好礼|TI MSPM0家用电器和电机控制应用详解
- 预约有礼:预约理想配电网络的电源完整性设计等直播,涨知识赢好礼
- TE 最新趋势报告|《温度监测对发电机市场有何影响》
- 下载有礼:2017年泰克亚太专家大讲堂第四期: 如何应对新型半导体材料表征测试挑战