📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: 用PCF8583与高仿真组件设计的可调式数码管电子时钟
//-----------------------------------------------------------------
// 说明: 本例在Proteus中选用了高度仿真的电子钟元器件,并添加了
// 时分调整功能,冒号闪烁显示,AM/PM切换,12/24小时制选择等.
//
//-----------------------------------------------------------------
#include <pic.h>
#include <stdio.h>
#include "PCF8583.h"
//分别保存:1/100秒,秒,分,时,前者为BCD,后者为DEC
extern INT8U RTC_DATA[4], DateTime[4];
//时钟设置开关及按键
#define S1_ON() (RB0 == 0) //设置
#define K2_DOWN() (RB1 == 0) //12/24小时
#define K3_DOWN() (RB2 == 0) //小时加
#define K4_DOWN() (RB3 == 0) //分钟加
//时钟指示组件控制引脚定义(不要误定义为1,2,3,4)
#define CLK_AM_PM 0 //AM/PM切换
#define CLK_12_24 1 //12/24小时制切换
#define CLK_SET 2 //SET指示切换
#define CLK_COL 3 //冒号显示切换
//3-8译码器使能控制引脚定义(RD3)
#define E1_74LS138 3
//时分秒显示缓冲(各占两位,共6字节),
//第7个字节0x00控制(AM/PM),(12/24),(SET)及":"显示.
//该字节低四位的对应关系是XXXX-0(:)0(AM/PM)0(12/24)0(SET)
//这与上述的四个#define对应.0x00默认设置AM,12,非SET
INT8U disp_Buffer[] = {0,0,0,0,0,0,0x00};
//本例函数声明
void Refresh_Disp_Buffer(); //刷新显示缓冲
void Display_Time(); //显示时钟
void Adjust_and_Set_Clock(); //调节与设置时钟
//-----------------------------------------------------------------
// 根据当前时间刷新时分秒显示缓冲
//-----------------------------------------------------------------
void Refresh_Disp_Buffer()
{
}
//-----------------------------------------------------------------
// 显示时间
//-----------------------------------------------------------------
void Display_Time()
{
INT8U i;
//循环显示时钟显示屏的7位数据,前6个是时/分/秒,各两位
//最后一字节用于控制指示屏及":"开关
for (i = 0; i < 7; i++)
{
}
}
//-----------------------------------------------------------------
// 处理12/24小时制按键切换后的数据变更及AM/PM显示开关
//-----------------------------------------------------------------
void Handle_12_24_and_AM_PM_Switch()
{
//处理24小时制下的数据变更等问题---------------------------------
if ( disp_Buffer[6] & (1<<CLK_12_24) )
{
}
else //处理12小时制下的数据变更及AM/PM开关问题------------------
{
}
}
//-----------------------------------------------------------------
// 时钟调整与设置
//-----------------------------------------------------------------
void Adjust_and_Set_Clock()
{
INT8U Changed_Flag = 0; //时间调节改变标志
disp_Buffer[6] |= (1<<CLK_SET); //点亮"SET"标志
while (S1_ON()) //K1未释放时保持设置状态
{ if (K2_DOWN()) //设置12/24小时制----------------------------
{
}
if (K3_DOWN()) //加小时-------------------------------------
{
}
if (K4_DOWN()) //加分钟-------------------------------------
{
}
//刷新显示缓冲并显示当前时钟 --------------------------------
Refresh_Disp_Buffer(); Display_Time();
}
if (Changed_Flag) //如果有调节操作则写入PCF8583
{
}
disp_Buffer[6] &= ~(1<<CLK_SET); //关闭"SET"标志,恢复正常运行状态
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
ADCON1 = 6; //RA端口设为数字端口
TRISB = 0xFF; RBPU = 0; //调节按键/开关输入,内部上拉
TRISD = 0x00; //数码管显示输出端口
I2C_Init(); //初始化I2C
}
//----------------------------------------------------------------
// TMR0溢出中断控制时钟运行
//----------------------------------------------------------------
void interrupt Clock_Run_Control()
{
if (T0IF)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -