新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机实习报告——点阵的动态显示

单片机实习报告——点阵的动态显示

作者: 时间:2016-11-24 来源:网络 收藏

void adjust_moveleft(uchar x,uchar *dat)//第i个字符逐列左移
{
uchar j,k;
for(j=0;j<8;j++)
{
k=*dat;
k<<=x;
temp[j]=k;
dat++;
}
}
void adjust_moveright(uchar x,uchar *dat)//第i个字符显示出x列后存储在temp数组中
{
uchar j,k;
for(j=0;j<8;j++)
{
k=*dat;
k>>=x;
temp[j]=k;
dat++;
}
}
void disp_moveleft(uchar *dat)
{
uchar i,t;
for(i=8;i>0;i--)//逐列显示出字符
{
adjust_moveright(i,dat);
t=time;
disp_dat(t);
}
for(i=0;i<=8;i++)//字符显示完全后,逐列左移直到全部移出
{
adjust_moveleft(i,dat);
t=time;
disp_dat(t);
}
}
void adjust_jingtai(uchar *dat)
{
uchar i;
for(i=0;i<8;i++)
{
temp[i]=*dat;
dat++;
}
}
void disp_moveup(uchar *dat)
{
uchar i,j,t;
for(i=0;i<6;i++)
{
for(j=0;j<8;j++)
{
dat++;
adjust_jingtai(dat);
t=time;
disp_dat(t);
}
disp_dat(30);
}
}
void main()
{
while(1)
{
uchar j;
for(j=0;j<8;j++)
temp[j]=smile[2][j];
disp_dat(30);
if(key1==0)
{
bee=0;
delayms(1);
bee=1;
delayms(1);
if(key1==0)//向左滚动
{
uchar i;
for(i=1;i<6;i++)
{
disp_moveleft(&sz[i][0]);
}
}
while(key1==0);
}
if(key2==0)
{
bee=0;
delayms(1);
bee=1;
delayms(1);
if(key2==0)//向上滚动
{
disp_moveup(&sz[0][0]);
}
while(key2==0);
}
if(key3==0)
{
delayms(1);
if(key3==0)//减速
{
time=time+1;
}
while(key3==0);
bee=0;
delayms(1);
bee=1;
}
if(key4==0)
{
delayms(1);
if(key4==0)//加速
{
if(time!=1)
time=time-1;
}
while(key4==0);
bee=0;
delayms(1);
bee=1;
}
}
}

四、误差分析及改进

该实例是控制点阵显示的程序,不涉及时间,也就没有时间的误差。但是主程序中用的是扫描法检测是否有键盘控制输入,而且扫描过程中还插入了显示动态笑脸界面的程序段,扫描程序显得稍有冗长,所以短暂的按键可能没有被程序扫描到。

为了解决这个问题,可以让扫描程序变得简短清晰些,所以,将动态笑脸改为了静态的笑脸。对键盘的操作时间(即按键的时间)要适当长些,以便被程序捕捉。为了便于控制时间的长短,在程序中利用了蜂鸣器的功能,一旦按键操作被程序扫描到,蜂鸣器蜂鸣,以提示操作者键盘操作有效。

程序不足之处是:
1.键盘的操作不够灵敏。
2.只能在一次滚动结束后,即再次出现一个静态笑脸时才能够操作键盘。

如果改为中断法响应键盘,或许会更灵敏些。这需要四个中断服务程序处理按键事件。并且把实现不同方向滚动的程序段放在终端服务程序之外,可以解决第二个不足之处,即可以在滚动过程中,响应不同的按键。




上一页 1 2 下一页

评论


技术专区

关闭