做LED显示屏遇到麻烦!求教各路LED显示屏高手指教!谢谢
做了个LED显示屏,但遇到麻烦!求教各路LED显示屏高手指教!谢谢!我下面那个程序是流动显示汉字的,但怎样在这个程序的基础上实现先静态显示汉字几秒钟,然后再实现流动显示?试过很多方法都不能实现,老是乱码,请求指点
#include "reg51.h"
#define OutByte() RCK = 0;RCK = 1
sbit A1 = P1^1;
sbit B1 = P1^2;
sbit SER = P1^6;
sbit SCK = P1^4;
sbit RCK = P1^5;
unsigned char code Z = {
/*欢 CBBB6 */
0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,
0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,
0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,
0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,
/*迎 CD3AD */
0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,
0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,
0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,
0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,
/*光 CB9E2 */
0x01,0x00,0x21,0x08,0x11,0x08,0x09,0x10,
0x09,0x20,0x01,0x00,0xFF,0xFE,0x04,0x40,
0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x42,
0x08,0x42,0x10,0x42,0x20,0x3E,0xC0,0x00,
/*临 CC1D9 */
0x08,0x80,0x08,0x80,0x08,0x80,0x49,0xFE,
0x49,0x40,0x4A,0x20,0x4C,0x20,0x48,0x00,
0x49,0xFC,0x49,0x24,0x49,0x24,0x49,0x24,
0x49,0x24,0x09,0xFC,0x09,0x04,0x08,0x00,
/*本 CB1BE */
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x7F,0xFC,0x03,0x80,0x05,0x40,0x05,0x40,
0x09,0x20,0x11,0x10,0x21,0x08,0x4F,0xE4,
0x81,0x02,0x01,0x00,0x01,0x00,0x01,0x00,
/*人 CC8CB */
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,
0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,
0x10,0x10,0x20,0x08,0x40,0x04,0x80,0x02
};
char zi=0;
/*
void OutByte()
{
RCK = 0;
RCK = 1;
} */
void DelayMs(int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<100;j++);
}
}
void LineScan(char line)
{
switch(line)
{
case 0:A1 = 0;B1 = 0;
break;
case 1:A1 = 1;B1 = 0;
break;
case 2:A1 = 0;B1 = 1;
break;
case 3:A1 = 1;B1 = 1;
break;
default:
break;
}
}
void SendByte(char byte)
{
char i;
for(i = 0;i<8;i++)
{
if(byte & 0x80)SER = 1; //1000_0000
else SER = 0;
byte = byte << 1;
SCK = 0;
SCK = 1; //数据提前2指令周期准备好
}
}
void initTimer(void)
{
TMOD=0x1;
TH0=0xd8;
TL0=0xf0;
}
void timer0(void) interrupt 1
{
static char i;
TH0=0xd8;
TL0=0xf0;
i++;
if(i>=50)
{
i=0;
zi++;
if(zi>2)zi=0;
}
}
void main(void)
{
char i,j,k;
initTimer();
TR0=1;
ET0=1;
EA=1;
while(1)
{
for(k=0;k<=3;k++)
{
for(j=0;j<=7;j++)
{
for(i=3;i>=0;i--)
SendByte(~Z);
}
LineScan(k);
OutByte();
DelayMs(3);
}
}
} 发这么长的程序谁看啊!最多跟你讨论下思路!看代码就免了 先把要显示的数据送去显示
再延时你需要的时间
最后再送动态的数据
如此循环。。。。。 把动态显示的静态显示做成不同的子程序,再在主程序里面调用不同的子程序,延时再调用就好。 lxa0 发表于 2013-6-15 22:29 static/image/common/back.gif
先把要显示的数据送去显示
再延时你需要的时间
最后再送动态的数据
我是这样想的啊!下面是我改的程序,但是下载进去就乱码啦
void main(void)
{
char i,j,k;
initTimer();
TR0=1;
ET0=1;
EA=1;
while(1)
{
for(k=0;k<=3;k++)
{
for(j=0;j<=7;j++)
{
for(i=3;i>=0;i--)
SendByte(~Z);
DelayMs(3);
SendByte(~Z);
}
LineScan(k);
OutByte();
DelayMs(3);
}
}
} lxa0 发表于 2013-6-15 22:29 static/image/common/back.gif
先把要显示的数据送去显示
再延时你需要的时间
最后再送动态的数据
哦哦,为啥不能加个延时?我加延时后就乱码了!
void main(void)
{
char i,j,k;
initTimer();
TR0=1;
ET0=1;
EA=1;
while(1)
{
for(k=0;k<=3;k++)
{
for(j=0;j<=7;j++)
{
for(i=3;i>=0;i--)
SendByte(~Z);//静态显示
DelayMs(3);
SendByte(~Z);//流动显示
}
LineScan(k);
OutByte();
DelayMs(3);
}
}
} 我觉得用定时器+状态机好弄 sdwy 发表于 2013-6-16 07:29 static/image/common/back.gif
我觉得用定时器+状态机好弄
状态机是怎么搞的!不清楚耶!求指点 你这是P10的屏幕吧,我做过,你写两个函数轮流调换就可以了 Huangwenfeng 发表于 2013-6-16 10:21 static/image/common/back.gif
状态机是怎么搞的!不清楚耶!求指点
我的意思与4楼和9楼两位朋友的一致
我说仔细点:
你写2个子程序
一个是数据不移动用的显示扫描
另一个是数据移动用的显示扫描
它俩交替调用
调用之间的空闲时间用个延时
就OK了
现在明白了吧? 滚动显示最好竖着扫描 lxa0 发表于 2013-6-16 11:32 static/image/common/back.gif
我的意思与4楼和9楼两位朋友的一致
我说仔细点:
你写2个子程序
知道!貌似在这个程序的基础上不能够实现耶! 对呀
哪有直接就能实现的
那得自己学代码呀 lxa0 发表于 2013-6-17 20:29 static/image/common/back.gif
对呀
哪有直接就能实现的
那得自己学代码呀
好的,谢谢啊!我试试再定义一个变量 飞思卡驴 发表于 2013-6-16 10:27 static/image/common/back.gif
你这是P10的屏幕吧,我做过,你写两个函数轮流调换就可以了
不太懂耶!{:smile:} Huangwenfeng 发表于 2013-6-18 05:57 static/image/common/back.gif
好的,谢谢啊!我试试再定义一个变量
不是很懂
页:
[1]