当前位置: 首页 > news >正文

同时点亮LED、数码管以及点阵

方法1


#include<reg52.h>sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;unsigned char code iMage[10][8] =
{{ 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 },{ 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },{ 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },{ 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },{ 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },{ 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },{ 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },{ 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },{ 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },{ 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 }	
};//通过取模软件获取unsigned char code LedChar[] =
{0xC0, 0xF9, 0xA4, 0xB0, 0x99,0x92, 0x82, 0xF8, 0x80, 0x90
};//数码管真值表//首先让点阵亮,其次数码管亮,最后小灯亮,按此次序1s转换一次
void main(void)
{ENLED = 0;//ADDR3 = 0;//u4使能EA = 1;//中断总使能TMOD = 0x01;//定时器0设置模式1TH0 = 0xFC;TL0 = 0x67;//设置定时器0的初值1msTR0 = 1;//启动定时器0ET0 = 1;//定时器0的中断使能while(1);//让程序停在此处
}void interruptTimer0(void) interrupt 1
{static char iDotMatrix = 0;//点阵行数static char iDig = 0;static char iLed = 0;//ledstatic long unsigned int secDig = 0;//数码管static int sec = 0;static char index = 0;TH0 = 0xFC;TL0 = 0x67;//设置定时器0的初值1msADDR3 = 0;//u4使能P0 = 0xFF;//显示消隐switch (iDotMatrix){case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix = 0; break;default: break;}ADDR3 = 1;//U3使能P0 = 0xFF;	switch (iDig){case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig % 10]; iDig++; break;case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 10 % 10]; iDig++; break;case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar[secDig / 100 % 10]; iDig++; break;case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar[secDig / 1000 % 10]; iDig++; break;case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig / 10000 % 10]; iDig++; break;case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 100000 % 10]; iDig = 0; break;default: break;}ADDR3 = 1;P0 = 0xFF;		  	ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;P0 = ~(1 << iLed);sec++;if (sec > 1000){index++;iLed++;secDig++;sec = 0;		}if (index > 9)index = 0;if (8 == iLed)iLed = 0;
}

方法2

#include<reg52.h>sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;unsigned char code iMage[10][8] =
{{ 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 },{ 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },{ 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },{ 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },{ 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },{ 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },{ 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },{ 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },{ 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },{ 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 }	
};//通过取模软件获取unsigned char code LedChar[] =
{0xC0, 0xF9, 0xA4, 0xB0, 0x99,0x92, 0x82, 0xF8, 0x80, 0x90
};//数码管真值表//首先让点阵亮,其次数码管亮,最后小灯亮,按此次序1s转换一次
void main(void)
{ENLED = 0;//ADDR3 = 0;//u4使能EA = 1;//中断总使能TMOD = 0x01;//定时器0设置模式1TH0 = 0xFC;TL0 = 0x67;//设置定时器0的初值1msTR0 = 1;//启动定时器0ET0 = 1;//定时器0的中断使能while(1);//让程序停在此处
}void interruptTimer0(void) interrupt 1
{static char i = 0;//点阵行数static char iLed = 0;//ledstatic long unsigned int secDig = 0;//数码管static int sec = 0;static char index = 0;TH0 = 0xFC;TL0 = 0x67;//设置定时器0的初值1msADDR3 = 0;//u4使能P0 = 0xFF;//显示消隐switch (i){case 0: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][i]; i++; break;case 1: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][i]; i++; break;case 2: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][i]; i++; break;case 3: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][i]; i++; break;case 4: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][i]; i++; break;case 5: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][i]; i++; break;case 6: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][i]; i++; break;case 7: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][i]; i++; break;case 8: ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig % 10]; i++; break;case 9: if (secDig < 10); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 10 % 10];} i++; break;case 10: if (secDig < 100); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar[secDig / 100 % 10];} i++; break;case 11: if (secDig < 1000); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar[secDig / 1000 % 10];} i++; break;case 12: if (secDig < 10000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig / 10000 % 10];} i++; break;case 13: if (secDig < 100000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 100000 % 10];} i++; break;case 14: ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = ~(1 << iLed); i = 0; break;default: break;}sec++;if (sec > 1000){index++;iLed++;secDig++;sec = 0;		}if (index > 9)index = 0;if (8 == iLed)iLed = 0;
}

官方答案

#include <reg52.h>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;    //使能LEDTMOD = 0x01;  //设置T0为模式1TH0  = 0xFC;  //为T0赋初值0xFC67,定时1msTL0  = 0x67;ET0  = 1;     //使能T0中断TR0  = 1;     //启动T0while (1);
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{static unsigned char i = 0;  //动态扫描的索引TH0 = 0xFC;  //重新加载初值TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新P0 = 0xFF;   //显示消隐switch (i){//点阵LED部分case 0: ADDR3 = 0; ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0; break;case 1: ADDR3 = 0; ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0; break;case 2: ADDR3 = 0; ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0; break;case 3: ADDR3 = 0; ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0; break;case 4: ADDR3 = 0; ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0; break;case 5: ADDR3 = 0; ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0; break;case 6: ADDR3 = 0; ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0; break;case 7: ADDR3 = 0; ADDR2=1; ADDR1=1; ADDR0=1; i++; P0=0; break;//数码管部分case 8:  ADDR3 = 1; ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0; break;case 9:  ADDR3 = 1; ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0; break;case 10: ADDR3 = 1; ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0; break;case 11: ADDR3 = 1; ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0; break;case 12: ADDR3 = 1; ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0; break;case 13: ADDR3 = 1; ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0; break;//独立LED部分case 14: ADDR3 = 1; ADDR2=1; ADDR1=1; ADDR0=0; i=0; P0=0; break;default: break;}
}
http://www.sczhlp.com/news/658.html

相关文章:

  • 今日总结
  • docker安装
  • 二进制简史:从理论到芯片
  • Qcom dcvs_epss.c 驱动解析.
  • AirSim+PX4+QGC实现无人机自动避障
  • js基础第五天
  • 简单了解高阻抗(High-Z)
  • 中台建设为什么需要领域驱动设计
  • 不同Linux发行版Node安装指南
  • 虚化引擎游戏解包工具
  • hyper-v安装manjaro虚拟机
  • spring-data-JPA代码审计
  • 小作业 7(5 道不等式练习题)
  • CF2128F Strict Triangle
  • Dubbo
  • AWS上实现超大规模模型训练的近线性扩展
  • 现代Web服务器性能革命:我的Rust框架探索之旅(6906)
  • Hyperlane性能调优秘籍:从毫秒级响应到百万QPS的优化之路(0548)
  • 实时通信协议的Rust实现(4131)
  • Rust生态系统在Web开发中的优势(9336)
  • TCP连接优化的实战经验(3008)
  • 高并发处理的Rust实现方案(6871)
  • 内存使用效率的终极对决:零拷贝技术的实战应用(0581)
  • 实时通信技术深度对比:WebSocket与SSE的最佳实践(4367)
  • Hyperlane框架的高级特性深度解析:从零拷贝到宏系统的完美融合(8284)
  • WebSocket服务端的高效处理(2177)
  • 跨平台Web服务开发的新选择(5907)
  • 异步编程在Web开发中的应用(9589)
  • 从零开始构建高性能实时聊天系统:Hyperlane框架实战指南(3242)
  • 高性能路由系统的设计与实现(4242)