51单片机 16X16点阵 代码程序出问题了,请求帮助、谢谢!!!

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS = P3^0;
sbit SH_CP = P3^1;
sbit ST_CP = P3^2;
uint code num[5][32]=
{
{0x00,0x7F,0x04,0x04,0x04,0x0F,0x08,0x08,0x10,0x10,0x1F,0x00,0x00,0x00,0xFF,0x00,
0x00,0xFC,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x20,0xE0,0x20,0x40,0x40,0xFE,0x00},/*"互",0*/
/* (16 X 16 , 宋体 )*/
{0x08,0x08,0x08,0x08,0xFE,0x08,0x18,0x1C,0x2A,0x2A,0x48,0x88,0x08,0x08,0x08,0x08,
0x00,0xFC,0x84,0x84,0x84,0xFC,0x84,0x84,0x84,0xFC,0x84,0x84,0x84,0x84,0xFC,0x84},/*"相",1*/
/* (16 X 16 , 宋体 )*/
{0x08,0x08,0xFF,0x08,0x7E,0x08,0xFF,0x10,0x20,0x41,0xBF,0x21,0x21,0x21,0x21,0x01,
0x00,0x7C,0x48,0x50,0x48,0x44,0x54,0x48,0x40,0x00,0xF8,0x08,0x08,0x28,0x10,0x00},/*"帮",2*/
/* (16 X 16 , 宋体 )*/
{0x00,0x7C,0x44,0x44,0x44,0x7C,0x44,0x44,0x7C,0x44,0x44,0x44,0x4E,0xF0,0x01,0x02,
0x20,0x20,0x20,0x20,0xFC,0x24,0x24,0x24,0x24,0x24,0x24,0x44,0x44,0x84,0x28,0x10},/*"助",3*/
/* (16 X 16 , 宋体 )*/
{0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",4*/
/* (16 X 16 , 宋体 )*/
};
uint t=0,z=0,temp;
uchar i=0,j=0,k;
void delay (uint ms)
{
uchar t;
while(ms--)for(t = 0;t < 120;t ++);
}
void in_595()
{
uchar i=0;
for(i = 0;i < 16;i ++)
{
temp <<= 1;
DS=CY;
SH_CP = 1;
_nop_();_nop_();
SH_CP = 0;
}
}
void out_595()
{
ST_CP = 0;
_nop_();
ST_CP = 1;
_nop_();
ST_CP = 0;
}
void io_595()
{
in_595();
//_nop_();
out_595();
}
void rwe ()
{
temp = num[z][i*2];
io_595();
temp = num[z][i*2+1];
io_595();
i = i%16;
}
/*void rwe ()
{
temp = num[z][(k+(i*2))%80];
io_595();
temp = num[z][(k+(i*2+1))%80];
io_595();
i = i%16;
}*/
void main ()
{
P3 = 0;
TMOD = 0x01;
TH0 = -4000/256;
TL0 = -4000%256;
IE = 0x82;
TR0 = 1;
while(1);
}
void ET_int () interrupt 1
{
TH0 = -4000/256;
TL0 = -4000%256;
P1 = (P1+1)%16;
rwe();
i++;
if(++t != 600)return;
t = 0;
z = (z + 1)%5;
}

void rwe ()
{
temp = num[z][i*2];
io_595();
temp = num[z][i*2+1];
io_595();
i = i%16;
}
在这里,temp是16位的,num虽然定义是16位的,但实际有效数据是8位的,
改成一下试试:
void rwe ()
{
temp = num[z][i*2];
temp<<=8;
temp += num[z][i*2+1];
io_595();
i = i%16;
}追问

首先,先谢谢你的建议。
但可能还有错误哦
我把它写成这样
void rwe()
{
te = num[z][i*2];
te = te << 8;
mp = num[z][i*2+1];
temp = te | mp;
io_595();
i = i%16;
}
效果跟你的建议一样

追答

现在是什么样的,能上图片不?

追问

好吧,是我取模那弄错了,程序现在是木有问题的。谢谢你哈

追答

从图片看,16*16的LED已经全部可以点亮了,会不会是你的字模和你的程序不配套啊。

根据字模我画了好几个图,终于有一个像个字的:

所以,你的程序按以下试试:

void rwe ()

{

temp = num[z][i];

temp<<=8;

temp += num[z][16+i];

io_595();

i = i%16;

}

 

刚才在画图,没注意,你已经搞定了啊

追问

void rwe()
{
te = num[z][i*2];
te = te << 8;
mp = num[z][i*2+1];
temp = te | mp;
io_595();
i = i%16;
}
觉得这个比较好理解

追答

你是说“或”和“+”的问题,字模的问题?
或和加对于操作数0x00来讲是一样的,但是对于非0的来讲是有区别的。
至于字模,只要程序配合就行了。恭喜试验成功啊

温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机下,谁能教我一下 16X16点阵怎么 让字移动起来啊?
多建一个缓冲区,将移位的数据从缓冲区读出加入到显示字符的最后一位,前面的数据移动一位,移动那一位数据加在前一位数据的最后一位。缓冲区的数据移完后再加入,一般是8位的数据。也就是说移8次加载一次数据到缓冲区。

51单片机用四个74HC595联级驱动16x16的LED点阵,用达林顿ULN2803做行驱...
要不了这么多驱动两个74HC59和一个74HC154.给你图你看看。

Proteus电路控制16X16点阵显示屏的程序问题
首先调出一个8×8点阵,在点阵的管脚上接上VCC,另一端的管脚就接GND,运行仿真,看看点阵是不是能亮,亮了哪几个点,如果不亮就调换VCC和GND,这样测出点阵的行和列,共阴或共阳等引脚信息。然后接上网络标识,行和行接同一个网络标志,列和列接在一起。多个8×8拼在一起就好了。

求一LED点阵书写显示屏。16x16的,仿真图加c51源程序,原理图,谢谢!!!
int16 i;for(i=0;i<1000;i++);}

