level 1
/*************************************************************
【程序说明】
【1】开发环境:KEIL
【2】主控芯片:STC89C52RC
【3】实现功能:设计一个由6位数码管组成的静态显示电路,
显示当前时间,时分秒每个用2位显示;
可用按键校准时间,控制校准时间时的启动。
【4】I/O分配:P0口连接数码管,按键为 P3^4 P3^5 P3^6 P3^7
【5】按键功能:key1(P3^4):启动时钟,无论是开始还是校正时间后,
只有按下key1,时钟才能运行
key2(P3^5):加1按键
key3(P3^6):减1按键
key4(P3^7):校正按键,按一下可以校正秒,按两下
可以校正分,按三下可以校正时
(按键次数可以叠加,例如:按一下校正
秒后,只需再按一下便可校正分)
【6】初始化时间:00:00:00
*************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6; // 段选
sbit wela = P2^7; // 位选
sbit key1 = P3^4; //定义按键位置 独立按键模式
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
sbit a = P1^0;sbit b = P1^1;sbit c = P1^2;
uchar num,num1,num2,num3,shi_ge,shi_shi,fen_ge,fen_shi,miao_shi,miao_ge;
uchar choice=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f, // 0 1 2 3 // 数码管数组
0x66,0x6d,0x7d,0x07, // 4 5 6 7
0x7f,0x6f,0x77,0x7c, // 8 9 A B
0x39,0x5e,0x79,0x71}; // C D E F
void delayms(uint xms) // 毫秒级延时
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(num) // 显示函数
{
miao_shi=num1/10; //秒显示
miao_ge=num1%10;
fen_shi=num2/10; //分显示
fen_ge=num2%10;
shi_shi=num3/10; //时显示 24小时制
shi_ge=num3%10;
dula=1; // 秒
P0=table[miao_shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(2);
dula=1;
P0=table[miao_ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(2);
dula=1; // 分钟
P0=table[fen_shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(2);
dula=1;
P0=table[fen_ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(2);
dula=1; // 小时
P0=table[shi_shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(2);
dula=1;
P0=table[shi_ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(2);
}
void adjustment()
{
if (key1==0) // 开启定时器 开启(时钟)
{
delayms(15);
if(key1==0)
{
TR0=1;
while(!key1);
}
}
if (key4==0) // 选择按键
{
delayms(30);
if(key4==0)
{
choice++;
if(choice>3)
choice=0;
while(!key4);
}
}
2014年06月21日 06点06分
