本帖最后由 雷影少年 于 2012-8-24 10:09 编辑
不过旧问题刚解决就出新问题了,数组里的字是6个的时候完全没问题,但是当我把字改为22个并将数组设为xdata时问题出现了,左移前8个字的时候点阵每次移动都有闪烁现象,8个字移完后点阵全亮。
(注:经测试,当数组里的字模书达到22个时,全部左移一位需80ms左右)
程序的作用是在16x16的点阵上左移循环显示汉字“武汉电力职业技术学院信息工程系***"
为方便dx了解程序,下面是源码
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define _TR0 10000 //定义定时器初始值10ms
#define LINE P1
sbit R=P2^0;
sbit CLK=P2^1;
sbit STB=P2^2;
u8 flag_10ms;
/*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 武 --*/
u8 xdata seg[22][32]={{0x40,0x00,0x50,0x00,0x48,0x3F,0x48,0x00,0x40,0x00,0xFE,0xFF,0x40,0x00,0x40,0x04,
0x40,0x04,0x40,0x27,0x20,0x24,0x22,0x24,0x12,0x24,0x8A,0x27,0x06,0xF8,0x02,0x40},
{....}};
void zuoyi()
{
u8 i,j;
bit Bit,BIT; //定义两个位,保存移位时CY的数据
for (i=0;i<16;i++)
{
Bit=BIT=0;
for(j=22;j>0;j--)
{
seg[j-1][2*i]=seg[j-1][2*i]<<1; //左移将最高位移入CY
Bit=CY; //保存CY,
seg[j-1][2*i]=seg[j-1][2*i]|BIT; //将上次移出的最高位移放到最低位
seg[j-1][2*i+1]=seg[j-1][2*i+1]<<1; //左移将最高位移入CY
BIT=CY; //保存CY
seg[j-1][2*i+1]=seg[j-1][2*i+1]|Bit; //将上次移出的最高位移放到最低位
}
seg[21][2*i]=seg[21][2*i]|BIT; //在循环结束后将最后一次移位时的CY做第一次移位的最低位
//完成一行字模的一次移位
}
}
void write(u8 dat) //写入一个字节
{
u8 i;
for (i=0;i<8;i++)
{
dat=dat>>1;
R=CY;
CLK=0;
CLK=1;
}
}
void main()
{
EA =1; //开中断
ET0 =1;
TMOD =0x01;
TH0 =-(_TR0/256);
TL0 =-(_TR0%256);
TR0 =1;
while (1)
{
u8 i;
if(flag_10ms<100) //控制移动速度
{
for (i=0;i<16;i++)
{
write(~seg[0][2*i]); //第i行字模写入595
write(~seg[0][2*i+1]);
LINE=i; //选择第i行
STB=1;
STB=0; //显示
}
}
else
{
flag_10ms=0;
zuoyi(); //移动一次(1列)
}
}
}
void time_10ms() interrupt 1 //每10ms中断一次
{
TH0=-(_TR0/256);
TL0=-(_TR0%256);
flag_10ms++;
}
|