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

📄 mmi.c

📁 《时间触发嵌入式系统设计模式》一书中的合作式调度器的算法
💻 C
字号:
/*--------------------------------------------------------------------*-

	MMI.C (V1.00)

	 
-*---------------------------------------------------------------------*/

/*
 * Copyright (c) 2006,wsl
 * All rights reserved
 * 
 * 文件名称: MMI.C 
 * 文件标识: 
 * 摘	 要: 人机接口
 * 
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
 */
 //***********************************************************************
 
#include"main.H"
#include"Port.H"
#include"MMI.h"
#include"SCH51.H"
#include"Uart.h"




/*实时时间*/ 
time_str now={17,56,50};

alarm_str Ring[MAX_RING_NUMBER];
/*打铃标记D0 ~ D7*/
unsigned char RingIDRegister = 0;
/*备份打铃标记,24小时后在时钟函数中恢复*/	
unsigned char BackupRingID = 0;


/*-----------------------------------------------------------------------*-
 * 函数名称: FLASH_LED()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 闪烁灯,作为系统指示
 *              
 * 说     明: 
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void FLASH_LED(void)
{
	D1 = ~D1;
}

 /*-----------------------------------------------------------------------*-
 * 函数名称: OpenBuzzer()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 打开蜂鸣器
 *              
 * 说     明: 
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void OpenBuzzer(void)
{
	BUZZER = 0;
	D2 = 0;
}
 /*-----------------------------------------------------------------------*-
 * 函数名称: CloseBuzzer()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 关闭蜂鸣器
 *              
 * 说     明: 
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void CloseBuzzer(void)
{
	BUZZER = 1;
	D2 = 1;
}
 
 /*-----------------------------------------------------------------------*-
 * 函数名称: RTC_Soft_clock()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 走时时钟
 *              
 * 说     明: 
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void RTC_Soft_clock(void)
{
	now.sec++;	
	if (now.sec > 59)
	{
		now.sec = 0;	/*一秒钟*/
		now.min++;
		if (now.min > 59)
		{
			now.min = 0;	/*一分钟*/
			now.hour++;

			if (now.hour > 23)
			{
				now.hour = 0;	/*一小时*/
				RingIDRegister = BackupRingID;	/*恢复打铃点*/
			}
		}
	}
}
 /*-----------------------------------------------------------------------*-
 * 函数名称: SetRing()
 * 参    数: 时,分和第几个打铃点
 * 返    回: 打铃点位数
 * 函数功能: 设置打铃点(最大8个)
 *              
 * 说     明: : 2005.6.2 by wangsw
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
#if 0
unsigned char SetRing(const unsigned char hour, const unsigned char min)
{
	unsigned char i;
	for (i=0; i<MAX_RING_NUMBER; i++)
	{
		if(!GETBIT(RingIDRegister, i))
		{
			SETBIT(RingIDRegister, i);	/*设置打铃标记*/
			SETBIT(BackupRingID, i);	/*备份打铃标记*/
			Ring[i].hour = hour;
			Ring[i].min = min;
			return (i+1);	/*主要是C语言变量从0开始*/
		}
	}
	// 否则返回错误
}
#endif
unsigned char SetRing(const unsigned char hour, const unsigned char min, const unsigned char AlarmCnt)
{
	if (AlarmCnt < MAX_RING_NUMBER)
	{
		SETBIT(RingIDRegister, AlarmCnt);	/*设置打铃标记*/
		SETBIT(BackupRingID, AlarmCnt);	/*备份打铃标记*/
		Ring[AlarmCnt].hour = hour;
		Ring[AlarmCnt].min = min;
		return (AlarmCnt);	/*主要是C语言变量从0开始*/
	}
}
 /*-----------------------------------------------------------------------*-
 * 函数名称: RingStop()
 * 参    数: 打铃点
 * 返    回: XX
 * 函数功能: 删除打铃点(最大<8),但并不删除备份打铃标记
 *              
 * 说     明: : 2005.6.2 by wangsw
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void RingStop(const unsigned char val)
{
	if(val < MAX_RING_NUMBER)
	{
		RESETBIT(RingIDRegister, val);
	}
	else
	{
	//	ERRprintf("RingStop\n");
	}
}
 /*-----------------------------------------------------------------------*-
 * 函数名称: RingGetID()
 * 参    数: XX
 * 返    回: return ID
 * 函数功能: GetID(获取打铃点个数)
 *              
 * 说     明: : 2005.6.2 by wangsw
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
unsigned char RingGetID(void)
{
	unsigned char i;
	for(i = 0; i < MAX_RING_NUMBER; i++)
	{
		if(!GETBIT(RingIDRegister, i))
		{
			return(i);
		}
	}
	
	return(0);
}
 /*-----------------------------------------------------------------------*-
 * 函数名称: Ring_server()
 * 参    数: XX
 * 返    回: XX
 * 函数功能: 打铃服务程序
 *              
 * 说     明: : 2005.6.2 by wangsw
 *
 * 当前版本: V1.0               * 取代版本:
 * 作     者: wsl            * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void Ring_server(void)
{
	unsigned char i = 0;
	unsigned char hour, min;
	unsigned char RingIDRegisterMap;
	RingIDRegisterMap = RingIDRegister;
	
	while(RingIDRegisterMap)
	{
		if((RingIDRegisterMap & 0x01) == 1)
		{
			hour = now.hour/10;
			hour = (hour<<4) | (now.hour%10);
			min  = now.min/10;
			min  = (min<<4) | (now.min%10);
			/*实时时间与设置的打铃点时间相同*/
			if( (Ring[i].hour == hour) && (Ring[i].min == min) )
			{
				OpenBuzzer();							/*响铃*/
				SCH_Add_Task(CloseBuzzer, 12000, 0);	/*一分钟后关闭*/
				/*铃声响过后,在此删除此打铃点,24小时后从新恢复*/
				RingStop(i);							
			}
		}
		RingIDRegisterMap = RingIDRegisterMap >> 1;
		i++;
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -