学习日志 姓名 :刘易中 日期 :2018/7/20
今日学习任务 | 编写一个基于单片机的数字时钟,并用6位数码管显示,且可以调节时分秒 |
今日任务完成情况 | 完成编写 |
今日开发中出现的问题汇总 | 有一些变量数组定义有误 对于延时时长的把控
|
今日未解决问题 | 6位数码管一直有些闪烁,秒表跳得略慢 |
今日开发收获 | 怎样显示6位数码管 |
自我评价 | 自己独立编写程序还是有困难,上网参考了很多程序自己整合了一下基本完成了任务,但很多细节或者深入的问题还是不太清楚。 |
其他 | 无 |
sbit SEG1 = P0^0; //显示1
sbit SEG2 = P0^1; //显示2
sbit SEG3 = P0^2; //显示3
sbit SEG4 = P0^3; //显示4
sbit SEG5 = P0^4; //显示5
sbit SEG6 = P0^5; //显示6
sbit DUAN=P2^6;
sbit WEI=P2^7;
unsigned char code tab[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管
uchar Display_Digit[20];
unsigned int count;//秒计时
//-------时间--------------
uchar shi=0,fen=0,miao=0;// 时分秒
//-------时间--------------
uchar set;
uchar flag; //模式 0 1 2 3
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=65;y>0;y--);
}
void DIS_SEG(void)
{
Display_Digit[0]=shi%100/10; //时
Display_Digit[1]=shi%10; //时
Display_Digit[2]=fen%100/10; //分
Display_Digit[3]=fen%10; //分
Display_Digit[4]=miao%100/10; //秒
Display_Digit[5]=miao%10; //秒
DUAN=1;
P0=tab[Display_Digit[0]]; // 数码管显示负数 或正的百位
DUAN=0;
delay(1);
WEI=1;
P0=0xfe; //片选数码管
delay(3);
P0=0xff; //关闭数码管
WEI=0;
DUAN=1;
P0=tab[Display_Digit[1]]+0x80; //十位
DUAN=0;
delay(1);
WEI=1;
P0=0xfd;
delay(3);
P0=0xff;
WEI=0;
DUAN=1;
P0=tab[Display_Digit[2]]; //个位和小数点
DUAN=0;
delay(1);
WEI=1;
P0=0xfb;
delay(3);
P0=0xff;
WEI=0;
DUAN=1;
P0=tab[Display_Digit[3]]+0x80; //小数位
DUAN=0;
delay(1);
WEI=1;
P0=0xf7;
delay(3);
P0=0xff;
WEI=0;
DUAN=1;
P0=tab[Display_Digit[4]];
DUAN=0;
delay(1);
WEI=1;
P0=0xEF;
delay(3);
P0=0xff;
WEI=0;
DUAN=1;
P0=tab[Display_Digit[5]];
DUAN=0;
delay(1);
WEI=1;
P0=0xDF;
delay(3);
P0=0xff;
WEI=0;
}
void S2_ADD(void)
{
if(flag==1)
{
shi++;
if(shi>23)
{
shi=23;
} //最大值23
}
if(flag==2) //
{
fen++;
if(fen>59)
{
fen=59;
} //最大值59
}
if(flag==3)
{
miao++;
if(miao>59)
{
miao=59;
} //最大值59
}
}
void S3_SUB(void)
{ if(flag==1)
{
if(shi<1)
{
shi=1;
}
shi--; //最小减到0
}
if(flag==2)
{
if(fen<1)
{
fen=1;
}
fen--; //最小减到0
}
if(flag==3)
{
if(miao<1)
{
miao=1;
}
miao--; //最小减到0
}
}
void KEY_SCAN(void) //键盘扫描
{
if(S1==0)//切换 设置
{ delay(10);
if(S1==0)
{
while(!S1)
if(set==0)
{
set=1;TR1=0;EA=0;
}
else
{
set=0;
TR1=1;
EA=1;
}//设置时间,退出切换
}
}
if(S2==0) //加
{
delay(10); //延时去抖动
S2_ADD();
//加
while(!S2){;}
} //等待按键释放
if(S3==0) //减
{
delay(10); //延时去抖动
S3_SUB(); // 减
while(!S3){;} //等待按键释放
}
if(S4==0)//切换 设置
{
delay(10);
if(S4==0)
{ flag++;
TR1=0;
EA=0;
if(flag>3)
{
flag=1;
} //在 1 2 3中切换
while(!S4){;}
}
}
}
//--------------key---------------------------------------
int main()
{
P0=0;
TMOD=0x10; //定时器1方式2
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1; //开总中断
ET1=1; //开定时器1中断
TR1=1; //开启定时器,
while(1)
{
KEY_SCAN();//键盘扫描
DIS_SEG(); //数码管显示
}
return 0;
}
//定时器1
void timer1_() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count>20)
{
count=0;
miao++;
if(miao==60) //秒
{
miao=0;
fen++;
if(fen==60) //分
{
fen=0;
shi++;
if(shi==24) //时
{
shi=0;
}
}
}
}
}