标题:
单片机数码管分两组显示,第一屏日期,第二屏时间,并且可调。每隔5s变化一次
[打印本页]
作者:
172229507
时间:
2017-9-1 10:06
标题:
单片机数码管分两组显示,第一屏日期,第二屏时间,并且可调。每隔5s变化一次
想要的结果是:如果按starts1 键,显示停止刷新进入调节时间和日期模式。(如果显示的是日期就调节日期,如果显示的是时间就调节时间),调节完后再按starts1键计时开始。
现在的问题是:进入keysanc函数后还是每隔5s变换显示。
帮助:我是初学者程序有好多比较啰嗦,还请帮忙修改指正,并能达到效果,172229507 谢谢谢!
/*#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit starts1=P3^4;
sbit miaos2=P3^5;
sbit fens3=P3^6;
sbit shis4=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar t,num,num1,nian ,yue ,ri,flag ,s6,s7,s8;
char shi,fen,miao;
void delay(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display_seg(uchar num1,uchar num) //显示函数
{
dula=1;
P0=table[num];
dula=0;
P0=0xff; //消隐
wela=1;
P0=table1[num1];
wela=0;
delay(1);
}
void display1(uchar x,uchar y) //分离函数
{
uint shi,ge; //定义变量
shi=y/10;
ge=y%10;
if(x==1) //x=1 表示年,
{
display_seg(5,shi); //小时的十位
delay(2);
display_seg(4,ge); //小时的个位
delay(2);
}
if(x==2) //x=2 表示月
{
display_seg(3,shi); //分钟的十位
delay(2);
display_seg(2,ge); //分钟的个位
delay(2);
}
if(x==3) //x=3 表示日
{
display_seg(1,shi); //秒的十位
delay(2);
display_seg(0,ge); //秒的个位
delay(2);
}
}
void reflash1() //刷新函数
{
display1(1,nian);
display1(2,yue);
display1(3,ri);
}
void display2(uchar x,uchar y) //分离函数
{
uint shi,ge; //定义变量
shi=y/10;
ge=y%10;
if(x==1) //x=1 表示小时,
{
display_seg(5,shi); //小时的十位
delay(2);
display_seg(4,ge); //小时的个位
delay(2);
}
if(x==2) //x=2 表示分钟
{
display_seg(3,shi); //分钟的十位
delay(2);
display_seg(2,ge); //分钟的个位
delay(2);
}
if(x==3) //x=3 表示秒
{
display_seg(1,shi); //秒的十位
delay(2);
display_seg(0,ge); //秒的个位
delay(2);
}
}
void reflash2() //刷新函数
{
display2(1,nian);
display2(2,yue);
display2(3,ri);
}
void init() //初始化 中断
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void keyscan1() //按键加程序
{
if(starts1==0) //功能键,如果有按键按下记时停止,开始调节时间
{
delay(5);
if(starts1==0)
{
TR0=~TR0; //按键一次停止计数第二次案件开始计数
}while(!starts1);
}
if(miaos2==0) //秒调节
{
TR0=0; //关闭定时器
delay(5);
if(miaos2==0)
{
miao++;
if(miao==60)
miao=0;
} while(!miaos2); //去抖
}
if(fens3==0) //调节分钟
{
delay(5);
if(fens3==0)
{
fen++;
if(fen==60)
fen=0;
}while(!fens3);
}
if(shis4==0) //调节时
{
delay(5);
if(shis4==0)
{
shi++;
if(shi==24)
shi=0;
}while(!shis4);
}
}
void main()
{
uint x,y;
init();
while(1)
{
for(x=0;x<300;x++)
{
reflash1();
}
for(y=0;y<300;y++)
{
reflash2();
}
}
}
void time0() interrupt 1 //定时器/ 计数器0工作方式1
{
TH0=(65536-9216)/256; //初值的计算=65536-定时时间(s)/机器周期=65536-定时时间*晶振频率/12
TL0=(65536-9216)%256; //设定的是10ms
t++;
if(t==100) //循环100次 10ms*100=1000ms=1s
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
复制代码
作者:
zl2168
时间:
2017-9-1 19:13
秒时间也每隔5s变换显示?
作者:
cjjcjj1
时间:
2017-9-2 09:03
提示:
作者被禁止或删除 内容自动屏蔽
作者:
lids
时间:
2017-9-28 16:29
键盘扫描函数没调用,你按键肯定没用
作者:
dzbj
时间:
2017-9-28 23:29
cjjcjj1 发表于 2017-9-2 09:03
你好!对你的要求没有完全看明白
他就是想每屏显示的内容不一样 每隔5s切换一个屏 任意屏内 按下按键调节当前屏的内容
它遇到的问题是 切换可以了 但按下后还是过5s就切换 停不下来 不能调节当前屏的东西
作者:
lids
时间:
2017-9-29 09:24
给你改了一下,实现了你想要的功能,年月日显示的一个固定的数字,要使年月日跑起来,你自己在中断里面写
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit starts1=P3^0;
sbit miaos2=P3^1;
sbit fens3=P3^2;
sbit shis4=P3^3;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar t,num,num1,nian=17 ,yue=9 ,ri=29,s6,s7,s8;
char shi=8,fen=15,miao;
uint cnt;//显示切换计时
bit flag;
void delay(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display_seg(uchar num1,uchar num) //显示函数
{
dula=1;
P0=table[num];
dula=0;
P0=0xff; //消隐
wela=1;
P0=table1[num1];
wela=0;
delay(1);
}
void display1(uchar x,uchar y) //分离函数
{
uint shi,ge; //定义变量
shi=y/10;
ge=y%10;
if(x==1) //x=1 表示年,
{
display_seg(5,shi); //小时的十位
delay(2);
display_seg(4,ge); //小时的个位
delay(2);
}
if(x==2) //x=2 表示月
{
display_seg(3,shi); //分钟的十位
delay(2);
display_seg(2,ge); //分钟的个位
delay(2);
}
if(x==3) //x=3 表示日
{
display_seg(1,shi); //秒的十位
delay(2);
display_seg(0,ge); //秒的个位
delay(2);
}
}
void reflash1() //刷新函数
{
display1(1,shi);
display1(2,fen);
display1(3,miao);
}
void display2(uchar x,uchar y) //分离函数
{
uint shi,ge; //定义变量
shi=y/10;
ge=y%10;
if(x==1) //x=1 表示小时,
{
display_seg(5,shi); //小时的十位
delay(2);
display_seg(4,ge); //小时的个位
delay(2);
}
if(x==2) //x=2 表示分钟
{
display_seg(3,shi); //分钟的十位
delay(2);
display_seg(2,ge); //分钟的个位
delay(2);
}
if(x==3) //x=3 表示秒
{
display_seg(1,shi); //秒的十位
delay(2);
display_seg(0,ge); //秒的个位
delay(2);
}
}
void reflash2() //刷新函数
{
display2(1,nian);
display2(2,yue);
display2(3,ri);
}
void init() //初始化 中断
{
TMOD=0X01;
TH0=(65536-9216)/256;
TL0=(65536-9216)%256;
EA=1;
ET0=1;
TR0=1;
}
void keyscan1() //按键加程序
{
if(starts1==0) //功能键,如果有按键按下记时停止,开始调节时间
{
delay(10);
if(starts1==0)
{
TR0 =! TR0; //按键一次停止计数第二次案件开始计数
}while(!starts1);
}
if(miaos2==0) //秒调节
{
delay(10);
if(miaos2==0)
{
miao++;
if(miao>=60)
miao=0;
} while(!miaos2);
}
if(fens3==0) //调节分钟
{
delay(10);
if(fens3==0)
{
fen++;
if(fen==60)
fen=0;
}while(!fens3);
}
if(shis4==0) //调节时
{
delay(10);
if(shis4==0)
{
shi++;
if(shi==24)
shi=0;
}while(!shis4);
}
}
void main()
{
init();
while(1)
{
keyscan1();
if(flag==0)
{
reflash1();
}
else
{
reflash2();
}
}
}
void time0() interrupt 1 //定时器/ 计数器0工作方式1
{
TH0=(65536-9216)/256; //初值的计算=65536-定时时间(s)/机器周期=65536-定时时间*晶振频率/12
TL0=(65536-9216)%256; //设定的是10ms
cnt++;
t++;
if(t==100) //循环100次 10ms*100=1000ms=1s
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
if(cnt==500) //5s切换显示
{
cnt=0;
flag =! flag;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1