[51]数码管作时钟
2016-04-06 18:02
344 查看
#include<reg52.h>
unsigned int led[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //p0端0到f,0x7f为点
unsigned int ledx[]= {0x00,0x0e,0x0d,0x0b,0x07,0xff} ; //p2端都亮,到都灭
void delay(unsigned int xms) //延时函数 //延时程序
{
unsigned int x,y;
for(x=xms; x>0; x--)
for(y=110; y>0; y--);
}
sbit add = P3^4; //加按键
sbit minus = P3^5; //减按键
int a=0,b=0,c=0,d=0; //对应位数
int num=0; //计时变量
unsigned int wait=4; //定义等待时间
unsigned int youdian=0; //小数点显示判断
void main(void)
{
TMOD=0x01; //工作方式
TH0=(65536-45872)/256; // 赋值
TL0=(65536-45872)%256; //赋值
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //自动定时器0
while(1)
{
P2=ledx[1];
P0=led[a];
delay(wait);
P2=ledx[2];
P0=led[b];
delay(wait);
P2=ledx[3];
P0=led[c];
delay(wait);
P2=ledx[4];
P0=led[d];
delay(wait);
if(youdian==1)
{
P0=0x7f;
P2=0x0d;
delay(wait);
}
if(d==-1)
{
c--;
d=9;
}
if(c==-1)
{
b--;
c=6;
}
if(b==-1)
{
a--;
b=9;
}
if(a==-1)
{
a=5;
b=9;
c=5;
d=9;
}
if(d==10)
{
c++;
d=0;
}
if(c==6)
{
b++;
c=0;
}
if(b==10)
{
a++;
b=0;
}
if(a==6)
{
a=0;
}
}
}
void T0_timer() interrupt 1
{
TH0=(65536-45872)/256; // 赋值
TL0=(65536-45872)%256; //赋值
num++;
if(minus==0)
{
d--;
num=0;
while(!minus)
{
num=0;
P2=ledx[1];
P0=led[a];
delay(wait);
P2=ledx[2];
P0=led[b];
delay(wait);
P2=ledx[3];
P0=led[c];
delay(wait);
P2=ledx[4];
P0=led[d];
delay(wait);
}
}
else if(add==0)
{
d++;
num=0;
while(!add)
{
num=0;
P2=ledx[1];
P0=led[a];
delay(wait);
P2=ledx[2];
P0=led[b];
delay(wait);
P2=ledx[3];
P0=led[c];
delay(wait);
P2=ledx[4];
P0=led[d];
delay(wait);
}
}
else if(num==20)
{
d++;
num=0;
if(youdian==0)youdian=1;
else if(youdian==1)youdian=0;
}
}
unsigned int led[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //p0端0到f,0x7f为点
unsigned int ledx[]= {0x00,0x0e,0x0d,0x0b,0x07,0xff} ; //p2端都亮,到都灭
void delay(unsigned int xms) //延时函数 //延时程序
{
unsigned int x,y;
for(x=xms; x>0; x--)
for(y=110; y>0; y--);
}
sbit add = P3^4; //加按键
sbit minus = P3^5; //减按键
int a=0,b=0,c=0,d=0; //对应位数
int num=0; //计时变量
unsigned int wait=4; //定义等待时间
unsigned int youdian=0; //小数点显示判断
void main(void)
{
TMOD=0x01; //工作方式
TH0=(65536-45872)/256; // 赋值
TL0=(65536-45872)%256; //赋值
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //自动定时器0
while(1)
{
P2=ledx[1];
P0=led[a];
delay(wait);
P2=ledx[2];
P0=led[b];
delay(wait);
P2=ledx[3];
P0=led[c];
delay(wait);
P2=ledx[4];
P0=led[d];
delay(wait);
if(youdian==1)
{
P0=0x7f;
P2=0x0d;
delay(wait);
}
if(d==-1)
{
c--;
d=9;
}
if(c==-1)
{
b--;
c=6;
}
if(b==-1)
{
a--;
b=9;
}
if(a==-1)
{
a=5;
b=9;
c=5;
d=9;
}
if(d==10)
{
c++;
d=0;
}
if(c==6)
{
b++;
c=0;
}
if(b==10)
{
a++;
b=0;
}
if(a==6)
{
a=0;
}
}
}
void T0_timer() interrupt 1
{
TH0=(65536-45872)/256; // 赋值
TL0=(65536-45872)%256; //赋值
num++;
if(minus==0)
{
d--;
num=0;
while(!minus)
{
num=0;
P2=ledx[1];
P0=led[a];
delay(wait);
P2=ledx[2];
P0=led[b];
delay(wait);
P2=ledx[3];
P0=led[c];
delay(wait);
P2=ledx[4];
P0=led[d];
delay(wait);
}
}
else if(add==0)
{
d++;
num=0;
while(!add)
{
num=0;
P2=ledx[1];
P0=led[a];
delay(wait);
P2=ledx[2];
P0=led[b];
delay(wait);
P2=ledx[3];
P0=led[c];
delay(wait);
P2=ledx[4];
P0=led[d];
delay(wait);
}
}
else if(num==20)
{
d++;
num=0;
if(youdian==0)youdian=1;
else if(youdian==1)youdian=0;
}
}
相关文章推荐
- 51单片机模拟简单交通灯
- 51单片机延时程序探讨
- 利用US-100超声波传感器测距的核心代码
- 51单片机串口通信及波特率寄存器设置
- [51]简单按键计数程序
- STC15W4K32S系列 低速模式
- 51单片机英文全称
- STC15W4K32S4 系列 T0定时器输出时钟
- 定时器0控制LED闪灭
- 51单片机配合超声波测距以及用1602液晶进行显示
- 51单片机在Keil中使用printf进行串口输出
- C语言编程技巧----如何定义全局变量----->提高代码可移植性
- 电子研发联盟-红外调光灯设计
- 51单片机的边沿触发及电平触发简介及测量
- 基于51单片机modbusRTU从机设计
- STC单片机timer2捕获模式测频率
- keil C51使用串口时程序跑死的问题
- 51单片机单串口同时实现AT指令和调试信息输出
- 超声波模块HC-SR04调试经验分享
- 定时/计数器的初始化与计数初值的计算