当前位置:首页 > 51单片机 > 正文内容

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

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

感谢金沙滩宋老师,我大四马上毕业了,万年历的程序也写过不止一次了,但我自己写的程序都很乱,每个程序都是一坨一坨的,看了宋老师的视频和程序,我学习到了很多,现在我把我模仿宋老师的代码写出来,也希望对别人能有帮助。
Proteus仿真图:
万年历(AT89C52+DS1302+LCD1602+4X4矩阵键盘) - 左手握右手 - 小小码农搬砖头
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 );
}
}
}


扫描二维码推送至手机访问。

版权声明:本文由智凡单片机c语言入门发布,如需转载请注明出处。

分享给朋友:

相关文章

keil之c语言模块化编程初探

keil之c语言模块化编程初探

       很久就想要把自己曾经写过的程序变成一个自己的真正的程序库,曾经用过一个比较笨的方式——将每一个模块独立,复制粘贴。但是这样并不能够做到高效率的编程...

买下51单片机实验板

买下51单片机实验板

 一直在想这个博客该写些什么,主体就暂定为“单片机学习之路”吧。 在网上看了N多天,终于在上周六邮购一块儿51单片机的实验板,功能挺全的,编程器/仿真器/ISP/实验板多合一。虽然...

单片机控制PWM波驱动直流电机

单片机控制PWM波驱动直流电机

1、原理图:主要元件:ADC0831(将变化的电压变成数字量)、AT89C52、直流电机驱动芯片(L298)、二路开关(SW-SPDT 控制正反转)、滑动变阻器(控制电机转速)、ENA引脚接受单片机发...

单片机入门篇——工具

单片机入门篇——工具

今天聊一聊工具,入坑单片机后,最先接触的实际上是各种工具。即便是玩了几年的大神,也未见就能推荐适用的工具给你,更别说才入门的小白。我从入坑至今,整整八个年头,用很多金钱和实践换来很多宝贵经验,今天就分...

LED呼吸灯和串口LED指示灯

LED呼吸灯和串口LED指示灯

  最近在串口发送引脚上接LED指示发送或者接收状态,但是需求是希望连续发送或者接收字符过程中LED闪烁,而不是保持在一个常量或者常灭的状态。首先,把实际电路图和串口时序贴出来:  可以看出串口发送接...

STC自动冷启动下载器的制作

STC自动冷启动下载器的制作

       不知道大家是否发现每一次在STC单片机上下载程序时都需要手动的给单片机重新上电呢?这是因为MCS51单片机设计时对系统内存储空间(现大多是指Fla...

发表评论

访客

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