该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include "main.h"
#include "ds1302.h"
code uint8 Ledcode[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};
uint8 Time[7]={55,59,11,22,2,2,11};//秒分时日月周年10-08-15 11:59:55
uint8 Led_buf[6];
uint8 Num, Led_n=0, T_n=0;
void delay(uint16 n)
{
while (n--);
}
/*
* 初始化系统定时器
*/
void systimer_init(void)
{
TMOD = 0x01;
TH0 = 0xF8;
TL0 = 0xCC;
TR0 = 0;
ET0 = 1;
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0xDC; // 定时10ms
TL1 = 0x00;
TR1 = 0;
ET1 = 0;
EA = 1;
}
/*
* 判断键值
*/
uint8 scan_key(void)
{
uint8 val=0;
KeyOut1 = 0;
KeyOut2 = 1;
KeyOut3 = 1;
KeyOut4 = 1;
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = K_ADD;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
KeyOut1 = 1;
KeyOut2 = 0;
KeyOut3 = 1;
KeyOut4 = 1;
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = K_LEFT;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
KeyOut1 = 1;
KeyOut2 = 1;
KeyOut3 = 0;
KeyOut4 = 1;
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = K_SUB;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
KeyOut1 = 1;
KeyOut2 = 1;
KeyOut3 = 1;
KeyOut4 = 0;
if (KeyIn2 == 0)
{
delay(KEY_DELAY);
if (KeyIn2 == 0)
val = K_SET;
}
if (KeyIn3 == 0)
{
delay(KEY_DELAY);
if (KeyIn3 == 0)
val = K_ENTER;
}
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = K_RIGHT;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
return val;
}
/*
* 制作数码管数据
*/
void make_led_number(void)
{
ET0 = 0;
Led_buf[0] = 0x7F & Ledcode[Time[0]%10];
Led_buf[1] = Ledcode[Time[0]/10];
Led_buf[2] = 0x7F & Ledcode[Time[1]%10];
Led_buf[3] = Ledcode[Time[1]/10];
Led_buf[4] = 0x7F & Ledcode[Time[2]%10];
Led_buf[5] = Ledcode[Time[2]/10];
ET0 = 1;
}
/*
* 启动clock数字闪烁
*/
void start_flash(void)
{
T_n = 0;
Led_buf[2*Num] = 0x7F & Ledcode[Time[Num]%10];
Led_buf[2*Num+1] = Ledcode[Time[Num]/10];
TH1 = 0xDC; // 定时10ms
TL1 = 0x00;
TR1 = 1;
ET1 = 1;
}
/*
* 停止clock数字闪烁
*/
void stop_flash(void)
{
ET1 = 0;
TR1 = 0;
Led_buf[2*Num] = 0x7F & Ledcode[Time[Num]%10];
Led_buf[2*Num+1] = Ledcode[Time[Num]/10];
}
/*
* 时钟设置
*/
void set_clock(void)
{
uint8 k_val, flag=0;
Num = 0;
while (1)
{
k_val = scan_key();
if (k_val == 0)
{
if (flag == 0)
{
start_flash();
flag = 1;
}
continue;
}
flag = 0;
stop_flash();
if (k_val == K_ENTER)
{
set_time(Time);
break;
}
switch (k_val)
{
case K_ADD:
if (Num == 2)
{
if (Time[Num] >= 23)
Time[Num] = 0;
else
Time[Num]++;
}
else
{
if (Time[Num] >= 59)
Time[Num] = 0;
else
Time[Num]++;
}
break;
case K_SUB:
if (Num == 2)
{
if (Time[Num] == 0)
Time[Num] = 23;
else
Time[Num]--;
}
else
{
if (Time[Num] == 0)
Time[Num] = 59;
else
Time[Num]--;
}
break;
case K_LEFT:
if (Num >= 2)
Num = 0;
else
Num++;
break;
case K_RIGHT:
if (Num == 0)
Num = 2;
else
Num--;
break;
default: break;
}
make_led_number();
}
}
/*
* 数码管显示
*/
void show_num(uint8 *buf)
{
ENLED = 1;
switch (Led_n)
{
case 0:
ADDR0 = 0;
ADDR1 = 0;
ADDR2 = 0;
P0 = buf[0];
break;
case 1:
ADDR0 = 1;
ADDR1 = 0;
ADDR2 = 0;
P0 = buf[1];
break;
case 2:
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 0;
P0 = buf[2];
break;
case 3:
ADDR0 = 1;
ADDR1 = 1;
ADDR2 = 0;
P0 = buf[3];
break;
case 4:
ADDR0 = 0;
ADDR1 = 0;
ADDR2 = 1;
P0 = buf[4];
break;
case 5:
ADDR0 = 1;
ADDR1 = 0;
ADDR2 = 1;
P0 = buf[5];
break;
}
ENLED = 0;
if (Led_n >= 5)
Led_n = 0;
else
Led_n++;
}
main()
{
uint8 k_val;
ADDR3 = 1;
ENLED = 0;
systimer_init();
set_time(Time); //初始时间设定
TR0 = 1;
while (1)
{
read_time(Time);
make_led_number();
k_val = scan_key();
if (k_val == K_SET)
set_clock();
}
}
void time0_isr() interrupt 1
{
ET0 = 0;
TH0 = 0xF8;
TL0 = 0xCC;
show_num(Led_buf);
ET0 = 1;
}
void time1_isr() interrupt 3
{
ET1 = 0;
TH1 = 0xDC; // 定时10ms
TL1 = 0x00;
T_n++;
if (T_n == 50) // 0.5s
{
Led_buf[2*Num] = 0x7F & Ledcode[10];
Led_buf[2*Num+1] = Ledcode[10];
}
else if (T_n >= 100) // 1s
{
T_n = 0;
Led_buf[2*Num] = 0x7F & Ledcode[Time[Num]%10];
Led_buf[2*Num+1] = Ledcode[Time[Num]/10];
}
ET1 = 1;
}