标题:
51单片机+LCD1602日历仿真小程序
[打印本页]
作者:
DANGYU
时间:
2018-8-7 13:28
标题:
51单片机+LCD1602日历仿真小程序
SM8952A c51仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(16.41 KB, 下载次数: 53)
下载附件
2018-8-8 02:26 上传
单片机源程序如下:
/*calendar.c文件的功能是通过定时器实现日历功能,具体描述如下:
1:实现通过按键调整时间;
2:可以实现24小时制和12小时制切换
程序创建人 党羽
创建时间 2017-3-17
*/
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit K1 = P1^0; //设置年月日星期
sbit K2 = P1^1; //设置时分秒
sbit K3 = P1^2; //增加
sbit K4 = P1^3; //减少
sbit K5 = P1^4; //12小时制和24小时制
sbit K6 = P1^5; //确定
sbit SPK = P3^0; //蜂鸣器
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
bit LCD_Busy_Check(); //LCD忙检测
void LCD_Initialize(); //初始化
void LCD_Set_POS(uchar); //设置位置
void LCD_Write_Command(uchar); //写命令
void LCD_Write_Data(uchar); //写数据函数
uchar *WEEK[] = {"SUN", "***", "MON", "TUS", "WEN", "THU", "FRI", "SAT"};
uchar YMD_String[] = {" 00-00-00 "}; //待显示的年月日字符串
uchar HMSam_String[] = "am 00:00:00"; //待显示的12小时制am时间字符串
uchar HMSpm_String[] = "pm 00:00:00"; //待显示的12小时制pm时间字符串
uchar HMS24_String[] = " 00:00:00 "; //待显示的24小时制时间字符串
/*0表示不修改1表示修改*/
bit Settime = 0; //是否修改时间
/*待显示的年月日时分秒的默认值*/
uchar MilliSecond =0;
uchar idata FlashLcd = 0;
uchar Hour = 0;
uchar Minute = 0;
uchar Second = 0;
uchar Year = 17;
uchar Month = 1;
uchar Day = 1;
uint i =0;
/*按键计数
K1按下1次即Change_Y_OR_MO_OR_D_OR_W =1 表示修改年
K1按下2次即Change_Y_OR_MO_OR_D_OR_W =2 表示修改月
K1按下3次即Change_Y_OR_MO_OR_D_OR_W =3 表示修改日
K1按下4次即Change_Y_OR_MO_OR_D_OR_W =4 表示修改星期
K2按下1次即Change_H_OR_M =1 表示修改时
K2按下2次即Change_H_OR_M =2 表示修改分
*/
uint Change_Y_OR_MO_OR_D_OR_W =0,Change_H_OR_M = 0;
//延时函数
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i = 0; i < 120; i++);
}
}
//LCD忙检测函数
bit LCD_Busy_Check()
{
bit LCD_Status;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
DelayMS(1);
LCD_Status = P0 ;
LCD_EN = 0;
DelayMS(1);
return LCD_Status;
}
//LCD忙等待函数
void LCD_Busy_Wait()
{
while((LCD_Busy_Check() & 0x80) == 0x80);
DelayMS(5);
}
//LCD写命令函数
void LCD_Write_Command(uchar cmd)
{
LCD_Busy_Wait();
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
LCD_EN = 1;
DelayMS(1);
LCD_EN = 0;
}
//LCD写数据函数
void LCD_Write_Data(uchar str)
{
LCD_Busy_Wait();
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = str;
LCD_EN = 1;
DelayMS(1);
LCD_EN = 0;
}
//LCD初始化配置函数
void LCD_Initialize()
{
LCD_Write_Command(0x38);
DelayMS(1);
LCD_Write_Command(0x0c);
DelayMS(1);
LCD_Write_Command(0x06);
DelayMS(1);
LCD_Write_Command(0x01);
DelayMS(1);
}
//LCD坐标设置函数
void LCD_Set_POS(uchar Position)
{
LCD_Write_Command(Position | 0x80);
}
//LCD显示数据函数
void Display_String(uchar * str, uchar LineNo)
{
uchar k;
LCD_Set_POS(LineNo);
for(k = 0; k < 16; k++)
{
LCD_Write_Data(str[k]);
DelayMS(1);
}
}
//蜂鸣器控制函数
void Beep()
{
uchar i,j = 70;
for(i = 0; i < 200; i++)
{
while(--j);
SPK = ~SPK;
}
DelayMS(300);
SPK = 0;
}
void Format_DateTime(uchar d,uchar *a)
{
a[0] = d/10 +'0';
a[1] = d%10 + '0';
}
//显示时分秒函数
void Display_HMS(uchar h, m, s)
{
if( K5 == 1 )
{
if(Settime) HMS24_String[3] = '>';
else HMS24_String[3] = ' ';
HMS24_String[4] = h/10 + '0';
HMS24_String[5] = h%10 + '0';
HMS24_String[7] = m/10 + '0';
HMS24_String[8] = m%10 + '0';
HMS24_String[10] = s/10 + '0';
HMS24_String[11] = s%10 + '0';
Display_String(HMS24_String,0x40);
}
else
{
if( h < 12 )
{
if(Settime) HMSam_String[3] = '>';
else HMSam_String[3] = ' ';
HMSam_String[4] = h/10 + '0';
HMSam_String[5] = h%10 + '0';
HMSam_String[7] = m/10 + '0';
HMSam_String[8] = m%10 + '0';
HMSam_String[10] = s/10 + '0';
HMSam_String[11] = s%10 + '0';
Display_String(HMSam_String,0x40);
}
else
{
h = h - 12 ;
if(Settime) HMSpm_String[3] = '>';
else HMSpm_String[3] = ' ';
HMSpm_String[4] = h/10 + '0';
HMSpm_String[5] = h%10 + '0';
HMSpm_String[7] = m/10 + '0';
HMSpm_String[8] = m%10 + '0';
HMSpm_String[10] = s/10 + '0';
HMSpm_String[11] = s%10 + '0';
Display_String(HMSpm_String,0x40);
}
}
}
//显示年月日星期函数
void Display_YMDW(uchar y,m,d,i)
{
if(Settime) YMD_String[0] = '>';
else YMD_String[0] = ' ';
Format_DateTime(y,YMD_String+2);
Format_DateTime(m,YMD_String+5);
Format_DateTime(d,YMD_String+8);
strcpy(YMD_String + 11,WEEK[i]);
Display_String(YMD_String,0x00);
}
//调整时间函数
void Change_Time()
{
Settime = 0;
if( K1 == 0 || K2 == 0 )
{
TR0 = 0;
Settime = 1;
}
while(Settime)
{
while(K1 == 0)
{
Beep();
while(K1 == 0);
Change_Y_OR_MO_OR_D_OR_W++;
K1 = 1;
}
while(K2 == 0)
{
Beep();
while(K2 == 0);
Change_H_OR_M++;
K2 = 1;
}
if(K3 == 0 )
{
Beep();
while( K3 == 0);
switch(Change_Y_OR_MO_OR_D_OR_W)
{
case 1:
++Year;
break;
case 2:
{if (++Month >= 13) Month = 1;}
break;
case 3:
{if (++Day >= 31) Day = 1;}
break;
case 4:
{if (++i >= 8) i = 0;}
break;
}
switch(Change_H_OR_M)
{
case 1:
{if (++Hour >= 24) Hour = 0;}
break;
case 2:
{if (++Minute >= 59) Minute = 0;}
break;
}
}
else if(K4 == 0)
{
Beep();
while(K4 == 0);
switch(Change_Y_OR_MO_OR_D_OR_W)
{
case 1:
--Year;
break;
case 2:
{if (--Month == 0x00) Month = 12;}
break;
case 3:
{if (--Day == 0x00) Day = 31;}
break;
case 4:
{if (--i == 0xff) i = 0;}
break;
}
switch(Change_H_OR_M)
{
case 1:
{if (--Hour == 0xff) Hour = 23;}
break;
case 2:
{if (--Minute == 0xff) Minute = 59;}
break;
}
}
else if(K6 == 0)
{
Beep();
while( K6 == 0);
Settime = 0;
TR0 = 1;
}
Display_HMS(Hour,Minute,Second);
Display_YMDW(Year,Month,Day,i);
}
}
//定时器0中断
void Time0() interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
if( ++MilliSecond == 20)
{
MilliSecond = 0;
if( ++Second == 60)
{
Second = 0;
if( ++Minute == 60)
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(8.44 KB, 下载次数: 63)
下载附件
2018-8-8 02:27 上传
所有资料51hei提供下载:
case 1.rar
(55.49 KB, 下载次数: 50)
2018-8-7 13:27 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Honeylulu
时间:
2018-11-8 09:04
真没劲,分享出来整一堆只读,无法修改编译有意思吗??不过还是感谢你分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1