公告:

万年历(AT89C52+DS1302+LCD1602+4X4矩阵键盘)

作者:智凡单片机 / 时间:6个月前 (06/16) / 分类:51单片机 / 阅读:42786 / 评论:0

万年历,用AT89C52为主控芯片,ds1302做时钟芯片,Lcd1602做显示器,4x4矩阵键盘进行时间修改,当按下Enter键时进入时间修改功能,可通过输入0~9对时间进行修改,也可通过左右和加减按键进行时间修改。

感谢金沙滩宋老师,我大四马上毕业了,万年历的程序也写过不止一次了,但我自己写的程序都很乱,每个程序都是一坨一坨的,看了宋老师的视频和程序,我学习到了很多,现在我把我模仿宋老师的代码写出来,也希望对别人能有帮助。
Proteus仿真图:
万年历(AT89C52+DS1302+LCD1602+4X4矩阵键盘) 万年历(AT89C52+DS1302+LCD1602+4X4矩阵键盘) 51单片机
Main.c代码:
#include "LCD1602.H"
#include "KEY.H"
#include "DS1302.H"
#include "Calender.H"

void main( void )
{
LCD1602_Init();
Key_Init(); 
System_TimeInit();
while(1)
{
Key_Handle();
Calender_Handle();
}
}

Calender.H代码:




#ifndef _CALENDER_H_
#define _cALENDER_H_

#include "TYPEDEF.H"




//系统运行状态枚举类型定义
enum Status
{
E_NORMAL, E_ADJUST_TIME 
};

//系统运行状态
extern enum Status System_Status;
//修改时间光标索引
extern volatile int8 Adjust_Index;

//系统时间初始化,main中调用一次
void System_TimeInit( void );

//日历功能的循环调用函数,在while(1)中调用
void Calender_Handle( void );

//进入时间校正功能,在按键函数Key_Action()中调用
void AdjustTime_Enter( void );

//退出时间校正功能,在按键函数Key_Action()中调用
void AdjustTime_Quit( bool ifSave );

//光标右移函数 ,在按键函数Key_Action()中调用
void Cursor_RightMove( void );

//光标左移函数,在按键函数Key_Action()中调用
void Cursor_LeftMove( void );

//调整时间加函数,在按键函数Key_Action()中调用
void AdjustTime_AddFunct( void );

//调整时间减函数,在按键函数Key_Action()中调用
void AdjustTime_SubFunct( void );

//修改时间输入数值函数
void AdjustTime_NumEnter( uint8 num );

#endif
Calender.c代码:
这部分代码比较长,因为实现通过数字键0~9和通过左右加减键实现时间修改要对光标所处的位置进行判断。
程序优点:这个优点是宋老师的,我只是写出来
1.我觉得最大的优点是变量Adjust_Index(光标索引的定义),然后通过数组进行显示位置的确定,我以前写的时候都是对变量进行判断,从来没想过用数组把显示的位置直接表示出来,感觉思路一下子就放开了,类似的还有键盘映射时也定义了一个数组,存放按键的数值,这种方法真的很好,也让后面的程序简单了很多。
2.函数功能的划分与命名,感觉这个真是经验,不是随便就能做到的。
3.C文件和H文件的整体布局,宋老师的很好,甚至我还有点小不懂,不过我已经习惯按我的方式写了
4.星期的算法,虽然网上有很多简便算法,但是我习惯了选一个基准日期,然后去换算天数,再推算日期,虽然看起来很麻烦,但是易懂。

还有一个关键的按键部分的代码:

Key_Action 代码:
//按键动作函数
static void Key_Action( uint8 keycode )
{
//Enter键动作函数
if( keycode == KEY_ENTER )
{ 
if( System_Status == E_NORMAL )
{
AdjustTime_Enter();
}
else if( System_Status == E_ADJUST_TIME )
{
AdjustTime_Quit( true );
}
}

//Esc键动作函数
if( keycode == KEY_ESC )
{
if( System_Status == E_ADJUST_TIME )
{
AdjustTime_Quit( false );
}
}

//Right键动作函数
if( keycode == KEY_RIGHT )
{
Cursor_RightMove();
}

//Left键动作函数
if( keycode == KEY_LEFT )
{
Cursor_LeftMove();
}

//+键动作函数
if( keycode == KEY_ADD )
{
if( System_Status == E_ADJUST_TIME )
{
AdjustTime_AddFunct();
}
}

//-键动作函数
if( keycode == KEY_SUB )
{
if( System_Status == E_ADJUST_TIME )
{
AdjustTime_SubFunct();
}
}

//0~9
if( keycode >= '0' && keycode <= '9' )
{
if( System_Status == E_ADJUST_TIME )
{
AdjustTime_NumEnter( keycode );
}
}
}


没有评论,留下你的印记,证明你来过。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。