51单片机的4位数码管做简易秒表C语言程序 20
下列这个程序是51单片机的数码管做简易秒表4位数码管的C语言程序,还少键盘扫描子程序,并且还有错误,拜托拜托啦!!!#include"dz110306140.h"#def...
下列这个程序是51单片机的数码管做简易秒表4位数码管的C语言程序,还少键盘扫描子程序,并且还有错误,拜托拜托啦!!!
#include"dz110306140.h"
#define uchar unsigned char
#define uint unsigned int
uchar begin1;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P1_7=P1^7;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uchar code TABLE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar ms,mm;
uint m,tab[8];
uint LED0,LED1,LED2,LED3;
bit add;
bit bit_add1;
bit bit_sub;
bit scankey;
bit chedk;
bit keydown;
bit fast_add;
bit double_key;
bit K2_keydown;
bit fast_sub;
bit sub;
bit K3_keyup;
bit K3_keydown;
bit count_down;
bit start;
bit stop;
bit eight_start;
bit eight_stop;
void main(void)
{
void begin11();
TMOD=0x01;
TL0=0x18;
TH0=0xfc;
EA=1;
ET0=1;
TR0=1;
for(;;)
{
if(scankey==1)
{
scankey=0;
scan();
if(double_key==1)
{
P2_6=0;
P2_7=1;
m=m+10;
add1(m);
}
if(fast_add)
{
P2_6=0;
P2_7=1;
m++;
add1(m);
bit_add1=0;
}
if(add==1)
{
P2_6=0;
P2_7=1;
add=0;
m++;
add1(m);
}
if(double_sub==1)
{
P2_6=0;
P2_7=1;
m=m-10;
add1(m);
}
if(fast_sub==1)
{
P2_6=0;
P2_7=1;
m--;
add1(m);
bit_sub=0;
}
if(sub==1)
{
P2_6=0;
P2_7=1;
sub=0;
m--;
add1(m);
}
if(start==1)
{
if(mm==0)
P2_7=!P2_7;
P2_6=1;
m++;
if(m==6000)
m=0;
add1(m);
}
if(stop==1)
start=0;
if(count_down==1)
{
if(m>0)
m--;
P2_7=1;
if(mm==0)
P2_6=!P2_6;
}
}
}
}
void begin11(void)
{
fast_add=0;
bit_add1=0;
mm=0;
m=0;
ms=0;
LED0=0;
LED1=0;
LED2=0;
LED3=0;
add=0;
double_key=0;
scankey=0;
keydown=0;
K3_keydown=0;
count_down=0;
P2_6=1;
P2_7=0;
}
void time(void)
{
TL0=0x18;
TH0=0xfc;
ms++;
if(ms==10)
{
ms=0;
mm++;
if(mm==20)
mm=0;
scankey=1;
}
display();
}
void add1(time)
{
//uint time;
uint n,a,time;
a=time/1000;
LED0=a;
n=time%1000;
LED1=(n/100);
n=n%100;
LED2=(n/10);
LED3=n%10;
}
void display(void)
{
switch(ms%4)
{
case 0:
P3=0xfe;
P1=table[LED3];
P1_7=1;
break;
case 1:
P3=0xfd;
P1=table[LED2];
P1_7=1;
break;
case 2:
P3=0xfb;
P1=table[LED1];
P1_7=1;
break;
case 3:
P3=0xf7;
P1=table[LED0];
P1_7=1;
break;
default;
return;
}
} 展开
#include"dz110306140.h"
#define uchar unsigned char
#define uint unsigned int
uchar begin1;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P1_7=P1^7;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uchar code TABLE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar ms,mm;
uint m,tab[8];
uint LED0,LED1,LED2,LED3;
bit add;
bit bit_add1;
bit bit_sub;
bit scankey;
bit chedk;
bit keydown;
bit fast_add;
bit double_key;
bit K2_keydown;
bit fast_sub;
bit sub;
bit K3_keyup;
bit K3_keydown;
bit count_down;
bit start;
bit stop;
bit eight_start;
bit eight_stop;
void main(void)
{
void begin11();
TMOD=0x01;
TL0=0x18;
TH0=0xfc;
EA=1;
ET0=1;
TR0=1;
for(;;)
{
if(scankey==1)
{
scankey=0;
scan();
if(double_key==1)
{
P2_6=0;
P2_7=1;
m=m+10;
add1(m);
}
if(fast_add)
{
P2_6=0;
P2_7=1;
m++;
add1(m);
bit_add1=0;
}
if(add==1)
{
P2_6=0;
P2_7=1;
add=0;
m++;
add1(m);
}
if(double_sub==1)
{
P2_6=0;
P2_7=1;
m=m-10;
add1(m);
}
if(fast_sub==1)
{
P2_6=0;
P2_7=1;
m--;
add1(m);
bit_sub=0;
}
if(sub==1)
{
P2_6=0;
P2_7=1;
sub=0;
m--;
add1(m);
}
if(start==1)
{
if(mm==0)
P2_7=!P2_7;
P2_6=1;
m++;
if(m==6000)
m=0;
add1(m);
}
if(stop==1)
start=0;
if(count_down==1)
{
if(m>0)
m--;
P2_7=1;
if(mm==0)
P2_6=!P2_6;
}
}
}
}
void begin11(void)
{
fast_add=0;
bit_add1=0;
mm=0;
m=0;
ms=0;
LED0=0;
LED1=0;
LED2=0;
LED3=0;
add=0;
double_key=0;
scankey=0;
keydown=0;
K3_keydown=0;
count_down=0;
P2_6=1;
P2_7=0;
}
void time(void)
{
TL0=0x18;
TH0=0xfc;
ms++;
if(ms==10)
{
ms=0;
mm++;
if(mm==20)
mm=0;
scankey=1;
}
display();
}
void add1(time)
{
//uint time;
uint n,a,time;
a=time/1000;
LED0=a;
n=time%1000;
LED1=(n/100);
n=n%100;
LED2=(n/10);
LED3=n%10;
}
void display(void)
{
switch(ms%4)
{
case 0:
P3=0xfe;
P1=table[LED3];
P1_7=1;
break;
case 1:
P3=0xfd;
P1=table[LED2];
P1_7=1;
break;
case 2:
P3=0xfb;
P1=table[LED1];
P1_7=1;
break;
case 3:
P3=0xf7;
P1=table[LED0];
P1_7=1;
break;
default;
return;
}
} 展开
2个回答
展开全部
我写了个六位数码管的程序,放到这里让你参考一下,希望对你有用!
/*******************************************************************
数码管时钟秒表篇
功能简介:该程序有两个功能:时钟,秒表。key1,key2和key3键用来调节
时钟,根据LED的亮闪状态调节时钟(当八个LED全亮时为时钟显示状态,第一
个LED亮时为调节小时状态,第二个LED亮时为调节分钟状态,第三个LED亮时为
调节秒钟状态),key4键为秒表功能键。
实施步骤:第一步:开启定时器,完成数码管时钟走动功能;第二步:完成
数码管时钟调节功能;第三步:完成数码管秒表显示功能。
操作提示:功能键有四个,第二行第以列按键为调节键,第二行第二列按键
为增加数据键,第二行第三列按键为减少键,第二行第四列按键为秒表功能键。
********************************************************************
********************************************************************/
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选编码
uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71,0x00};
uchar temp; //temp为按键变量
int light,flag; //flag用来控制数码管显示的状态(显示时钟或者显示秒表),light用来控制时钟和秒表的led显示
uchar shi2,ge2,shi1,ge1; //这四个变量用来分离出实参的十位和个位
uchar num,num1,num2,num3; //num,num1用来计数,num2用来控制调节的时分秒,num3用来改变秒表状态下的显示状态
int miao,fen,shi; //时钟变量
uchar mfen,mmiao,mmmiao; //秒表变量
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void timeinit()
{
TMOD=0x11;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TH1=(65536-4608)/256;
TL1=(65536-4608)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
}
void timedisplay0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
num++;
if(num==20)
{
num=0;
miao++; //开启时钟功能
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
void timedisplay1() interrupt 3
{
TH1=(65536-4608)/256;
TL1=(65536-4608)%256;
num1++;
if(num1==2)
{
num1=0;
mmmiao++;
if(mmmiao==100) //开启秒表功能
{
mmmiao=0;
mmiao++;
if(mmiao==60)
{
mmiao=0;
mfen++;
if(mfen==60)
mfen=0;
}
}
}
}
void display(uchar add,uchar date) //数码管显示信息函数(带有小数点)
{
shi2=date/10;
ge2=date%10;
P0=0xff;
wela=1;
P0=table1[add];
wela=0;
P0=0;
dula=1;
P0=table2[shi2];
dula=0;
delay(1);
P0=0xff;
wela=1;
P0=table1[add+1];
wela=0;
P0=0;
dula=1;
P0=table2[ge2]|0x80;
dula=0;
delay(1);
}
void display1(uchar add,uchar date) //数码管显示数据(不带有小数点)
{
shi1=date/10;
ge1=date%10;
P0=0xff;
wela=1;
P0=table1[add];
wela=0;
P0=0;
dula=1;
P0=table2[shi1];
dula=0;
delay(1);
P0=0xff;
wela=1;
P0=table1[add+1];
wela=0;
P0=0;
dula=1;
P0=table2[ge1];
dula=0;
delay(1);
}
void keyscan()
{
P3=0xfd;
temp=P3; //第二行功能键
if(temp!=0xfd)
{
delay(5);
if(temp!=0xfd)
{
beep=0;
switch(temp)
{
case 0xed: num2++; //第一个按键用来控制调节时,分,秒
TR0=0;
light=1;
if(num2==4)
{
num2=0;
light=0;
TR0=1;
}
break;
case 0xdd: if(num2==1) //第二键用来增加数据
{
shi++;
if(shi==24)
shi=0;
}
if(num2==2)
{
fen++;
if(fen==60)
fen=0;
}
if(num2==3)
{
miao++;
if(miao==60)
miao=0;
}
break;
case 0xbd: if(num2==1) //第三个键用来减小数据
{
shi--;
if(shi==-1)
shi=23;
}
if(num2==2)
{
fen--;
if(fen==-1)
fen=59;
}
if(num2==3)
{
miao--;
if(miao==-1)
miao=59;
}
break;
case 0x7d: flag=1; //第四个键用来开启秒表
num3++;
TR1=1;
if(num3==1)
mfen=mmiao=mmiao=0; //清除上次残留数据
if(num3==2)
TR1=0; //暂停秒表
if(num3==3)
{
mfen=mmiao=mmmiao=0; //秒表清零
TR1=0;
}
if(num3==4) //重新开启秒表
TR1=1;
if(num3==5) //暂停秒表
TR1=0;
if(num3==6) //切换为显示时钟状态
{
flag=0;
num3=0;
}
break;
}
while(temp!=0xfd)
{
temp=P3;
}
beep=1;
}
}
}
int main()
{
timeinit();
beep=1;
while(1)
{
keyscan();
if(light==0)
{
if(miao%2==0) //当数码管显示时钟状态时,八个led将以亮一秒灭一秒的状态循环下去
P1=0;
else
P1=0xff;
}
else
{
if(num2==1)
P1=0xfe;
if(num2==2)
P1=0xfd;
if(num2==3)
P1=0xfb;
}
if(flag==0) //显示时钟
{
display(1,shi);
display(3,fen);
display1(5,miao);
}
else //显示秒表
{
display(1,mfen);
display(3,mmiao);
display1(5,mmmiao);
}
}
return 0;
}
/*******************************************************************
数码管时钟秒表篇
功能简介:该程序有两个功能:时钟,秒表。key1,key2和key3键用来调节
时钟,根据LED的亮闪状态调节时钟(当八个LED全亮时为时钟显示状态,第一
个LED亮时为调节小时状态,第二个LED亮时为调节分钟状态,第三个LED亮时为
调节秒钟状态),key4键为秒表功能键。
实施步骤:第一步:开启定时器,完成数码管时钟走动功能;第二步:完成
数码管时钟调节功能;第三步:完成数码管秒表显示功能。
操作提示:功能键有四个,第二行第以列按键为调节键,第二行第二列按键
为增加数据键,第二行第三列按键为减少键,第二行第四列按键为秒表功能键。
********************************************************************
********************************************************************/
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选编码
uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71,0x00};
uchar temp; //temp为按键变量
int light,flag; //flag用来控制数码管显示的状态(显示时钟或者显示秒表),light用来控制时钟和秒表的led显示
uchar shi2,ge2,shi1,ge1; //这四个变量用来分离出实参的十位和个位
uchar num,num1,num2,num3; //num,num1用来计数,num2用来控制调节的时分秒,num3用来改变秒表状态下的显示状态
int miao,fen,shi; //时钟变量
uchar mfen,mmiao,mmmiao; //秒表变量
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void timeinit()
{
TMOD=0x11;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TH1=(65536-4608)/256;
TL1=(65536-4608)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
}
void timedisplay0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
num++;
if(num==20)
{
num=0;
miao++; //开启时钟功能
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
void timedisplay1() interrupt 3
{
TH1=(65536-4608)/256;
TL1=(65536-4608)%256;
num1++;
if(num1==2)
{
num1=0;
mmmiao++;
if(mmmiao==100) //开启秒表功能
{
mmmiao=0;
mmiao++;
if(mmiao==60)
{
mmiao=0;
mfen++;
if(mfen==60)
mfen=0;
}
}
}
}
void display(uchar add,uchar date) //数码管显示信息函数(带有小数点)
{
shi2=date/10;
ge2=date%10;
P0=0xff;
wela=1;
P0=table1[add];
wela=0;
P0=0;
dula=1;
P0=table2[shi2];
dula=0;
delay(1);
P0=0xff;
wela=1;
P0=table1[add+1];
wela=0;
P0=0;
dula=1;
P0=table2[ge2]|0x80;
dula=0;
delay(1);
}
void display1(uchar add,uchar date) //数码管显示数据(不带有小数点)
{
shi1=date/10;
ge1=date%10;
P0=0xff;
wela=1;
P0=table1[add];
wela=0;
P0=0;
dula=1;
P0=table2[shi1];
dula=0;
delay(1);
P0=0xff;
wela=1;
P0=table1[add+1];
wela=0;
P0=0;
dula=1;
P0=table2[ge1];
dula=0;
delay(1);
}
void keyscan()
{
P3=0xfd;
temp=P3; //第二行功能键
if(temp!=0xfd)
{
delay(5);
if(temp!=0xfd)
{
beep=0;
switch(temp)
{
case 0xed: num2++; //第一个按键用来控制调节时,分,秒
TR0=0;
light=1;
if(num2==4)
{
num2=0;
light=0;
TR0=1;
}
break;
case 0xdd: if(num2==1) //第二键用来增加数据
{
shi++;
if(shi==24)
shi=0;
}
if(num2==2)
{
fen++;
if(fen==60)
fen=0;
}
if(num2==3)
{
miao++;
if(miao==60)
miao=0;
}
break;
case 0xbd: if(num2==1) //第三个键用来减小数据
{
shi--;
if(shi==-1)
shi=23;
}
if(num2==2)
{
fen--;
if(fen==-1)
fen=59;
}
if(num2==3)
{
miao--;
if(miao==-1)
miao=59;
}
break;
case 0x7d: flag=1; //第四个键用来开启秒表
num3++;
TR1=1;
if(num3==1)
mfen=mmiao=mmiao=0; //清除上次残留数据
if(num3==2)
TR1=0; //暂停秒表
if(num3==3)
{
mfen=mmiao=mmmiao=0; //秒表清零
TR1=0;
}
if(num3==4) //重新开启秒表
TR1=1;
if(num3==5) //暂停秒表
TR1=0;
if(num3==6) //切换为显示时钟状态
{
flag=0;
num3=0;
}
break;
}
while(temp!=0xfd)
{
temp=P3;
}
beep=1;
}
}
}
int main()
{
timeinit();
beep=1;
while(1)
{
keyscan();
if(light==0)
{
if(miao%2==0) //当数码管显示时钟状态时,八个led将以亮一秒灭一秒的状态循环下去
P1=0;
else
P1=0xff;
}
else
{
if(num2==1)
P1=0xfe;
if(num2==2)
P1=0xfd;
if(num2==3)
P1=0xfb;
}
if(flag==0) //显示时钟
{
display(1,shi);
display(3,fen);
display1(5,miao);
}
else //显示秒表
{
display(1,mfen);
display(3,mmiao);
display1(5,mmmiao);
}
}
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询