/***********************************************************
名称: 16*64点阵
MCU: AT89S52
晶振: 24M
外部器件: 16*64点阵,ds1302,ds18b20
接线: 见common.h
版本: V2.5
------------------更新记录---------------------------------
20081206 开始记录编辑过程,养成良好习惯.添加了1302.h的头文件.实现了实时时钟的显示.
因还未添加按键部分,故只能在proteus仿真.
20081207 增加了部分汉字的字模,取模真痛苦.
20081208 增加按键调整,增加显示模式选择,bug越来越多,只能用实物来测试了.晚上去把实验室的东西搬回来.
20081212 发现1302发热的情况,网上查了下是国产1302在受干扰的情况下才会出现的情况,
修改了1302初始化的一个bug.
20081213 增加翻页模式下的按键调整.1302初始化增加了时钟运行,不知为何有时初始化之后时钟不走
增加4个按键的程序,现在全都能调整了.
在普通状况下,恩add,或dec切换显示状态,流动显示全部内容,或者翻页钟
恩下adjust,进入调整模式,恩add或dec调整,再恩adjust调整下一项,恩cancel退出,回到流动显示模式.
20081219 焊了块板,修改许多bug,基本都是时间日期的最大值,最小值
20081220 添加18B20温度显示。
20090129 修正翻页显示时,切换模式反应迟钝的bug。
将默认模式的流动显示时间增加。
20090203 增加农历显示,农历显示时按键无效。(某bug简易解决法)
20090208 农历年显示修改
20090217 修改字模位置,修正了刚上电就翻页一次的bug
20090228 增加节日显示,修改按键为中断检测,减少温度检测频率
20090709 想起来就再改改吧
改了个冒号的字模,每秒不跳了.
20100616 这个是放在宿舍的点阵适用的程序
20110131 再拿起来看看,修正了调时过程中的错乱bug,原因为执行了农历转换.
20110204 修正温度bug,原因为参数越界
使用读1302秒位来更新,防止出现数据错位.
增加每24小时修正功能
20110207 整理了下,发论坛
20120219 修正了两个关于农历的bug
1,农历日期不对,使用了新的农历转换函数
2,农历节日不对,原因为节日检测时还是用了未转换的日期来判断
***********************************************************/
#include <REGX52.H>
#include "common.h"
#include "ds1302.h"
#include "ds18b20.h"
#include "nongli.h"
#include "zimo.h"
#define DISP_EN() L_OE=1 //4094高电平输出使能
#define DISP_DIS() L_OE=0
#define FESTIVAL_MAX 9 //定义农历节日数
//unsigned char data disp_buff[1];
volatile SYSTEMTIME CurrentTime;
unsigned char status=0; //按键状态
unsigned char disp_mode=0; //显示状态
unsigned char offset=0; //移动显示用的变量
unsigned char disrow=0; //当前扫描行
unsigned char k=0; //往buff中填的字
unsigned int t_counter=0,stop_counter=0,stop_time=0;
unsigned char f1=18,f2=18,f3=18,f4=18,f5=18,f6=18; //18就不会出现刚开始全部翻页的情况了.
unsigned char T_int,T_dec; //计算温度用
unsigned char temp_time[6]; //翻页钟用到
unsigned char festival_num; //节日计数
unsigned char nongli_year,nongli_month,nongli_day;
bit switch_flag=0,stop_bit=0;
bit one_sec_flag=0,half_sec_flag;
bit nongli_flag=0,nongli_change_flag=0,festival_flag=0;
bit add_flag=0;
bit dec_flag=0;
bit adj_flag=0;
bit esc_flag=0;
bit setting_flag=0;
bit check_flag=0;
bit flag=0; //1.25ms中断标志
bit correct_flag=0;
//bit alarm_enable=0,alarm_flag=0;
unsigned char ka=0,kb=0,kc=0,kd=0; //按键用
unsigned char correct_time=0; //每24小时修正的秒数.大于100,每24小时+N秒,小于100,-N秒.
//unsigned char idata alarm_hour,alarm_min;
unsigned char second_pre,second_now;
unsigned char code mode[4]={0,1,7,8}; //几种显示模式的排列,依次为
//0:流动显示年月日+固定一段时间翻页钟
//1:翻页钟
//7:全部流动显示
//8:温度
unsigned char idata date[53]=
{
10,10,10,10,10,10,10,10, //开头8个空格
2,0, //21世纪
0,9, //年数据 No.10,11
49,50, //“年”
0,1, //月数据 No.14,15
51,52, //“月”
0,1, //日数据 No.18,19
53,54, //“日”
10, //空格
55,56,57,58, //“星期”
25,26, //星期几 No.27,28
10, //空格
0,0, //小时数据 No.30,31
11, // : No.32
0,0, //分钟数据 No.33,34
11, // : No.35
0,0, //秒数据 No.36,37
10, //空格
10,10,12,10,13,14, //温度 No.39,40,42
10,10,10,10,10,10,10,10, //MAX No.52
};
unsigned char code moon_date[48]=
{
10,10,10,10,10,10,10,10, //开头8个空格
10,10, //No.8,9
10,10, //No.10,11
49,50, //“年”
10,10, //No.14,15
10,10, //No.16,17
51,52, //“月”
10,10, //No.20,21
10,10, //No.22,23
10,10,10,10,10,10,10,10, //开头8个空格
10,10,10,10,10,10,10,10, //开头8个空格
10,10,10,10,10,10,10,10, //开头8个空格
};
unsigned char code init_date[]=
{
10,10,10,10,10,10,10,10, //开头8个空格
2,0, //21世纪
0,9, //年数据 No.10,11
49,50, //“年”
0,1, //月数据 No.14,15
51,52, //“月”
0,1, //日数据 No.18,19
53,54, //“日”
10, //空格
55,56,57,58, //“星期”
25,26, //星期几 No.27,28
10, //空格
0,0, //小时数据 No.30,31
11, // : No.32
0,0, //分钟数据 No.33,34
11, // : No.35
0,0, //秒数据 No.36,37
10, //空格
10,10,12,10,13,14, //温度 No.39,40,42
10,10,10,10,10,10,10,10, //MAX No.52
};
unsigned char code week_data[]={00,25,27,29,31,33,35,53}; //一二三四五六日
unsigned char code moon_data1[]={45,43,47,29}; //初十廿三
unsigned char code festival_table[][2]=
{
{1,1}, //0 春节
{1,15}, //1 元宵
{44,44}, //2 清明 阳历的难以确定
{5,5}, //3 端午
{7,15}, //4 中元
{8,15}, //5 中秋
{9,9}, //6 重阳
{11,7}, //7 冬至
{12,30}, //8 除夕
};
unsigned char code qingming_table[6]=
{
0x77, //2000~2007
0x33, //2008~2015
0x33, //2016~2023
0x33, //2024~2031
0x33, //2032~2039
0x33, //2040~2047
};
/*-----------线性排布,不需查表---------
unsigned char code festival_data[]=
{
}
-------------------------------------*/
//void delay_nms(unsigned int count);
void set_row(unsigned char row);
void sendRbyte(unsigned char wdata);
void sendR2byte(unsigned char wdata,unsigned char n);
void Timer_init(void);
void time_to_buff(void);
void time_to_buff_all(void);
void update_buff(void);
void key_scan(void);
void display(unsigned char mode);
void get_temp(void);
void shutter_clock(void);
void festival_check(void);
//void alarm_check(void);
//void alarm(void);
/*
void set_correct(void);
void set_correct(void)
{
if( ds1302_ram_read(1) == 0xcc)
{
correct_time = ds1302_ram_read(1);
}
else correct_time = 0;
}
*/
void main(void)
{
get_temp();
ds1302_init();
time_to_buff_all();
Timer_init();
correct_time=CORRECT_TIME;
disrow=0;//disrow,当前扫描的行
//delay_nms(300);
get_temp();
while(1)
{
if(flag==1)
{
flag = 0;
DISP_DIS();
set_row(disrow); //行4094的输出.依次点亮1~16行.
L_STB=0;
display(disp_mode);
L_STB=1;
DISP_EN();
disrow++;
if(disrow>=16)
{
disrow = 0;
update_buff();
if(stop_bit==0) offset++;
if(stop_counter>stop_time)
{
disp_mode=0;
offset++;
stop_counter=0;
stop_bit=0;
}
if(disp_mode==1)
{