万年历单片机c语言,c51单片机万年历的c程序
时间: 2023-10-09 10:11:16 浏览: 163
以下是一个基于C51单片机的万年历程序示例:
```c
#include <reg52.h>
// 定义闰年月份天数
unsigned char code day_table[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char code day_leap_table[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
// 定义LCD1602连接引脚
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit LCD1602_DATAPINS_4=P0^4;
sbit LCD1602_DATAPINS_5=P0^5;
sbit LCD1602_DATAPINS_6=P0^6;
sbit LCD1602_DATAPINS_7=P0^7;
// 函数声明
void init_lcd(void); // 初始化LCD1602
void display_char(unsigned char x,unsigned char y,unsigned char dat); // 在LCD1602指定位置显示一个字符
void display_string(unsigned char x,unsigned char y,unsigned char *s); // 在LCD1602指定位置显示一个字符串
void display_date(unsigned char year,unsigned char month,unsigned char day); // 在LCD1602指定位置显示日期
// 主函数
void main()
{
unsigned char year = 21; // 年份为2021年
unsigned char month = 1; // 月份为1月
unsigned char day = 1; // 日为1日
init_lcd(); // 初始化LCD1602
while(1)
{
display_date(year, month, day); // 在LCD1602上显示日期
// 下面的代码用于更新日期
day++;
if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) // 判断闰年
{
if(day > day_leap_table[month - 1])
{
day = 1;
month++;
}
}
else
{
if(day > day_table[month - 1])
{
day = 1;
month++;
}
}
if(month > 12)
{
month = 1;
year++;
}
}
}
// 初始化LCD1602
void init_lcd(void)
{
display_char(0, 0, 0x38); // 显示模式设置
display_char(0, 0, 0x0c); // 显示开关控制
display_char(0, 0, 0x06); // 显示光标移动设置
display_char(0, 0, 0x01); // 显示清屏
}
// 在LCD1602指定位置显示一个字符
void display_char(unsigned char x,unsigned char y,unsigned char dat)
{
unsigned char addr;
if(y == 0)
{
addr = 0x80 + x;
}
else
{
addr = 0xc0 + x;
}
delay(1);
RS = 0;
RW = 0;
LCD1602_DATAPINS_7 = dat >> 7;
LCD1602_DATAPINS_6 = (dat >> 6) & 0x01;
LCD1602_DATAPINS_5 = (dat >> 5) & 0x01;
LCD1602_DATAPINS_4 = (dat >> 4) & 0x01;
EN = 1;
delay(1);
EN = 0;
delay(1);
RS = 0;
RW = 0;
LCD1602_DATAPINS_7 = (dat >> 3) & 0x01;
LCD1602_DATAPINS_6 = (dat >> 2) & 0x01;
LCD1602_DATAPINS_5 = (dat >> 1) & 0x01;
LCD1602_DATAPINS_4 = dat & 0x01;
EN = 1;
delay(1);
EN = 0;
}
// 在LCD1602指定位置显示一个字符串
void display_string(unsigned char x,unsigned char y,unsigned char *s)
{
while(*s != 0)
{
display_char(x, y, *s++);
x++;
}
}
// 在LCD1602指定位置显示日期
void display_date(unsigned char year,unsigned char month,unsigned char day)
{
unsigned char date_str[11];
unsigned char i;
// 计算日期字符串
date_str[0] = '2';
date_str[1] = '0';
date_str[2] = year / 10 + '0';
date_str[3] = year % 10 + '0';
date_str[4] = '-';
date_str[5] = month / 10 + '0';
date_str[6] = month % 10 + '0';
date_str[7] = '-';
date_str[8] = day / 10 + '0';
date_str[9] = day % 10 + '0';
date_str[10] = 0;
display_string(0, 0, date_str); // 在LCD1602上显示日期
}
// 延时函数
void delay(unsigned int i)
{
unsigned int j,k;
for(j=0;j<i;j++)
{
for(k=0;k<125;k++);
}
}
```
该程序使用LCD1602显示日期信息,通过更新日期实现万年历的功能。需要注意的是,该程序仅适用于2021年的日历,如果需要适用于其他年份,需要对程序进行相应的修改。
阅读全文