📄 calendarclk.c
字号:
#include <REG52.H> // 引用标准库的头文件
#include <intrins.h>
#include <absacc.h>
#include<math.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
/* DS12C887 内部专用寄存器宏定义 */
#define SECOND XBYTE[0x7F00]
#define MIN XBYTE[0x7F02]
#define HOUR XBYTE[0x7F04]
#define WEEK XBYTE[0x7F06]
#define DAY XBYTE[0x7F07]
#define MONTH XBYTE[0x7F08]
#define YEAR XBYTE[0x7F09]
#define REG_A XBYTE[0x7F0A]
#define REG_B XBYTE[0x7F0B]
#define REG_C XBYTE[0x7F0C]
#define REG_D XBYTE[0x7F0D]
/* 芯片DS12C887提供的日历时钟信息变量 */
uchar year,month,day,week,hour,minute,second;
#define Noop 0x00 // 空操作寄存器
#define Digit0 0x01 // 数码管1寄存器
#define Digit1 0x02 // 数码管2寄存器
#define Digit2 0x03 // 数码管3寄存器
#define Digit3 0x04 // 数码管4寄存器
#define Digit4 0x05 // 数码管5寄存器
#define Digit5 0x06 // 数码管6寄存器
#define Digit6 0x07 // 数码管7寄存器
#define Digit7 0x08 // 数码管8寄存器
#define Digit8 0x01 // 数码管9寄存器
#define Digit9 0x02 // 数码管10寄存器
#define Digit10 0x03 // 数码管11寄存器
#define Digit11 0x04 // 数码管12寄存器
#define Digit12 0x05 // 数码管13寄存器
#define Digit13 0x06 // 数码管14寄存器
#define Digit14 0x07 // 数码管15寄存器
#define Digit15 0x08 // 数码管16寄存器
#define DecodeMode 0x09 // 译码模式寄存器
#define Intensity 0x0A // 亮度寄存器
#define ScanLimit 0x0B // 扫描位数寄存器
#define ShutDown 0x0C // 低功耗模式寄存器
#define DisplayTest 0x0D // 显示测试寄存器
#define ShutdownMode 0x00 // 低功耗方式
#define NormalOperation 0x01 // 正常操作方式
#define ScanDigit 0x07 // 扫描位数设置,显示8位数码管
#define DecodeDigit 0xFF // 译码设置,8位均为BCD码
#define IntensityGrade 0x0A // 亮度级别设置
#define TestMode 0x01 // 显示测试模式
#define TextEnd 0x00 // 显示测试结束,恢复正常工作模式
sbit DIN = P1^0; // 串行数据输入
sbit CLK = P1^1; // 串行时钟
sbit LOAD = P1^2; // 显示数据锁存控制
/*按键设置*/
sbit SET=P1^3;
sbit ADD=P1^4;
sbit MOVE=P1^5;
sbit SUB=P1^6;
/* 延时t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于12M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/* 向MAX7219写入字节(8位)*/
void Write_Max7219_byte(uchar byte)
{
uchar i,temp;
for (i=0;i<8;i++)
{
temp=byte&0x80;
byte=byte<<1;
if(temp)
{
DIN=1; //写1
CLK=0;
CLK=1;
}
else
{
DIN=0; //写0
CLK=0;
CLK=1;
}
}
}
/* 向两片MAX7219写入字(32位)*/
void Write_Max7219(uchar address1,uchar data1,uchar address2,uchar data2)
{
LOAD=0;
Write_Max7219_byte(address2);
Write_Max7219_byte(data2);
Write_Max7219_byte(address1);
Write_Max7219_byte(data1);
LOAD=1;
}
/* MAX7219初始化 */
void Init_Max7219 (void)
{
Write_Max7219 (ScanLimit,ScanDigit,ScanLimit,ScanDigit); // 设置扫描界限
Write_Max7219(DecodeMode,DecodeDigit,DecodeMode,DecodeDigit); // 设置译码模式
Write_Max7219(Intensity,IntensityGrade,Intensity,IntensityGrade); // 设置亮度
Write_Max7219(ShutDown,NormalOperation,ShutDown,NormalOperation); // 设置为正常工作模式
}
void Judge_busy(void)
{
while( REG_A & 0x80 ); //忙则循环等待
}
/*设置时间函数*/
void Settime(void)
{
uchar i;
REG_B = 0x86; // 寄存器B, 时标寄存器用BCD码表示,为24小时工作模式
YEAR = year;
MONTH = month;
DAY = day;
HOUR = hour;
MIN = minute;
SECOND = second;
REG_A = 0x20; // 开启RTC
i=REG_C;
i=REG_D;
REG_B = 0x06; // 芯片处于正常工作状态, BCD模式
}
/* 读取日历时钟函数 */
void Gettime(void)
{
Judge_busy( );
year = YEAR;
Judge_busy( );
month = MONTH;
Judge_busy( );
day = DAY;
Judge_busy( );
hour = HOUR;
Judge_busy( );
minute = MIN;
Judge_busy( );
second=SECOND;
}
/* 数码管显示年、月、日、时、分、秒*/
void Display()
{
Write_Max7219 (Digit0,2,Digit8,hour/10);
Write_Max7219 (Digit1,0,Digit9,hour%10);
Write_Max7219 (Digit2,year/10,Digit10,minute/10);
Write_Max7219 (Digit3,year%10,Digit11,minute%10);
Write_Max7219 (Digit4,month/10,Digit12,second/10);
Write_Max7219(Digit5,month%10,Digit13,second%10);
Write_Max7219 (Digit6,day/10,Digit14,0);
Write_Max7219(Digit7,day%10,Digit15,0);
}
void main( )
{
Init_Max7219( );
year = 7; //写入时间:2007年04月09日15时38分10秒(要设定的时间)
month = 4;
day = 9;
hour = 22;
minute = 37;
second = 10;
Settime( );
while(1)
{
Gettime(); //读取的时间数据在变量year/month/day/hour/minute/second中
Display();
if(SET==0)
{
REG_A=0x70;
if(ADD==0&&MOVE==1)
{
REG_A=0x70;
delay(55);
if(ADD==0&&MOVE==1)
{
minute++;
if(minute>59)
{
minute=0;
hour++;
}
}
Settime();
Gettime(); //读取的时间数据在变量year/month/day/hour/minute/second中
Display();
}
else if(SUB==0&&MOVE==1)
{
delay(55);
if(SUB==0&&MOVE==1)
{
minute--;
if(minute<1)
{
minute=59;
hour--;
}
}
Settime();
Gettime(); //读取的时间数据在变量year/month/day/hour/minute/second中
Display();
}
else if(ADD==0&&MOVE==0)
{
delay(55);
if(ADD==0&&MOVE==0)
{
hour++;
if(hour>23)
{
hour=0;
day++;
}
}
Settime();
Gettime(); //读取的时间数据在变量year/month/day/hour/minute/second中
Display();
}
else if(SUB==0&&MOVE==0)
{
delay(55);
if(SUB==0&&MOVE==0)
{
hour--;
if(hour<1)
{
hour=23;
day--;
}
}
Settime( );
Gettime(); //读取的时间数据在变量year/month/day/hour/minute/second中
Display();
}
}
else
{
REG_A=0x20;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -