电子万年历代码c语言keil
时间: 2023-08-02 13:08:45 浏览: 161
以下是一个简单的电子万年历代码的C语言实现,使用Keil开发环境:
```c
#include <reg51.h> // 引入 8051 单片机头文件
sbit LSA = P2^2; // 定义 LED 数码管的引脚
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit k1 = P3^1; // 定义按键引脚
sbit k2 = P3^0;
unsigned char code table[] = // 数码管显示数字表格
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char year, month, day, week; // 定义年月日星期变量
void delay(unsigned int i) // 延时函数
{
while (i--);
}
void display(unsigned char dat, unsigned char num) // 数码管显示函数
{
unsigned char i;
LSA = 0;
LSB = 0;
LSC = 0;
P0 = table[dat/10]; // 显示十位数字
delay(100);
if (num == 1) // 显示年份时不显示小数点
{
LSA = 1;
delay(100);
}
else // 显示月份和日期时显示小数点
{
LSA = 0;
delay(100);
LSA = 1;
delay(100);
}
P0 = table[dat%10]; // 显示个位数字
delay(100);
LSA = 0;
LSB = 0;
LSC = 1;
P0 = 0x40; // 显示下划线
delay(100);
}
void main()
{
unsigned char i, j;
TMOD = 0x01; // 定时器 T0 工作模式 1
TH0 = 0xfc; // 定时器 T0 计数初值
TL0 = 0x67;
TR0 = 1; // 启动定时器
ET0 = 1; // 允许 T0 中断
EA = 1; // 全局中断允许
while (1)
{
if (k1 == 0) // 按键 k1 按下
{
delay(1000); // 延时去抖
if (k1 == 0) // 再次检测按键状态
{
month++; // 月份加 1
if (month > 12) // 如果月份大于 12
{
month = 1; // 月份变为 1
year++; // 年份加 1
}
display(month, 0); // 显示月份
}
while (!k1); // 等待按键释放
}
if (k2 == 0) // 按键 k2 按下
{
delay(1000); // 延时去抖
if (k2 == 0) // 再次检测按键状态
{
day++; // 日期加 1
if ((month == 2 && ((year%4 == 0 && year%100 != 0) || year%400 == 0)) && day > 29) // 闰年的 2 月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
else if ((month == 2 && ((year%4 != 0) || (year%100 == 0 && year%400 != 0))) && day > 28) // 平年的 2 月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
else if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) // 小月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
else if (day > 31) // 大月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
display(day, 0); // 显示日期
}
while (!k2); // 等待按键释放
}
}
}
void time() interrupt 1 // 定时器 T0 中断处理函数
{
static unsigned char i;
TH0 = 0xfc; // 定时器 T0 计数初值
TL0 = 0x67;
i++;
if (i == 20) // 每 20 次中断计数为 1 秒
{
i = 0;
day++; // 日期加 1
week++; // 星期加 1
if ((month == 2 && ((year%4 == 0 && year%100 != 0) || year%400 == 0)) && day > 29) // 闰年的 2 月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
else if ((month == 2 && ((year%4 != 0) || (year%100 == 0 && year%400 != 0))) && day > 28) // 平年的 2 月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
else if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) // 小月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
else if (day > 31) // 大月份
{
day = 1; // 日期变为 1
month++; // 月份加 1
}
if (week > 7) // 如果星期大于 7
{
week = 1; // 星期变为 1
}
display(year, 1); // 显示年份
display(month, 0); // 显示月份
display(day, 0); // 显示日期
}
}
```
这个程序实现了电子万年历的基本功能,包括显示年份、月份、日期和星期,支持通过按键调整月份和日期,还有定时器中断功能。需要注意的是,这个程序只是一个简单的示例,实际应用中可能需要根据具体需求进行修改和优化。
阅读全文