16x16点阵程序
16x16点阵程序 (1)有两种工作模式第一种工作模式16*16能滚动显示”FPGA”,第二种工作模式能滚动显示”EDA”(2)设计两个按键,一个复位按键,复位之后,屏幕不显示;另一个按键用于模式切换,第一次... (1) 有两种工作模式第一种工作模式16*16能滚动显示”FPGA”,第二种工作模式能滚动显示”EDA”(2) 设计两个...

用51单片机做16*16点阵需要哪些材料
首先最基本的要求是点阵驱动。因为16x16,要用32个I\/O口,对于89S51单片机这是不现实的。所以需要I\/O口扩展。I\/O扩展有很多方法,比较常用的是用四个锁存器(74HC573),把一组八个I\/O口的数据在四个时钟周期内分别锁存在四个锁存器里。这是最简单最笨的方法(用12个IO口),而且有缺陷。。更...

求16*16点阵89c51制作程序和图纸
四块点阵拼起来,横向两个的行接一起,纵向的列接一起(接前将行列测出来,我这儿假设行接高电平,即内部二极管的阳极,反之列接低)。这样就形成了16X16的点阵显示屏了。驱动电路,行 用两块245驱动16行,列 用两块595级联 并行输出16根线分别接块2803后再接点阵的16列,这样亮度更高。理论不接...

基于51单片机的16x16 led点阵显示屏设计原理与电路图
SCAN16:MOV A,R2 CLR C SUBB A,#32 MOV R2,A AJMP START END16:INC DPTR INC DPTR MOV A,R2 CLR C SUBB A,#32 MOV R2,A MOV A,R0 MOV R3,A AJMP START SLOW:LCALL DELAY20000 DEC R0 JB P1.0,AJMP BACK SOON:LCALL DELAY20000 INC R0 JB P1.1,AJMP BACK BACK:LCALL DELAY...

用单片机控制的16x16点阵LED循环显示“旋影电子信息协会期待你加入...
!首先,你的显示设备是点阵,所以要把你要现实的文字转换成点阵,这个需要一些软件,或者自己用画图程序画出点阵,就可以了。然后,就是显示了!!按照字符点阵的数据,看字符点阵的二进制,是1就点亮LED点阵对应的LED,是0就熄灭对应的LED,这样就出现显示汉字的效果了,以此类推,即可显示所有汉字!!

【51单片机系列】proteus中创建16x16LED点阵
本文主要介绍了如何在Proteus8.6中创建16x16 LED点阵,以及如何使用8x8点阵制作16x16点阵。首先,文章详细介绍了在Proteus中测试8x8点阵的电流方向和行列控制接口的方法,结果表明红色点阵电流方向为上->下,蓝色、绿色和橘色点阵为下->上,红色点阵接口为上列下行,其他颜色点阵为上行下列。其次,文章提供了...

相似回答