基于51单片机和7219的秒表 为什么proteus仿真时候一直闪?

qq_41437598 2019-01-15 06:03:47
拜托了
进行仿真的时候是这样的

然后源程序如下
#include<reg51.h>
#define uchar unsigned char
#define DECODE 0X09
#define INTENSITY 0x0a
#define SCANLIMIT 0x0b
#define SHUTDOWN 0x0c
#define DISPLAY 0x0f

sbit start=P1^0;//启动按钮
sbit reset=P1^1;//复位按钮
sbit plus=P1^2;//加号按钮
sbit minus=P1^3;//减号按钮
sbit DIN=P3^0;
sbit LOAD=P3^1;
sbit CLK=P3^2;//MAX7219芯片


uchar i;uchar a;//定义变量
uchar add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
uchar dat[]={0x00,0x01,0x02,0x03,0x04,0x04,0x05,0x05,0x06,0x07,0x08,0x09};//
void display(uchar a);//显示子程序
void InitTimer0();//定时器初始化程序
void delay(uchar n);//延时
void max7219(uchar add,uchar dat);//max7219指令函数
void max7219_init();//7219初始化
void keyscan();//键盘扫描函数
/*************主程序****************/
void main()
{
max7219_init();
InitTimer0();
display(a);
while(1)
{
keyscan();
}
}


/*****定时器初始化函数******/
void InitTimer0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=0xd8;
TL0=0xef;
TR0=0;
i=0;//时间计数
a=0;//中断计数
}

/***********定时器T0中断*****************/
void t0_func() interrupt 1
{
TH0=0xd8;
TL0=0xef;
if(i==100)
{
i=0;
a++;
if(a>99)
{
a=0;
}

}
else
{
i++;
}
display(a);
}



/**************max7219指令函数****************/
void max7219(uchar add,uchar dat)
{
uchar ADS,m,n;
LOAD=0;
m=0;
while(m<16)
{
if(m<8)
{
ADS=add;
}
else
{
ADS=dat;
}
for(n=8;n>=1;n--)
{
DIN=ADS&0x80;
ADS=ADS<<1;
CLK=1;
CLK=0;
}
m=m+8;
}
LOAD=1;
}
/***********7219初始化***********************/
void max7219_init()
{
max7219(DECODE,0xff);
max7219(INTENSITY,0xf5);
max7219(SCANLIMIT,0x01);
max7219(SHUTDOWN,0x01);
max7219(DISPLAY,0x00);
}
/************显示子程序****************/
void display(uchar a)
{
uchar ge,shi;
ge=a%10;
shi=a/10;
max7219(add[1],dat[ge]);
max7219(add[0],dat[shi]);
}
/***************延时*******************/
void delay(uchar n)
{
uchar b,c;
for(b=0;b<110;b++)
{for(c=0;c<n;c++);}
}
/************keyscan****************/
void keyscan()
{
if(start==0)
{
delay(10);
if(start==0)
{
TR0=!TR0;
while(!start);
}
}
if(reset==0)
{
delay(10);
if(reset==0)
{
a=0;
i=0;
TR0=0;
display(i);
while(!reset);
}
}
if(plus==0)
{
delay(10);
if(plus==0)
{
i=i++;
display(i);
while(!plus);
}
}
if(minus==0)
{
delay(10);
if(minus==0)
{
i=i--;
display(i);
while(!minus);
}
}
}
=========================
想知道到底哪里出错了啊拜托了各位!!!!!!!!!!!!!!!!!!!!!!!!!
谢谢谢谢谢谢
...全文
368 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangxin509 2019-01-20
  • 打赏
  • 举报
回复
7219是自己扫描的,有新的数据传给他之前都会显示以前的数据
Goodsama 2019-01-18
  • 打赏
  • 举报
回复
不懂,很难,学习中,这个是什么软件?是IDE吗?
  • 打赏
  • 举报
回复
程序逻辑问题,建议把显示放主程循环中一处即可,不需要到处调用.
yishumei 2019-01-17
  • 打赏
  • 举报
回复
数码管闪烁一般是扫描时间过快造成的,楼主试试把max7219(SCANLIMIT,0x01)改成max7219(SCANLIMIT,0x07)。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