⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 C8051F020单片机开发板演示程序
💻 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 + -