📄 main.c
字号:
/************************************************************************************
* Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* Http: www.mlarm.com
* Email: mlarm@mlarm.com
*
* File name: main.h
*
* Project : ML-F020ICB
* Processor: C8051F020
* Compiler : Keil C51 Compiler
*
* Author: EagleC
* Version: 1.00
* Date: 2007.07.05
* Email:
*
* Description: 本文件是主程序模块,完成系统初始化及程序主循环;
* 功能函数的声明
* Others: none;
*
* Function List:
*
* History:
* 1. Author: Eagle Cao
* Version: 1.00
* Date: 2007.07.05
* Modification: 建立文件
*
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "driver.h"
#include "api.h"
#include "ShowLCD.h"
#include "main.h"
/************************************************************************************/
/************************************************************************************/
// 常量及全局变量定义
unsigned long g_nTimer4s; //定时器4的次数
unsigned char g_bShowRTC; //是否刷新RTC和Tmp
unsigned char g_nOldSecond; //前一秒数值,用于比较秒位是否更新了
RTC_TIME g_stRtctime; //当前RTC
unsigned char g_bItem1Sel; //1级菜单是否被选中
unsigned char g_nItem1Sel; //1级菜单在第几项
unsigned char g_nItem2Sel; //2级菜单在第几项
/************************************************************************************/
/***********************************************************************************
* Function: Sys_Init;
*
* Description: 系统初始化;
*
* Input: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void Sys_Init(void)
{
unsigned char bRTC;
Wachdog_Disable(); // 关闭内部看门狗
Sysclk_Init(); // 系统时钟初始化,使用外部22.1184MHz晶振作为时钟源
SysPort_Init(); // 配置端口初始化
Uart0_Init(0,115200); //Uart0 初始化函数,波特率是115200,使用定时器1作为时钟,允许发送和接收中断
Uart1_Init(0,115200); //Uart1 初始化函数,波特率是115200,使用定时器1作为时钟,允许发送和接收中断
LCDB_Init(240,320); //LCD显示初始化,使用的时320×240的屏
Key_Init(); //键盘初始化
RTC_Init(400000); //RTC初始化,频率为400000。
Timer4_Init(T4_MODE,50); //定时器4初始化。
IO_Init(); //IO端口初始化
IOG_Init(); //隔离IO端口初始化
EEPROM_Init(AT24C02, 400000);//EEPROM初始化,
ADC_Init(); //ADC初始化
DAC0_Init(DAC0_MODE,1000); //DAC0初始化,自动模式,频率1000
DAC1_Init(DAC1_MODE,1000); //DAC1初始化,自动模式,频率1000
EA=0x01; // enable global interrupts
//初次加电时初始化RTC。
EEPROM_Read(0,&bRTC,1);
if(bRTC != 1)
{
g_stRtctime.second = 0;
g_stRtctime.minute = 58;
g_stRtctime.hour = 23;
g_stRtctime.day = 31;
g_stRtctime.week = 1;
g_stRtctime.month = 12;
g_stRtctime.year = 6;
RTC_Write(&g_stRtctime);
bRTC = 1;
EEPROM_Write(0,&bRTC,1);
}
g_nOldSecond = 61;
g_bItem1Sel=0;
g_nItem1Sel=1;
g_nItem2Sel=0;
g_nTimer4s = 0;
g_bShowRTC = 0;
Tmp_Init(); //温度初始化
// EWachdog_Clear(); //外部喂狗
// Delay_s(1); //由于温度初始化比较慢,所以要延时等待
}
/***********************************************************************************
* Function: main;
*
* Description: 主程序模块,完成系统初始化及程序主循环;
*
* Input: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void main(void)
{
unsigned char cmd;
EWachdog_Clear(); //外部喂狗
Sys_Init(); //初始化
CH452_Write(CH452_DIG7 | 8);
CH452_Write(CH452_DIG6 | 8);
CH452_Write(CH452_DIG5 | 8);
CH452_Write(CH452_DIG4 | 8);
CH452_Write(CH452_DIG3 | 8);
CH452_Write(CH452_DIG2 | 8);
CH452_Write(CH452_DIG1 | 8);
CH452_Write(CH452_DIG0 | 8);
LED_Display(1);
ALARM_Ctrl(1);
Delay_ms(200);
ALARM_Ctrl(0);
LED_Display(0);
CH452_Write(CH452_DIG7 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG6 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG5 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG4 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG3 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG2 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG1 | CH452_BCD_SPACE);
CH452_Write(CH452_DIG0 | CH452_BCD_SPACE);
Tmp_Read(); //由于温度初始化比较慢,如不延时则第一次读取的数据很可能不正确。
EWachdog_Clear(); //外部喂狗
ShowMain(); //显示主界面
Timer4_Enable(); //开启定时器4
while(1)
{
EWachdog_Clear(); //外部喂狗
cmd = Key_Read(); //获取命令
if(cmd != CH452_KEY_INVAL)
{
CH452_Write(CH452_DIG7 | cmd/10);
CH452_Write(CH452_DIG6 | cmd%10);
CH452_Write(CH452_DIG5 | cmd/10);
CH452_Write(CH452_DIG4 | cmd%10);
CH452_Write(CH452_DIG3 | cmd/10);
CH452_Write(CH452_DIG2 | cmd%10);
CH452_Write(CH452_DIG1 | cmd/10);
CH452_Write(CH452_DIG0 | cmd%10);
ALARM_Ctrl(1);Delay_ms(20);ALARM_Ctrl(0);
}
switch(cmd) {
case 0x0D: //确认选择
if(g_bItem1Sel) //一级菜单已被选择
{
//根据选择调用不同的测试程序;
SwitchProc(g_nItem1Sel*0x10+g_nItem2Sel);//菜单选择的结果,1级菜单×0x10+2级菜单
}
else
{
if(g_nItem1Sel != MENU1_MAX)
{
g_bItem1Sel = 1;
g_nItem2Sel = 1;
Show_ItemSel();
}
}
break;
case 0x0A: //选择下一个菜单
if(g_bItem1Sel)
{
switch(g_nItem1Sel) {
case 1:
g_nItem2Sel++;
if(g_nItem2Sel > MENU2_1MAXITEM)
{
g_nItem2Sel = MENU2_1MAXITEM;
break;
}
Show_ItemSel();
break;
case 2:
g_nItem2Sel++;
if(g_nItem2Sel > MENU2_2MAXITEM)
{
g_nItem2Sel = MENU2_2MAXITEM;
break;
}
Show_ItemSel();
break;
case 3:
g_nItem2Sel++;
if(g_nItem2Sel > MENU2_3MAXITEM)
{
g_nItem2Sel = MENU2_3MAXITEM;
break;
}
Show_ItemSel();
break;
case 4:
g_nItem2Sel++;
if(g_nItem2Sel > MENU2_4MAXITEM)
{
g_nItem2Sel = MENU2_4MAXITEM;
break;
}
Show_ItemSel();
break;
}
}
else
{
g_nItem1Sel++;
if(g_nItem1Sel > MENU1_MAX)
{
g_nItem1Sel = MENU1_MAX;
break;
}
else
{
Show_Item2();
Show_ItemSel();
}
}
break;
case 0x0B: //选择上一个菜单
if(g_bItem1Sel)
{
if(g_nItem1Sel >= MENU1_MAX || g_nItem1Sel < 1) break;
g_nItem2Sel--;
if(g_nItem2Sel < 1)
{
g_nItem2Sel = 1;
break;
}
Show_ItemSel();
}
else
{
g_nItem1Sel--;
if(g_nItem1Sel < 1)
{
g_nItem1Sel = 1;
break;
}
else
{
Show_Item2();
Show_ItemSel();
}
}
break;
case 0x0E: //显示帮助说明,在主界面里,不论任何时候选择帮助说明,都会放弃以前选择,直接进入到说明界面
if(g_bItem1Sel)
{
g_bItem1Sel = 0;
}
g_nItem1Sel = 4;
Show_Item2();
Show_ItemSel();
break;
case 0x0F:
if(g_bItem1Sel) //若已进入二级菜单则返回到一级菜单
{
g_bItem1Sel = 0;
Show_ItemSel();
}
break;
}
if(g_bShowRTC)
{
RTC_Read(&g_stRtctime);
if(g_nOldSecond != g_stRtctime.second) //秒位更新
{
g_nOldSecond = g_stRtctime.second;
Show_RtcAndTmp(32); //显示实时时间和温度
}
g_bShowRTC = 0;
}
}
}
//根据选择调用不同的测试程序
void SwitchProc(unsigned char nProc)
{
unsigned char bProc=0;
switch(nProc)
{
case 0x11://1 : AD监测
AD_Proc();
bProc = 1;
break;
case 0x12://2 : DA监测
DAC_Proc();
bProc = 1;
break;
case 0x13://3 : IO监测
IO_Proc();
bProc = 1;
break;
case 0x14://4 : 隔离IO监测
bProc = 1;
IOG_Proc();
break;
case 0x21://1 : 参数调整
EEPROM_Proc();
bProc = 1;
break;
case 0x22://2 : 字库下载
Flash_Proc();
bProc = 1;
break;
case 0x23://3 : 时间校准
SetRTC_Proc();
bProc = 1;
break;
case 0x31://1 : EEPROM 自测
TEST_Proc(0);
bProc = 1;
break;
case 0x32://2 : FLASH 自测
TEST_Proc(1);
bProc = 1;
break;
case 0x33://3 : XRAM 自测
TEST_Proc(2);
bProc = 1;
break;
case 0x34://4 : LCD绘图测试
LCDB_Proc();
bProc = 1;
break;
}
if(bProc)
ShowMain();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -