本次任务:基于protues仿真实现at89c51控制16×16点阵led屏实现流水文字滚动,按键实现暂停,反向,调速
需要用到的工具:keil5,protues8.9
提示:以下是本篇文章正文内容,下面案例可供参考
protues是一款仿真软件,推荐使用最新版protues8.9具体下载地址:protues8.9安装
由于官方所给库中只有8×8点阵,现有两个方案:1自行绘制一个16×16点阵教程
2,用四块8×8点阵拼接而成(由于技术有限选择方案二)
先点开元件库,在库里搜索我们需要的元件
接下来任选一个自己喜欢的颜色,同理选择at89c51芯片,74h138,按键,电阻电容等等。
左上部分为51最小系统固定格式,照抄就好
四块数码点阵图
完整示例
代码如下(示例):
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define data1 P0
#define data2 P2
sbit s1=P3^6;
sbit s2=P3^7;
sbit s3=P3^4;
bit fangxiang;
uint net=0,sl=128;
int i = 20;
int alt =0;
bit mode;
uchar code tab[]={
//
0x00,0x01,0x00,0x02,0x03,0xEC,0x02,0x20,0x02,0x20,0x02,0x28,0xFE,0x26,0x12,0x20,0x12,0x28,0x12,0x26,0x12,0x20,0x13,0xE0,0x10,0x08,0x10,0x07,0x00,0x00,0x00,0x00,/*"点",0*/
/* (16 X 16 , 宋体 ) */
0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0xC3,0xFF,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,/*"个",1*/
/* (16 X 16 , 宋体 ) */
0x00,0x81,0x00,0x81,0x08,0x82,0x88,0x82,0x68,0x84,0x08,0x88,0x08,0xB0,0x0F,0xC0,0x08,0xB0,0x08,0x88,0x28,0x84,0xC8,0x82,0x08,0x82,0x00,0x81,0x00,0x81,0x00,0x00,/*"关",2*/
/* (16 X 16 , 宋体 ) */
0x08,0x20,0x06,0x20,0x40,0x7E,0x31,0x80,0x00,0x02,0x10,0x02,0x10,0x82,0x10,0x82,0x90,0x82,0x5F,0xFE,0x10,0x82,0x10,0x82,0x10,0x82,0x10,0x82,0x00,0x02,0x00,0x00,/*"注",3*/
/* (16 X 16 , 宋体 ) */
0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,/*"谢",4*/
/* (16 X 16 , 宋体 ) */
0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,/*"谢",5*/
/* (16 X 16 , 宋体 ) */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",5*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
};
void delay(uint z)
{
uchar x;
for(;z>0;z--)
for(x=110;x>0;x--);
}
void Delay20ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 216;
j = 36;
do
{
while (--j);
} while (--i);
}
void xianshi()
{
uchar aa,i;
for(i=0;i<16;i++)
{
P1=i;
data1=tab[net+aa];
aa++;
data2=tab[net+aa];
aa++;
delay(5);
data1=0;
data2=0;
P1=0x00;
if(aa>30) aa=0;
}
}
void main()
{
ET1=1;
EA=1;
TR1=1;
while(1)
{
xianshi();
if(s1==0)
{
delay(30);
TR1=~TR1;
while(!s1)xianshi();
delay(30);
}
if(s2==0)
{
delay(30);
fangxiang=~fangxiang;
while(!s2)xianshi();
delay(30);
}
if(s3==0)
{
Delay20ms();
alt = 0;
i=i-9;
if(i<0)
{
i=20;
}
Delay20ms();
}
}
}
void timer1() interrupt 3
{
alt++;
if(alt==i)
{
alt=0;
if(fangxiang==0)
{
net=net+2;
if(net>sl)
net=0;
}
else
{
net=net-2;
if(net<2)
net=sl;
}
}
}
上面是main函数,下面是头文件
/*--------------------------------------------------------------------------
INTRINS.H
Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__
#pragma SAVE
#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif
extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int abs (int);
extern void _illop_ (void);
#endif
#if !defined (__CX2__)
extern void _push_ (unsigned char _sfr);
extern void _pop_ (unsigned char _sfr);
#endif
#pragma RESTORE
#endif
将头文件导入即可
具体不做过多赘述;
如果需要修改文字内容,可以用取模软件
取模软件地址
需要注意,在放入程序后,需要将每行前后的中括号去掉
按下第一个按键即可更改速度;第二个按键暂停/启动;第三个按键反向滚动
到这里就结束啦,本人水平有限,如有错误多多指教!!