efan 23:04:26
有对汉字 LED 点阵显示熟悉的朋友吗?
要下雨了 23:04:51
什么问题
typhoon 23:04:54
恩
efan 23:05:11
有段程序看不太懂
efan 23:05:26
#include
#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,0
x00,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,0
x40,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,0
x00,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;
delay();
//P2.4=0,P2.3=1 选中 U2, 输出扫描码给 U6
P0=*(p+offset+2*i+1);
P2=i|0x10;
delay();
//P2.4=1,P2.3=0 选中 U3, 输出扫描码给 U7
}
for (i=8;i<16;i++)
{
//显示右半边屏幕
P0=*(p+offset+2*i);
P2=(i-8)|0x20;
delay();
//P2.5=1 P2.4=0, P2.3=0 选中 U4,输出扫描码 U8
P0=*(p+offset+2*i+1);
P2=(i-8)|0x40;
delay();
//P2.6=1 P2.5=0, P2.4=0 选中 U5,输出扫描码 U9
}
}
}
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,原理是什么?
16*16 的点阵
2.void timer0() interrupt 1 using 3
这个中断是为了产生 offset 的原理是什么,为什么能实现汉字的移动显示(从右至左)
efan 23:07:31
这段程序实现汉字从左到右滚动显示
╄→狂人╰☆ 23:07:38
1
2 每扫一次偏移地址加 2
efan(6939780) 23:08:35
能具体一点吗?
efan(6939780) 23:09:22
1。里面还加了个 offset, 为什么能实现跑马显示
╄→狂人╰☆(63637313) 23:09:23
每行 16 个 led,当然要用 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 口输出扫描码