高级会员
主题
回帖0
积分1033
阅读权限30
注册时间2010-6-10
最后登录1970-1-1
在线时间 小时
|
这是上个星期在二手市场淘的32*32全彩LED点阵板,经过一个星期的努力,终于能让它显示了,行用154,列用了24个595,现在只能显示简单的汉字,如果能让它显示时间就好了,但这对于一个初出茅庐的菜鸟来说是多么难实现的啊!现把资料贴出来,因为线路有点复杂没有画完整,不能仿真,只能当原理图,望大家谅解!
现在菜鸟正有个问题请教,这是个可以级联的595点阵程序,但我在程序上定义595的级联数却不能超过15个,哪位大哥可以帮帮忙???
#include "reg52.h"
#define BLKN 8 //列锁存器数(=LED显示字数*2) 就是这里,超过了15个程序就出错!!
#define TOTAL 4 //待显示字个数,本例共4个
#define CONIO P1 //显示控制口
sbit G=CONIO^7; //CONIO.7为154译码器显示允许控制信号端口,0时输出,1时输出全为高阻态.
sbit CLK=CONIO^6; //CONIO.6为595输出锁存器时钟信号端,1时输出数据,从1到0时锁存输出数据.
sbit SCLR=CONIO^5; //CONIO.5为595移位寄存器清零口,平时为1,为0时,输出全为0.
unsigned char idata dispram[(BLKN/2)*32]={0}; //显示区缓存,四字共4*32单元
//**************字模表******************//
unsigned char code Bmp[][32]={
{0xEF,0xFF,0xEF,0x03,0x81,0xBB,0xDD,0xBB,0xDD,0xD7,0xEB,0xEF,0xF3,0xD7,0xCD,0xB9,
0x3E,0xFF,0xC0,0x07,0xFE,0xF7,0xFD,0xF7,0xFD,0xF7,0xFB,0xF7,0xF7,0xD7,0xEF,0xEF},/*-- 文字: 努 --*/
{0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x80,0x03,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,
0xFE,0xFB,0xFD,0xFB,0xFD,0xFB,0xFB,0xFB,0xFB,0xFB,0xF7,0xFB,0xEF,0xD7,0xDF,0xEF},/*-- 文字: 力 --*/
{0xFE,0xF7,0xEF,0x73,0xF3,0x37,0xF7,0x6F,0x80,0x01,0xBF,0xFB,0x70,0x17,0xFF,0xBF,
0xFF,0x7F,0x80,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFD,0x7F,0xFE,0xFF},/*-- 文字: 学 --*/
{0xFF,0xFF,0xC0,0x03,0xFF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFC,0xFB,0xFE,0xEB,0xFF,0x9B,
0xFE,0x7B,0xF9,0xFB,0xC7,0xFB,0xEF,0xFB,0xFF,0xFB,0xFF,0xDB,0xFF,0xEA,0xFF,0xF6},/*-- 文字: 习 --*/
};
/***********延时函数(约1毫秒)************/
void delay(unsigned int dt)
{
register unsigned char bt;
for (; dt; dt--)
for (bt=0; bt<255; bt++);
}
/*****************主函数 *********************/
void main(void)
{
register unsigned char i,j,k,l,q,w;
//初始化
SCON = 0x00; //串口工作模式0:移位寄存器方式
TMOD = 0x01; //定时器T0工作方式1:16位方式
TR0 = 1; //启动定时器T0
CONIO = 0x3f; //CONIO端口初值
IE = 0x82; //允许定时器T0中断
//
while (1)
{
delay(2000); //2秒
//卷帘出显示文字,每次字数为BLKN/2,共显示TOTAL*2/BLKN次
for (w=0;w<TOTAL*2/BLKN;w++)
{
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp[q+w*BLKN/2];}
if (i%2) delay(120);
}
delay(3000);
}
//第三种显示效果:左移出显示
for (i=0; i<TOTAL; i++)
{
for (j=0; j<2; j++)
for (k=0; k<8; k++)
{
for (l=0; l<16; l++)
{
for(q=0;q<BLKN/2;q++)
{
dispram[l*2+q*32] = dispram[l*2+q*32]<<1 | dispram[l*2+1+q*32]>>7;
if(q==BLKN/2-1) dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | Bmp[l*2+j]>>(7-k);
else dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | dispram[l*2+(q+1)*32]>>7;
}
}
delay(100);
}
}
delay(3000);
}
}
//主函数结束
/**********显示屏扫描(定时器T0中断)函数**********/
void leddisplay(void) interrupt 1 using 1
{
register unsigned char m, n=BLKN;
TH0 = 0xFc; //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
TL0 = 0x18;
m = CONIO; //读取当前显示的行号
m = ++m & 0x0f; //行号加1,屏蔽高4位
do {
n--;
SBUF = dispram[m*2+(n/2)*30 + n]; //送显示数据
while (!TI); TI = 0;
}while (n); //完成一行数据的发送
G = 1; //消隐(关闭显示)
CONIO &= 0xf0; //行号端口清○
CLK=1; //显示数据打入输出锁存器
CONIO |= m; //写入行号
CLK=0; //锁存显示数据
G = 0; //打开显示
}
// |
评分
-
查看全部评分
|