/*
红色:FC10,F800,8208,8000,4000,
黄色:FFF0,FFE0,8400,8408,
绿色:87F0,87E0,07E0,0400,0200,0408,07F0,07E8,
蓝色:001F,0010,0008,0014,0210,0418,041F,841F,0210,
青色:07FF,87FF,
灰色:C618,8410,
西瓜红,粉色:F810,F81F,FC1F,FC18,8008,8010,4008,
紫蓝:801F,4010,0410,0208,4410,8418,
橙黄:FC08,FC00,8200,
黑色:0000
白色:FFFF
护眼:CF59 */
// ------------********************************************************************/
#include "STC15W4K32S4.H " //
#include " usartPING8cui.H " // 屏
//#include " usartBPKT.H " // 空调
//#include " DIANBIAO.H " // 电表
#include " initalize.H " // 初始化 串口定时器,定时中断程序
#include " scankey.H " // 键扫描程序,处理,初始化时的按键设置,文字颜色,亮度
#include " setRTCkey.H " // 键扫描程序,处理,时间等设置
#include " RTC_DS3231.H " // DS3231时钟芯片子程序20160917
#include " READ_DHT11.H " // 温度、湿度传感器 DHT11 子程序
#include " DISPshijian.H " // 显示参数,,时间
#include " Font_GB2312_code.H " // 汉字字库成语
#include " stcEEPROM.H " // STC单片机 EEPROM 存储器
#include " wannianli.H " // 万年历计算,农历,节日,节气
#include " JIEQI24.H " // 万年历计算,农历,节日,节气
//#include <STC15F2K60S2.H>
void DISP_MUORENset( void ); //显示屏 初始化 亮度,颜色,表格,标题,数字颜色,背景色,前景色
void init_DUANKOU ( void ) ; //IO端口初始化
void init_UART_TIME( void ) ; //初始化 串口和定时器
//====================================================================================
//*********************************************************************************
//******************************************************************************
/*
//========== 定时器中断服务函数 ===============================================
//=============================================================================
// 定时器0:interrupt 1 ,
// 定时器1:interrupt 3 ,
// 定时器2:interrupt 12 , 串口2和串口3共用波特率
// 定时器3:interrupt 19 , 运行时间,//34482微秒@22.1184MHz 34.482*29=1秒
// 定时器4:interrupt 20 串口4,空调600BPS用
//-----------------------------------------------------------------------------
void Time1_int(void) interrupt 3 // 定时器1 扫描
{
;
}
/*
if(TMcon==29) {TMcon =0 ; TMsec++ ; } //调试用指示灯
if(TMsec==60) {TMsec =0 ; TMmin++ ; if(DBconsumption_b==1) TMmin_SUM++ ; if(TMmin_SUM==60) TMmin_SUM=0; } //有用电时,时间累加,定时器不停
if(TMmin==60) {TMmin =0 ; TMhou++ ; if(DBconsumption_b==1) TMhou_SUM++ ; }
if(TMhou==24) {TMhou =0 ; */
//========== 串行口1中断服务函数 ===============================================
//=============================================================================
// 串口1:interrupt 4 , ISP
// 串口2:interrupt 8 , 定时器2 显示屏 4800bps
// 串口3:interrupt 17 ,定时器2 电表 4800bps
// 串口4:interrupt 18 定时器4 空调 600bps
//-----------------------------------------------------------------------------
//***********************************************************************************************************
//========================= 屏初始化参数,表格,颜色,亮度 =============================================
void DISP_MUORENset(void)
{
Dis_Clear(); //显示屏 清屏
// Dis_SMS ( 0xF800, 0x049B ); //显示屏 红色显示 ,显示说明书,颜色,黄色 ,显示背景图片
// Brightness( liangdu_key() ); // 上电检测亮度设定值,上电有效
// yanse_key(); // 颜色选择,通过键控
Dis_Clear(); //显示屏 清屏
Set_ColorPallet( front_color , back_color ); //屏的前景色,背景色设置
Dis_Clear(); //显示屏 清屏 ,设置完颜色后,必须清屏才显示
// DISP_KCBbiaoge(); // 课程表表格直线
// DISP_JRKC(0x07FF , back_color); //显示"今日课程" 文字,和课程序号12345,绿色07E0, 07FF青色
//-------------------------------
// DISP_biaoti ( front_color , back_color ) ; //显示行标题 front_color ; back_color ; Digital_color ;
/// DISP_daiweifuhao( front_color , back_color ) ; //显示单位符号
// DISP_biaogeZHIXIAN(); //课程表 绘制表格,直线
}
//***********************************************************************************************************
//========================= 端口 初始化, =============================================
void init_DUANKOU ( void )
{
P0M1 = 0x00 ;
P0M0 = 0x00 ; //
P1M1 = 0x00 ;
P1M0 = 0x00 ; // 输出
P2M1 = 0x00 ;
P2M0 = 0x00 ; // 输出
P3M1 = 0x00 ;
P3M0 = 0x00 ; // 输出
// P3M1 = 0x01;
// P3M0 = 0x00; // 仅为输入 0 ,0 标准双向口,0,1推勉输出,1,0仅输入,1,1高阻
}
//***********************************************************************************************************
//========================= 初始化 串口和定时器 ===========================串口3占用了20150923 定时器3==================
void init_UART_TIME( void ) //初始化 串口和定时器
{
// UART1_Init(); //Baud=4800
UART2_Init(); //Baud=115200,用于同屏幕通信,占用定时器2
Timer0Init(); // 5ms 定时器0初始化 运行时间,并 开始计数
Timer1Init(); // 10ms 定时器1初始化 运行时间 ,并 开始计数
Timer3Init() ; // 35ms 定时器 T3初始化 并 开始计数
Timer4Init() ; // 500us 定时器 T3初始化 并 开始计数
INT_INTERRUPT_Init(); // 其它中断初始化,外中断
// IP2 = 0x00 ; //中断优先控制位
// IP = 0x00 ; //中断优先控制位
// IE2 |= 0x08; //充许串口3中断,电表用
// IE2 |= 0x10; //充许串口4中断,空调用
}
//**********************************************************************************
//**********************************************************************************
void main()
{
unsigned char ala , xq ; //
unsigned char kb=0 , jq=0; //
unsigned char tu=0 ; //, zym
unsigned char LDtjD_ws=2, LDtempB=7 ; //夜晚亮度调整用,临时数,晚上22-早6点 亮度15
unsigned char IDcy = 0 ; // 成语 ID,循环显示1-52个成语
unsigned char xqtemp=0; // 星期临时值,临时值-星期,变化不等于0时,说明 第二天了
init_DUANKOU(); // IO端口 初始化
init_UART_TIME( ); // 初始化 串口和定时器
Delay_Ms(1000); // 延时1s,等待屏幕初始化完成,此时显示logo(图片0)
//--------------------
// 屏的颜色: 红色F800,淡蓝色001F,黄色FFE0,绿色07E0,白色FFFF,黑色0000,青色07FF,深黄色8400,深蓝色0008,
//----------------------------
DISP_MUORENset(); //显示屏初始化 亮度,颜色,表格画直线,数字颜色,背景色,前景色,
//Set_ColorPallet(0xF800, 0x049B) ; //,背景色,前景色
//Delay_Ms(5000); Delay_Ms(5000); Delay_Ms(5000); Delay_Ms(5000);
//-------------------------------
comm_DS3231init(); // DS3231
//---读出闹钟值----放在RAM---------
ALtime[0]=(ZH_Data(0,Readbyte(0x09))); // AL1时 BCD to HEX;
ALtime[1]=(ZH_Data(0,Readbyte(0x08))); // AL1分
ALtime[2]=(ZH_Data(0,Readbyte(0x0c))); // AL2时
ALtime[3]=(ZH_Data(0,Readbyte(0x0b))); // AL2分
//--读出闹钟开关状态---
ala = Readbyte(0x0E); // 闹钟控制寄存器
if((ala&0x01)==1){AL1_B=1;} // &按位与
else AL1_B=0;
if((ala&0x02)==2){AL2_B=1;}
else AL2_B=0;
wri_addrm(0x0F,0); //闹钟 响 清闹钟寄存器=0,上电清2个闹钟
wri_addrm(0x10, 0x02) ; // 10H老化补偿位,并进2个电容
/* //-----------调试用,调试后关闭-------------
if( set_timeq == 0 ) //如果上电时,按下=初始化
{ initialize_DS3231() ; // 初始化 时钟3231
init_alrm() ; // 初始化闹钟 // 初始化 闹钟 3231 enable alarm
} */
//-------------------------------------
beep1s(100); // 上电响一声
EA = 1;
//-------------------------------------------------------------------------------------
//=================================================================-
while(1)
{ //----- 现在主程序的循环周期为 12.7ms----12.7ms执行一圈-------
/* Dis_Pic(tu); //显示图片
tu++;
if(tu>94) tu= 0 ;
Delay_Ms(5000); //延时1s,等待屏幕初始化完成,此时显示logo(图片0)
Dis_Clear(); //显示屏 清屏 ,设置完颜色后,必须清屏才显示
DISP_biaogeZHIXIAN(); //绘画直线,表格
*/
/* // ,背景1-前景2-时钟字色3-日期色4-文字色5-温度6-闹钟色7
front_color ; back_color ; RTC3_color ; date4_color; word5_color ; temp6_color ; alar7_color ;
//===============================================================================
// datZY(dsmp[8]); // 字节 高低位 顺序 76543210,变成01234567端口顺序改变用
*/
if((TiSetD_end_b==1)||(AlSetD_end_b==1)) { AlSetD_end_b=0;TiSetD_end_b=0; Dis_Clear(); Delay_Ms(500); } // 时间设置完标志位,显示时清0,清屏
//----------------文字及背景颜色设置----------
if(YStj_b==1)
{ SETyanse(); Set_ColorPallet( front_color , back_color ); YStj_b = 0 ; Dis_Clear(); Delay_Ms(500); } // 设置背景色后必须清屏延时
//----------------屏幕亮度设置---------------
if(LDtj_b==1) { Brightness( LDtjD ); LDtj_b = 0 ; }
//------ -屏幕亮度 晚上10点 到早上5点 最低,其它时间,默认值- --------
if( (date_time[2]>0x05)&&(date_time[2]<0x22) ) { if(LDtempB==7) { Brightness( LDtjD ); LDtempB=3;} } // 早6到晚10点 正常亮度
else { if(LDtempB==3) { LDtempB=7; Brightness( LDtjD_ws ); } }
//----------------设置时间、闹钟--------
if(effeKEY_b==1) { effeKEY_b=0 ; setRTCkeyCL(); SetDTtreg(); } // 有效键后,扫描按键,并处理,设置时间、闹钟、亮度、初始化、颜色, 设置 时间、闹钟
//------------------ 显示课程表位=1 -------------
if( dispKCB_b ==0 ) // , DISP_kechengbiaoALL( 0xF800, 0x0000 ) ;
{
if( kb==5) { kb = 0 ; Dis_Clear(); Delay_Ms(500); } //显示屏 清屏,清屏后必须延时
//=-=-=-=-=-=-=-=-=-=-==========--------------------------
DISP_KCBbiaoge(); // 课程表表格直线
DISP_JRKC( word5_color, back_color ); // 显示"今日课程" 文字,和课程序号12345,绿色07E0, 07FF青色
//-----------------显示 时间--
read_dati(); //读RTC 3231 ,date_time[0],秒分时.星期.日月年,温度
DISP_CL_BCDto(); //处理时钟 3231 BCD 显示用,时间,温度 转化成显示用
DISP_RTCshijian( RTC3_color , back_color ) ; // back_color显示实时时间,(0xF800, 0x049B),白色0xFFFF
DISP_RTCriqi ( date4_color , back_color ) ; // 显示日期,年月日星期
DISP_RTCxingqi ( date4_color , back_color, 0x0212 , 0x000E ) ; // 显示星期 几
DISP_RTCxingqi ( date4_color , back_color, 0x001E , 0x013A ) ; // 显示星期 几 30 ,314,显示2个地点,2个坐标
//-----------------显示 课程--
if( date_time[2] > 18 ) { xq = dsmp[8] + 1; if( xq>7 ){ xq=1; } } // 如果时间大于12点 显示明日 课程表
else { xq = dsmp[8]; }
//----------星期六和星期日,今天明天课程 里显示:放假休息喽-----------------
//-----------------显示 课程表--
DISP_kechengbiaoXUAN( word5_color , back_color , xq ) ; // 前景色FFE0黄色,背景色,星期几就显示星期几的课程内容
//-----------------显示 闹钟时间----
DISP_RTCalarm ( alar7_color , back_color , 0x01F4 , 0x0061 ) ; // 500,97显示 闹钟时间
DISP_RTCalarmONOFF ( alar7_color , back_color , 0x0244 , 0x0061 ) ; // 580,97显示 闹钟状态,开关
//-----------------显示 温湿度------
if(sec5s_b==1){ DHTreceive( ) ; // DHTcon++; if(DHTcon==10) DHTcon=0; // 接收 湿度传感器DHT11数据,2分钟读一次湿度
sec5s_b= 0; sec = 0 ;
//// IDcy+=4 ; if(IDcy==52) IDcy=0; // 显示成语
// jq++ ; if(jq>12) jq=1 ;
xqtemp = dsmp[8] ; // 赋值 星期
wri_addrm(0x10, 0x02) ; // 10H老化补偿位,并进2个电容
lhbc1_D=(ZH_Data(0,Readbyte(0x10))); // 读出老化补偿电容值,AL1时 BCD to HEX;
//zym++; if(zym>11) zym=1; // 调试用
} // 显示 湿度/温度 front_color 蓝色0x1F00
DISP_DHT11 ( temp6_color , back_color , 0x01F4 , 0x0091 ) ; // 500 ,145
//-----------------显示 期望--------
DISP_QIWANG1( alar7_color , back_color ) ; // 显示 期望的,祝福的话1, 4个字加一个标点符号, ,50,464
//----------------- 显示 每日 成语 ----------
DISP_ChengYu( RTC3_color , back_color , 0x0030, 0x0216, HZchengyu[IDcy] , 20 ) ; // 48,534,显示成语(颜色,坐标,字库开始地址,长度,10个为一个成语加逗号,)
//----------------- 显示座右铭 ----------
DISP_ZuoYouMing( date4_color , back_color , dsmp[8]+2 ) ; // 显示 期望的,祝福的话 共9个字 ,,300 ,464
//----------------- 显示 提醒----------
DISP_tixing ( word5_color, back_color ,0x01F4 , 0x00BE ); // 500,190 显示 环境温度湿度 提醒
//----------------设置时,提醒设置内容---------
DISP_SETword( RTC3_color , back_color ) ; // 设置时,提醒设置内容
//----------------------------------
DISP_LdYs_tishi( temp6_color , back_color , 0x02BC, 0x000E ); // 颜色 和 亮度 提示, (显示的颜色,坐标)back_color+0x0840 , back_color ,
DISP_TIAOSHI ( front_color , back_color ) ; // 调试数据,, 48,566
//---------------- 计算农历 年月日 ---------
Conversion( 0, date_time[6], date_time[5], date_time[4] ) ; // 11月07日 计算 农历日期,由阳历年月日到农历年月日
DISP_NongLi ( alar7_color , back_color , 0x0040 , 0x00CD ) ; // 64,205.显示农历 年月日
DISP_nongliHolidays( date4_color , back_color , 0x0040 , 0x0107 ) ; // 70,263 .显示 节日
DISP_gongliHolidays( word5_color , back_color , 0x0104 , 0x0107 ) ; // 260,263 .显示 节日
js_JIEQI(date_time[6], date_time[5] , date_time[4] ) ; // 节气计算返回 日期,年月日计算 24节气
DISP_24jieqi( temp6_color , back_color , 0x0180 , 0x00D7 ) ; // 384,215 显示24节气
//-----------------闹钟声音输出----周六周日不响---------------
if(AlaSkB==1) // 外中断置位
{ if((date_time[3]==0x06)||(date_time[3]==0x07)) { SOTalaspk(); }
else alaspk(); } // 周末不闹 如果闹钟到有中断了,就声音 闹钟输出
//------------------------------------------------------------------------------
//// if(gb==0) { gb=8; DISP_guangbiao(0x0078,0x010B,0x1F,0x05,0x01); } // 打开光标显示,坐标/长/高/开关
//// if(gb==8) { ; } // 打开光标显示
if( xqtemp!=dsmp[8] ){ IDcy++ ; if( IDcy>52 ) { IDcy = 0; } } // 星期变化时,说明是第二天了, 显示 每日 成语
//// xqtemp = dsmp[8] ; // 赋值 星期
// Delay_Ms(500);
} // -----K5=0 END-------------
else // dispKCB_b = 1
{
if(kb==0)
{ switch(dispKCB_D) // 0000 0000 02BC 01BD 0019 0019
{case 1:
{
Dis_PICshear( 0x09, 0x0000, 0x0000, 0x02BC, 0x01BD, 0x0019, 0x0019 ); // 剪切显示图片 课程表
break; }
case 2:
{
Dis_PICshear( 0x17, 0x0000, 0x0000, 0x02BC, 0x01BD, 0x0025, 0x0025 ); // 剪切显示图片 课程表
break; }
case 3:
{
Dis_Pic(85); // 显示图片 课程表
break; }
case 4:
{
Dis_Pic(tu); // 显示图片 课程表
if(sec10s_b==1){ sec10s_b=0; tu++; if(tu>84){ tu=0;} } // Dis_Clear(); // 显示屏 清屏
break; }
case 5:
{
kb = 5 ;
dispKCB_b = 0 ; // =1显示课程表,清0,退出,显示时间
break; }
break;
} // ----switch END -------
} //------if(kb=0) END ---------
} //---- slse END ---------
//==-------------------------------
} //----------- while end-
}
|