赞
踩
目录
资料见本文所在的专栏:
1)基础
2)代码
- #include<reg52.h>
- sbit enled=P1^4; // 138译码器使能
- sbit addr3=P1^3;
- sbit addr2=P1^2;
- sbit addr1=P1^1;
- sbit addr0=P1^0;
- sbit led=P0^0; // 这里只点亮led点阵的左上角第一个led小灯
- void main(){
- enled=0; // 控制点阵led 的 U4(138)使能,需要e2低电平
- addr3=0; // 控制点阵led 的 U4(138)使能,需要e1低电平
-
- addr2=0; // y0输出低电平,使Q10晶体管开关打开,使led灯能够点亮
- addr1=0;
- addr0=0;
-
- led=0; // 控制一只小灯点亮
- while(1); // 长亮
- }
3)效果
1)基础
2)代码
- #include<reg52.h>
- sbit enled=P1^4; // 138译码器使能
- sbit addr3=P1^3;
- sbit addr2=P1^2;
- sbit addr1=P1^1;
- sbit addr0=P1^0;
- void main(){
- enled=0; // 控制点阵led的 U4(138)使能,需要e2低电平
- addr3=0; // 控制点阵led的 U4(138)使能,需要e1低电平
-
- addr2=0; // y0输出低电平,使Q10晶体管开关打开,使led灯能够点亮
- addr1=0;
- addr0=0; // 选择了第1行的led
-
- P0=0x00; // 控制列上的led,如果写成0x01,则左边第一列不亮,剩下其它列的led亮
- while(1); // 长亮
- }
3)效果
1)代码
下面用到了定时器及中断器(在单片机中带有break关键字的switch语句和中断器是绝配,天造地设的一对)一旦中断器检测到break关键字,就会停下来。在动态显示中,不管是点阵还是数码管点亮的持续时间通常为1ms左右,然后切换到下一个数码管。这意味着在1ms的时间内,数码管应该能够完成从关闭到完全点亮,再到关闭的完整过程。就会有“鬼影”,即会有视觉残留,我们会看到小灯有明显的亮暗波动,所以定时器和中断器的使用就很有必要。
- #include<reg52.h>
- sbit enled=P1^4; // 138译码器使能
- sbit addr3=P1^3;
- sbit addr2=P1^2;
- sbit addr1=P1^1;
- sbit addr0=P1^0;
- void main(){
- enled=0; // 控制点阵led 的 U4(138)使能,需要e2低电平
- addr3=0; // 控制点阵led 的 U4(138)使能,需要e1低电平
-
- EA=1; // 总使能中断打开
- ET0=1; // 定时器T0使能中断打开
- TMOD=0x01; // 定时器T0的模式为1
- TH0=0xFC; // 定时1ms
- TL0=0x67;
- TR0=1; // 开启定时器T0
- while(1); // 长亮
- }
-
- void InterrutpTimer0() interrupt 1{ // 中断服务函数
- static unsigned char rowmilisec=0; // 用于存储亮起的行,且是每一毫秒亮一行
- TMOD=0x01; // 只要有溢出造成的中断,就将T0初始值重新赋值
- TH0=0xFC;
- P0=0xFF; //关闭段
- switch(rowmilisec){
- case 0:addr2=0;addr1=0;addr0=0;P0=0x00;rowmilisec++;break;
- case 1:addr2=0;addr1=0;addr0=1;P0=0x00;rowmilisec++;break;
- case 2:addr2=0;addr1=1;addr0=0;P0=0x00;rowmilisec++;break;
- case 3:addr2=0;addr1=1;addr0=1;P0=0x00;rowmilisec++;break;
- case 4:addr2=1;addr1=0;addr0=0;P0=0x00;rowmilisec++;break;
- case 5:addr2=1;addr1=0;addr0=1;P0=0x00;rowmilisec++;break;
- case 6:addr2=1;addr1=1;addr0=0;P0=0x00;rowmilisec++;break;
- case 7:addr2=1;addr1=1;addr0=1;P0=0x00;rowmilisec=0;break;
- }
- }
在51单片机中,总使能中断EA是Enable All Interrupt的缩写。具体来说,EA是中断允许寄存器(IE寄存器)中的一个位,用于控制是否允许CPU响应所有中断请求。
static
关键字在函数内部声明一个变量为 static
时,该变量的生命周期会持续到程序执行完毕,而不是在函数返回时结束。此外,static
变量只会初始化一次,即当程序开始运行时。在后续的函数调用中,该变量会保持其上一次被修改后的值。
在中断服务函数 InterrutpTimer0
中,rowmilisec
被声明为 static
是为了确保它能在每次中断调用之间保持其值。这是一个定时器中断,它会在定时器溢出时定期被调用。由于 rowmilisec
用于跟踪已经过去的毫秒数(或行),所以需要它在每次中断之间保持其值,以便知道下一行应该是什么。
unsigned
关键字unsigned
关键字指定了一个整数类型,它只能存储非负值。与 signed
类型(如 int
)相比,unsigned
类型没有符号位,因此它可以存储两倍于相同大小 signed
类型的正数。
在上面的代码中rowmilisec
被用来作为一个计数器,从 0 计数到 7,然后回到 0。由于这个值永远不会是负数,所以使用 unsigned char
是合适的。这不仅可以确保值始终是非负的,而且还可以节省一个位(符号位)
2)效果
1)基础
经过点亮点阵的一只led,一排led,全部led灯相关操作,现在我们开始来让其静态的展示我们指定的图案。要绘制图案,就需要使用到《点阵液晶取模》程序。
对应软件及资源的网盘连接,见本文专栏。之后下载app里面的字模软件即可,如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。