/*****************************************************************************
* led_main.c
*
* LED DEMO Main Entry
*
* SST89E58/SST89E516 Experimental BOARD
*
* Copyright(C) 2007, Finley ZHU, HUST
* All rights reserved.
*
* History
* 2007.11.18 ver 1.00
*
*****************************************************************************/
#include "../pub/board.h"
#include "../pub/led.h"
#include "../pub/timer.h"
#include "../pub/lcd.h"
#include "../pub/key.h"
#include "../pub/IAP.h" //IAP模块,保存温度值
extern char Timer_interr_flag ;
char flag_ms = 1; //进位标志位
char flag_s = 1;
char flag_m = 1;
char flag_display = 1; //分段显示标识符
char flag_start = 0; //启动和设定标识符
char flag_set = 0;
char flag_mo = 0; // 移动一次标志符
char flag_rst = 0; // 记录数据标志
char movex = 0;
char time[16] = "00:00:000 Tiljc ";
unsigned char timeold[16] = "0000000000000000";
unsigned char ledi_m=0; // 计数十进制表示
unsigned char ledi_s=0;
unsigned char ledi_ms=0;
/************************
显存更新
***********************/
void display_number()
{
time[0] = timeold[0]+48; //需要显示的显存单元
time[1] = timeold[1]+48;
time[3] = timeold[3]+48;
time[4] = timeold[4]+48;
time[6] = timeold[6]+48;
time[7] = timeold[7]+48;
time[8] = timeold[8]+48;
}
/********************
显示函数库
*********************/
void diaplay()
{
display_number();
if(flag_m == 0)
{
ledi_s=0;
}
if((flag_set == 0)&&(flag_start == 0))
{
LCD_PutStr(0,0,time);
LED_Digit(ledi_s);
}
if(flag_set == 1)
{
LCD_CurPos(movex,0);
}
if(flag_start == 1) //通过细分LCD段,达到刷新时间小于1ms效果,显示毫秒值
{
if(flag_display == 0)
{
LCD_PutStr(0,0,time);
LED_Digit(ledi_s);
flag_display = 1;
}
else
{
LCD_PutStr(6,0,time);
LED_Digit(ledi_s);
}
}
}
/**************
初始化
******************/
void init()
{
Board_Init();
LCD_Init();
LCD_Clear();
LCD_PutStr(0,0," SST89E58 MCU ");
LCD_PutStr(0,1," ljcwater ");
Delay500Ms();
LED_Off();
P2 = 0x00;
Delay100Ms();
Timer_Init();
timeold[0] = byte_verify(BLK1_DST_ADDR); //记录设定值
timeold[1] = byte_verify(BLK1_DST_ADDR1);
timeold[3] = byte_verify(BLK1_DST_ADDR2);
timeold[4] = byte_verify(BLK1_DST_ADDR3);
timeold[6] = byte_verify(BLK1_DST_ADDR4);
timeold[7] = byte_verify(BLK1_DST_ADDR5);
timeold[8] = byte_verify(BLK1_DST_ADDR6);
LCD_PutStr(0,1," 1 Set 2 Start "); //初始化显示屏
}
/*********************************
记录设定值
********************************/
void flash_get ()
{
if(flag_rst == 1){
flash_main(BLK1_DST_ADDR);
flash_main(BLK1_DST_ADDR1);
flash_main(BLK1_DST_ADDR2);
flash_main(BLK1_DST_ADDR3);
flash_main(BLK1_DST_ADDR4);
flash_main(BLK1_DST_ADDR5);
flash_main(BLK1_DST_ADDR6);
flag_rst = 0;
}
}
/************************************************
时间值加减的逻辑判断,处理递减过程中的进位问题
************************************************/
void timeflow()
{
if(flag_start == 1){
if ((Timer_interr_flag==1) &&(flag_m == 1)){
Timer_interr_flag = 0;
if(timeold[8] == 0){
if(timeold[7] == 0){
if(timeold[6] == 0){
timeold[6] =9;
timeold[7] =9;
timeold[8] =9;
flag_ms = 0;
flag_display = 0;
}
else{
timeold[6]--;
timeold[7]=9;
timeold[8]=9;
}
}
else{
timeold[8]=9;
timeold[7]--;
}
}
else{
timeold[8]--;
}
}
if (flag_ms == 0)
{
flag_ms = 1;
if(timeold[3]==0)
{
if(timeold[4]==0){
timeold[3]=5;
timeold[4]=9;
flag_s = 0;
}
else{
timeold[4]--;
}
}
else
{
if(timeold[4]==0){
timeold[4]=9;
timeold[3]--;
}
else{
timeold[4]--;
}
}
ledi_s=timeold[4]+timeold[3]*10;
}
if( flag_s == 0)
{
flag_s = 1;
if(timeold[0]==0)
{
if(timeold[1]==0){
timeold[3]=0; //清零显存
timeold[4]=0;
timeold[6]=0;
timeold[7]=0;
timeold[8]=0;
flag_m = 0;
}
else{
timeold[1]--;
}
}
else
{
if(timeold[1]==0){
timeold[1]=9;
timeold[0]--;
}
else{
timeold[1]--;
}
}
}
}
}
void KEY1fucntion()
{
flag_mo = 1;
if(flag_start==0)
{
LCD_PutStr(0,1,"1Mov 2Go 3+ 4- ");
flag_set = 1;
}
else
{
Timer_Disable();
}
if((flag_set == 1)&&(flag_mo == 1))
{
if(movex==8){
movex=0;
}
else {
movex++;
}
flag_mo = 0;
}
}
void KEY2fucntion()
{
if(flag_set == 0){
flag_start = 1;
}
if((flag_start == 1)||(flag_set==1)){
flag_set = 0;
}
Timer_Enable();
LCD_PutStr(0,1,"1= 2Go 3Stp 4Rst ");
}
void KEY3fucntion()
{
if(flag_start == 1){
EA=0;
timeold[0] = 0;
timeold[1] = 1;
timeold[3] = 0;
timeold[4] = 0;
timeold[7] = 0;
timeold[8] = 0;
}
if(flag_set == 1)
{
if((movex==0)||(movex==3) )
{
if(timeold[movex]==5)
{
timeold[movex] = 0;
}
else {
timeold[movex]++;
}
}
else
{
if(timeold[movex]==9)
{
timeold[movex] = 0;
}
else {
timeold[movex]++;
}
}
display_number(); //显存更行,不至于等到下一次
LCD_PutStr(0,0,time);
}
}
void KEY4fucntion()
{
flag_rst = 1;
// Timer_Disable();
if(flag_start == 1)
{
// init();
flag_m = 1; //进入数据处理的标志位应该也初始化,否则只能运行一次
LCD_PutStr(0,1," 1 Set 2 Start");
flag_start = 0;
// flag_set = 0;
flash_get();
}
if(flag_set == 1)
{
if((movex==0)||(movex==3) )
{
if(timeold[movex]==0)
{
timeold[movex] = 5;
}
else {
timeold[movex]--;
}
}
else
{
if(timeold[movex]==0)
{
timeold[movex] = 9;
}
else {
timeold[movex]--;
}
}
display_number(); //显存更新
LCD_PutStr(0,0,time);
}
}
void main()
{
init();
while(1)
{
switch(QueryKeyPress())
{
case KEY1:
KEY1fucntion();
break;
case KEY2:
KEY2fucntion();
break;
case KEY3:
KEY3fucntion();
break;
case KEY4:
KEY4fucntion();
break;
}
timeflow();
diaplay();
}
}