#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "spi.h"
#include "flash.h"
#include "mmc_sd.h"
#include "ff.h"
#include "integer.h"
#include "diskio.h"
#include "text.h"
#include "24cxx.h"
#include "fontupd.h"
#include "remote.h"
#include "show.h"
#include "dijkstra.h"
#include "rtc.h"
#include "list.h"
#include "Retarget.h"
//#include "pwm.h"
const u8 *COMPILED_DATE=__DATE__;//获得编译日期
const u8 *COMPILED_TIME=__TIME__;//获得编译时间
int returnmax(int temp)
{
if(temp/100000)
{
return 5;
}else if(temp/10000)
{
return 4;
}else if(temp/1000)
{
return 3;
}else if(temp/100)
{
return 2;
}else
{
return 1;
}
}
u32 totalsecond(u8 hour,u8 minute,u8 second)
{
return hour*3600 + minute*60 + second;
}
int main(void)
{
//u8 totaldistance;
int flag = 0; //标记是各位还是十位
int startorend = 0; //标记是开始站点还是结束站点
u8 startorpulse = 0; //标记是启动还是停止
u8 play = 0; //是否开始显示运行时间
u8 K_Play=0; //判断播放链表长度
u8 K_Pulse=0; //判断停止链表长度
int key; //遥控键值
u8 fontx[2];
int keynumshi; //第一次为十位
int keynumge; //第二次为各位
int mykey; //为键值转换的值
int mysite[2]={0,0}; //保存结束和开始站点
u16 temp = 0; //得到站点组成的数
u8 sitenum=0; //记录站点数目
u32 startsecond=0; //记录开始时的秒数
u32 endsecond=0; //记录结束时的秒数
FATFS fs;
u32 playtotaltime = 0; //记录最近一次运行时间段
u32 pulsetotaltime = 0; //记录最近一次停止时间段
Lnode *L_Play; //链表的建立
Lnode *L_Pulse; //链表的建立
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
RTC_Init();
Remote_Init();
uart_init(9600);
SPI_Flash_Init(); //SPI FLASH初始化
f_mount(0, &fs); //初始化必须mount
L_Play=(Lnode*)malloc(sizeof(Lnode)); //动态分配内存
L_Pulse=(Lnode*)malloc(sizeof(Lnode)); //动态分配内存
L_Play->next=0; //链表的建立
L_Pulse->next=0;
while(font_init())
{
  OINT_COLOR=RED;
LCD_Clear(WHITE);
while(update_font()) //从SD卡更新
{
LCD_ShowString(60,90,"FAT SYS ERROR. ");
delay_ms(200);
}
}
  OINT_COLOR=RED;
Show_Screen(); //显示屏幕
LCD_ShowString(10,250,"Starting site:");
while(1)
{
if(Remote_Rdy )
{
key=Remote_Process();
switch(key)
{
case 162:
LCD_ShowString(150,240, "POWER");
break;
case 98:
LCD_ShowString(150,240, "UP ");
break;
case 2:
if(startorpulse == 0)
{
//startsecond = totalsecond(timer.hour,timer.min,timer.sec);
/* InsertList(L_Play,1,3);
LCD_ShowNum(100,200,printList(L_Play,1),1,16); //在播放链表里插入开始运行时间点
if(K_Play==0) //第一次按下那个播放键起始时间为0,
{
pulsetotaltime = 0;
}else //第二次后的播放时间点减去最新一次停止时间点为播放时间
{
pulsetotaltime = pulsetotaltime + printList(L_Play,K_Play) - printList(L_Pulse,K_Pulse-1);
}
//如果车在启动,则显示时间
Show_Str(100,10,"开车时间:",16,0);
startorpulse = 1; //准备进入停止运行计算时间
L_Play = L_Play->next; //准备进入停止运行计算时间
K_Play++;*/ play = 1; //准备进入停止运行计算时间
}else
{
/* play = 2; //如果车停止运行
startorpulse = 1; //准备进入运行运行计算时间
Show_Str(100,30,"停车时间:",16,0);
InsertList(L_Pulse,K_Pulse,totalsecond(timer.hour,timer.min,timer.sec)); //在停止链表里插入结束运行时间点
playtotaltime = playtotaltime + printList(L_Pulse,K_Pulse)-printList(L_Play,K_Play-1);//停止时间点减去最新一次播放时间点为停止时间段
L_Pulse = L_Pulse -> next; //准备进入运行计算时间
K_Pulse++; */ //准备进入运行计算时间
}
key = 111;
break;
case 226:
LCD_ShowString(10,270,"Endding site:");
if(startorend==0)
{
mysite[1]=mykey;
startorend=1;
key = 111;
}else
{
mysite[0]=mykey;
LCD_Clear(WHITE);
temp=dijkstra(mysite[1],mysite[0]);
sitenum=returnmax(temp);
key = 111;
}
break;
case 194:
LCD_ShowString(150,240, "RIGHT ");
break;
case 34:
LCD_ShowString(150,240, "LEFT ");
break;
case 224:
LCD_ShowString(150,240, "VOL- ");
break;
case 168:
LCD_ShowString(150,240, "DOWN ");
break;
case 144:
LCD_ShowString(150,240, "VOL+ ");
break;
case 82:
LCD_ShowString(150,240, "DELETE");
break;
}
switch(key)
{
case 56:key=8;break;
case 104:key=1;break;
case 152:key=2;break;
case 176:key=3;break;
case 48 :key=4;break;
case 24 :key=5;break;
case 122:key=6;break;
case 16 :key=7;break;
case 90 :key=9;break;
case 66 :key=0;break;
}
switch(key)
{
case 1:
case 0:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
if(flag==0) //如果是十位
{
keynumshi=key;
key=111;
flag=1;
if(startorend==0) //如果是开始站点
{
LCD_ShowNum(130,250,keynumshi,1,16);
}else //如果是结束站点
{
LCD_ShowNum(130,270,keynumshi,1,16);
}
}else //如果是各位
{
keynumge=key;
key=111;
flag=0;
if(startorend==0)
{
LCD_ShowNum(138,250,keynumge,1,16);
}else
{
LCD_ShowNum(138,270,keynumge,1,16);
}
}
mykey = keynumshi*10 + keynumge;
break;
}
}
endsecond = totalsecond(timer.hour,timer.min,timer.sec);
if(play == 1)
{
InsertList(L_Play,0,1); //链表的建立
InsertList(L_Play,1,2);
LCD_ShowNum(100,200,printList(L_Play,0),1,16);
L_Play=L_Play->next;
LCD_ShowNum(100,220,printList(L_Play,1),1,16);
InsertList(L_Pulse,0,1);
InsertList(L_Pulse,1,2);
LCD_ShowNum(110,200,printList(L_Pulse,0),1,16);
L_Pulse=L_Pulse->next;
LCD_ShowNum(110,220,printList(L_Pulse,1),1,16);
// LCD_Show2Num(180,10,playtotaltime + endsecond - printList(L_Play,K_Play-1),4,16,0);
}else if(play == 2)
{
//LCD_Show2Num(180,10,pulsetotaltime + endsecond - printList(L_Pulse,K_Pulse-1),4,16,0);
}
}
}
为什么那个InsertList放在开头处,单片机正常运行,可是放在遥控的键值处理处却死机,每插入一个数就死机 |