找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2931|回复: 6
打印 上一主题 下一主题
收起左侧

LED点阵问题求教

[复制链接]
跳转到指定楼层
楼主
ID:65890 发表于 2014-9-7 01:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
取字模时是8*40的点阵,为什么我将index改成40运行到最后会出现一行乱码


#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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,
    0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,
    0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
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;  //动态扫描的索引
    static unsigned char tmr = 0;  //250ms软件定时器
    static unsigned char index = 39;  
    TH0 = 0xFC;  //重新加载初值
    TL0 = 0x67;
    //以下代码完成LED点阵动态扫描刷新
    P0 = 0xFF;   //显示消隐
    switch (i)
    {
        case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index-7]; break;
        case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index-6]; break;
        case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index-5]; break;
        case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index-4]; break;
        case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index-3]; break;
        case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index-2]; break;
        case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index-1]; break;
        case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index-0]; break;
        default: break;
    }
    //以下代码完成每250ms改变一帧图像
    tmr++;
    if (tmr >= 250)  //达到250ms时改变一次图片索引
    {
        tmr = 0;
        if (index <= 8)  
            index = 39;
        else
            index--;
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-9-7 20:45 来自手机 | 只看该作者
电路图呢
回复

使用道具 举报

板凳
ID:58502 发表于 2014-9-8 00:51 | 只看该作者
index取值范围是0-39,刚好哦40个对应点阵的40行。如果改为40,就有41行了,所以出错。如果你硬要用40的话就需要将图片的字模表改一下
回复

使用道具 举报

地板
ID:65837 发表于 2014-9-9 09:48 | 只看该作者
8*40,只有39,如果你喜欢40,就取1~40好了
回复

使用道具 举报

5#
ID:70898 发表于 2014-12-22 14:45 | 只看该作者
楼主是用的宋雪松老师的单片机吧,错误挺明显的,字模数组一共40个元素,编号从0~39。当你取40时image[index-0]找不到你赋的值,可能就去找内存其他地址的数据读出来了。我试过了,取40的时候读出的数据是0x4B。之后就正常了,因为你在中断末尾加了一句让它回归39这个初值的语句。如果楼主把这里的39也改成40,之后的每次循环开始处都会出现0x4B对应的LED灯亮的情况了。
回复

使用道具 举报

6#
ID:71239 发表于 2014-12-27 22:17 | 只看该作者
你好 我也在研究这个 交流交流经验
回复

使用道具 举报

7#
ID:250660 发表于 2017-12-3 11:39 | 只看该作者


我自己用了p1   p2脚。没有驱动芯片,只有单片机和最小系统,大神救救我,给我程序。可以显示4个汉字的那种
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表