51单片机:编程实现LED点阵静态显示一个心形

LED点阵是8*8个LED灯排列成矩阵的形式,其中每行LED灯的阳极连接在一起,每列LED灯的阴极连接在一起。其显示图形的原理与数码管显示数字的原理类似。

 

 代码:

#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[] = {  //?????????
    0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7
};

void main()
{
    EA = 1;       //??????ж?
    ENLED = 0;    //???U4?????LED????
    ADDR3 = 0;
    TMOD = 0x01;  //????T0???1
    TH0  = 0xFC;  //?T0?????0xFC67?????1ms
    TL0  = 0x67;
    ET0  = 1;     //???T0?ж?
    TR0  = 1;     //???T0
    while (1);
}
/* ?????0?ж?????? */
void InterruptTimer0() interrupt 1
{
    static unsigned char i = 0;  //???????????

    TH0 = 0xFC;  //?????????
    TL0 = 0x67;
    //???′??????LED???????????
    P0 = 0xFF;   //???????
    switch (i)
    {
        case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[0]; break;
        case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[1]; break;
        case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[2]; break;
        case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[3]; break;
        case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[4]; break;
        case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[5]; break;
        case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[6]; break;
        case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[7]; break;
        default: break;
    }
}

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要通过51单片机控制LED点阵显示。常见的LED点阵有8x8、16x16等多种规格,这里以8x8点阵为例。 在点阵显示字母,我们需要将字母转换成点阵的形式。可以使用字符库,每个字符对应一个点阵数组。也可以使用字模生成软件,将字母转换成点阵。 对于字母渐变显示,我们可以通过改变LED点阵中的亮度来实现。使用PWM技术可以实现LED的亮度调节。具体实现步骤如下: 1. 初始化LED点阵和PWM模块。 2. 将要显示的字母转换成点阵数组。 3. 循环控制每一行的显示,逐渐增加每个LED的亮度直到最大值,然后逐渐降低亮度直到最小值。 4. 重复上述步骤,直到所有的字母都显示完毕。 下面是一个简单的示例代码: ```c #include <reg52.h> sbit LATCH = P1^0; // LED点阵锁存引脚 sbit CLK = P1^1; // LED点阵时钟引脚 sbit DATA = P1^2; // LED点阵数据引脚 void delay(int t) // 延时函数 { int i, j; for(i = t; i > 0; i--) for(j = 110; j > 0; j--); } void init_led() // 初始化LED点阵 { LATCH = 1; CLK = 0; DATA = 0; } void send_byte(unsigned char dat) // 发送数据到LED点阵 { unsigned char i; for(i = 0; i < 8; i++) { CLK = 0; DATA = (dat & 0x80) >> 7; CLK = 1; dat <<= 1; } } void show_char(unsigned char ch, unsigned char duty) // 显示一个字母 { int i, j; unsigned char code *p; p = &font[ch * 8]; // 字母点阵数组的起始地址 for(i = 0; i < 8; i++) { for(j = 0; j < 8; j++) { if(p[i] & (1 << j)) { send_byte(duty); } else { send_byte(0); } } } } void main() { int i, j, duty; init_led(); TMOD = 0x01; TR0 = 1; while(1) { for(i = 0; i < 26; i++) // 循环显示26个字母 { for(duty = 0; duty < 256; duty++) // 增加亮度 { for(j = 0; j < 8; j++) // 显示每一行 { show_char('A' + i, duty); } LATCH = 0; LATCH = 1; } for(duty = 255; duty >= 0; duty--) // 降低亮度 { for(j = 0; j < 8; j++) { show_char('A' + i, duty); } LATCH = 0; LATCH = 1; } } } } ``` 以上代码只是一个简单的示例,具体实现需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值