找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机驱动汉字LED点阵相关问题解答

[复制链接]
跳转到指定楼层
楼主
ID:266504 发表于 2017-12-25 14:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
efan 23:04:26
有对汉字LED点阵显示熟悉的朋友吗?  
要下雨了 23:04:51
什么问题
typhoon 23:04:54
efan 23:05:11
有段程序看不太懂
efan 23:05:26
#include <reg52.h>
#define int8 unsigned char
#define int16 unsigned int
#define int32 unsigned long
int8 flag;
int8 n;
int8 code table[][32]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*
" " */

{0x04,0x28,0x08,0x24,0x32,0x22,0xC2,0x21,0xC2,0x26,0x34,0x38,0x04,0x04,0x08,0x18,0x30,0xF0,0xC0,0x17,0x60,0x10,0x18,0x10,0x0C,
0x14,0x06,0x18,0x04,0x10,0x00,0x00},/*"",0*/

{0x02,0x02,0x04,0x82,0xF8,0x73,0x04,0x20,0x02,0x00,0xE2,0x3F,0x42,0x20,0x82,0x40,0x02,0x40,0xFA,
0x3F,0x02,0x20,0x42,0x20,0x22,0x20,0xC2,0x3F,0x02,0x00,0x00,0x00},/*"",1*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/*
" " */
                      };
void delay(void);
int16 offset;
void main(void)
{
   int8 i;
   int8 *p;
    flag=0x10;
   n=0;
   TMOD=0x01;
   TH0=0xb1;
   TL0=0xe0;
   ET0=1;
   EA=1;
   TR0=1;
   p=&table[0][0];
   while (1)
    {
       for (i=0;i<8;i++)    //显示左半边屏幕
       {
           P0=*(p+offset+2*i);
           P2=i|0x08;    //P2.4=0,P2.3=1 选中U2, 输出扫描码给U6
           delay();
           P0=*(p+offset+2*i+1);
           P2=i|0x10;   //P2.4=1,P2.3=0 选中U3, 输出扫描码给U7
           delay();
       }
       for (i=8;i<16;i++)     //显示右半边屏幕
       {
           P0=*(p+offset+2*i);
           P2=(i-8)|0x20;   //P2.5=1 P2.4=0,P2.3=0 选中U4,输出扫描码U8
           delay();
           P0=*(p+offset+2*i+1);
           P2=(i-8)|0x40;   //P2.6=1 P2.5=0,P2.4=0 选中U5,输出扫描码U9
           delay();
       }
    }
}
void delay(void)
{
   int16 i;
   for (i=0;i<50;i++)
       ;
}
void timer0() interrupt 1 using 3
{
   TF0=0;
   TH0=0xb1;
   TL0=0xe0;
   if (n<10)
    {
   n++;
    }
   else
    {
   offset+=2;
   if (offset>1100)
           offset=0;
       n=0;
    }
}
efan 23:05:57
程序有两个地方不太明白
1. P0=*(p+offset+2*i);
为什么要乘以2,原理是什么?
2.void timer0() interrupt 1 using 3
这个中断是为了产生offset的原理是什么,为什么能实现汉字的移动显示(从右至左)
efan 23:07:31
这段程序实现汉字从左到右滚动显示
╄→狂人╰☆ 23:07:38
1 16*16的点阵
2  每扫一次偏移地址加2
efan(6939780) 23:08:35
能具体一点吗?
efan(6939780) 23:09:22
1。里面还加了个 offset, 为什么能实现跑马显示
╄→狂人╰☆(63637313)23:09:23
每行16led,当然要用2个字节,这个明白吧
efan(6939780) 23:09:38
这个懂了
╄→狂人╰☆(63637313)23:10:33
中断一次,数据整体下移一行,有问题吗?
efan(6939780) 23:10:51
我想想。。。
efan(6939780) 23:12:23
不理解,是不是指offset+=2
要下雨了(422583941)23:12:58
是吧
╄→狂人╰☆(63637313)23:13:11
我没仔细看 太长了
你明白了原理再看程序就简单了
efan(6939780) 23:13:39
他是左跑马,为何下移动阿?
╄→狂人╰☆(63637313)23:14:09
我随便说的  
efan(6939780) 23:14:18

╄→狂人╰☆(63637313)23:14:58

要下雨了(422583941)23:15:00
向左跑 就是说逐步去掉左边的一些代码不要
要下雨了(422583941)23:15:44
第一列的数据逐步往右边取
efan(6939780) 23:17:17
对照汉字码看一下
{0x04,0x28,0x08,0x24,0x32,0x22,0xC2,0x21,0xC2,0x26,0x34,0x38,0x04,0x04,0x08,0x18,0x30,0xF0,0xC0,0x17,0x60,0x10,0x18,0x10,0x0C,
0x14,0x06,0x18,0x04,0x10,0x00,0x00},/*"",0*/
起始为 0x04,0x28
中断一次,跳到哪个了?是不是0x08,0x24
要下雨了(422583941)23:17:38
是的
要下雨了(422583941)23:17:51
第一列就显示了0x08,0x24
要下雨了(422583941)23:18:18
你这个程序运行对了没有
efan(6939780) 23:19:03
跑了,proteus没问题
要下雨了(422583941)23:19:12
要下雨了(422583941)23:19:12
要下雨了(422583941)23:19:36
明白了吗
╄→狂人╰☆(63637313)23:20:18
你单步跑下就更清楚了  
efan(6939780) 23:20:20
程序还有点点不明白,原理晓得了
efan(6939780) 23:38:59
我说一下算了,电路很简单,p0口发汉字码,p1口输出扫描码

汉字LED点阵显示.doc

26.5 KB, 下载次数: 5, 下载积分: 黑币 -5

汉字led

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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