使用51单片机实现led点阵字母渐变显示,要详细的代码和注释
时间: 2024-02-05 15:12:16 浏览: 163
基于51单片机的16×16点阵(滚动显示)资料+仿真+代码
5星 · 资源好评率100%
以下是使用51单片机实现led点阵字母渐变显示的详细代码和注释,供您参考:
```c
#include<reg52.h>
#define uchar unsigned char //定义无符号字符型变量
#define uint unsigned int //定义无符号整型变量
sbit LSA=P2^2; //选择线
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴极数码管0~7编码
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管8~F编码
uchar code letter[]={
0x00,0x7e,0x81,0x81,0x81,0x42,0x3c,0x00, //字母A的编码
0x00,0xff,0x89,0x89,0x89,0x76,0x00,0x00, //字母B的编码
0x00,0x3c,0x42,0x81,0x81,0x81,0x42,0x00, //字母C的编码
0x00,0xff,0x81,0x81,0x81,0x42,0x3c,0x00}; //字母D的编码
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar i,j,k,m;
while(1)
{
for(m=0;m<4;m++) //循环显示字母A~D
{
for(k=0;k<100;k++) //渐变过程
{
for(i=0;i<8;i++) //循环8列点阵
{
LSA=i; //选择第i列
P0=0xfe; //第一个数码管点亮
for(j=0;j<8;j++) //循环8行点阵
{
if(letter[m*8+i]&(0x01<<j)) //判断该位置是否需要点亮
{
P0=table[k/10]; //显示高位数字
delay(1);
P0=table[k%10]|0x80; //显示低位数字,加上小数点
}
else
{
P0=0xff; //该位置不需要点亮,熄灭LED
delay(1);
P0=0xff;
}
P0=P0>>1; //将LED数据右移一位,准备显示下一列
}
delay(2); //延时,控制显示速度
}
}
}
}
}
```
注释如下:
1. 定义了无符号字符型变量uchar和无符号整型变量uint,方便后续使用。
```c
#define uchar unsigned char //定义无符号字符型变量
#define uint unsigned int //定义无符号整型变量
```
2. 定义了三个选择线LSA、LSB和LSC,用于选择点阵的行和数码管的列。
```c
sbit LSA=P2^2; //选择线
sbit LSB=P2^3;
sbit LSC=P2^4;
```
3. 定义了共阴极数码管0~F和字母A~D的编码,用于显示相应的数字和字母。
```c
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴极数码管0~7编码
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管8~F编码
uchar code letter[]={
0x00,0x7e,0x81,0x81,0x81,0x42,0x3c,0x00, //字母A的编码
0x00,0xff,0x89,0x89,0x89,0x76,0x00,0x00, //字母B的编码
0x00,0x3c,0x42,0x81,0x81,0x81,0x42,0x00, //字母C的编码
0x00,0xff,0x81,0x81,0x81,0x42,0x3c,0x00}; //字母D的编码
```
4. 定义了延时函数delay,用于控制程序运行速度。
```c
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
```
5. 主函数中使用循环嵌套实现了点阵字母渐变显示的功能。
```c
void main()
{
uchar i,j,k,m;
while(1)
{
for(m=0;m<4;m++) //循环显示字母A~D
{
for(k=0;k<100;k++) //渐变过程
{
for(i=0;i<8;i++) //循环8列点阵
{
LSA=i; //选择第i列
P0=0xfe; //第一个数码管点亮
for(j=0;j<8;j++) //循环8行点阵
{
if(letter[m*8+i]&(0x01<<j)) //判断该位置是否需要点亮
{
P0=table[k/10]; //显示高位数字
delay(1);
P0=table[k%10]|0x80; //显示低位数字,加上小数点
}
else
{
P0=0xff; //该位置不需要点亮,熄灭LED
delay(1);
P0=0xff;
}
P0=P0>>1; //将LED数据右移一位,准备显示下一列
}
delay(2); //延时,控制显示速度
}
}
}
}
}
```
循环结构如下:
- 外层循环控制字母的循环显示,m从0到3循环四次,分别对应字母A~D。
- 中层循环控制渐变过程,k从0到99,每次循环k加1,实现渐变效果。
- 内层循环控制点阵的循环显示,i从0到7循环八次,对应点阵的八列。
- 内层循环中,先使用LSA选择第i列,然后点亮第一个数码管。
- 然后使用j循环8次,对应点阵的八行。
- 判断字母对应位置是否需要点亮,如果需要则显示高位数字和低位数字,加上小数点;否则熄灭LED。
- 将LED数据右移一位,准备显示下一列。
- 延时,控制显示速度。
以上就是使用51单片机实现led点阵字母渐变显示的详细代码和注释,希望能对您有所帮助。
阅读全文