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

📄 main.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
字号:
//=========================================================================================
//作    者:桂林电子工业学院 刘涛 朱剑芳 林嘉源
//题    目:单工无线呼叫系统
//备    注:系统从机程序
//         2005年全国大学生电子竞赛
//=========================================================================================
#include "Global.h"
#include "Interface.h"

#define SPEECH_CTRL	BIT0

unsigned int gFlag;
unsigned int gStatus;
unsigned char gMSG;
char gSMSBuff[256];
int gSMSCount;
unsigned char gDataBuff[16];
int gDataCount;
int gCurDataPos;
int gCurDataPos2;
unsigned char gLocalAddr;
unsigned char gCompBuff[560];
unsigned char gCursorX;
unsigned char gCursorY;

void SetClock(unsigned int fosc,unsigned int DivRiteForCUP);
void System_Init();
void InitTimerAndInt();
void Dispatch();
void ShowMenu();
void ShowAddr();

//=========================================================================================
//主函数
//=========================================================================================
int main()
{
	unsigned int tmp;
	System_Init();
	__asm("irq on");//开中断

	while(1)
	{
		switch(gStatus)
		{
			case STAT_IDLE: 
				if(gFlag & REV_MSG_OK)
				{
					//分析协议
					Dispatch();
					gFlag &= (~REV_MSG_OK);
				}
				else
				{
					tmp = ((*P_IOB_Data)&0xF0)>>4;		//读取地址,更新
					if(tmp != gLocalAddr)
					{
						gLocalAddr = tmp;
						ShowAddr();
					}
				}
				break;
			case STAT_SPEECH:
				if(gFlag & REV_MSG_OK)
				{
					//分析协议
					Dispatch();
					gFlag &= (~REV_MSG_OK);
				}
				break;
			case STAT_DATA:
				if(gFlag & REV_MSG_OK)
				{
					//分析协议
					Dispatch();
					gFlag &= (~REV_MSG_OK);
				}
				else if(gFlag & REV_MSG_BAD)
				{
					//给出用户一个提示信号
				}
				break;
			case STAT_MODE:
				if(gFlag & REV_MSG_OK)
				{
					//分析协议
					Dispatch();
					gFlag &= (~REV_MSG_OK);
				}
				break;
			case STAT_ERROR:
				//Rescue the system.....
				gFlag &= ~ERROR;
				gStatus = STAT_IDLE;
				break;
			default:
				break;
		}
		if(gDataCount)	//由于数据处理速度不够而遗漏的数据
		{
		}
		
		*P_Watchdog_Clear = 0x0001;
	}
}
//=========================================================================================
//
//=========================================================================================
void System_Init()
{
	int i;
	//初始化系统时钟
	SetClock(49,1);     
	//初始化IO
	SET_PORTA_OUT(0xFFFF); 
	SET_PORTB_IN(0xFFFE);
	SET_PORTB_OUT(SPEECH_CTRL);
	CLR_PORTB(SPEECH_CTRL);
	//初始化中断
	//初始化全局变量
	gFlag = 0;
	gStatus = 0;
	for(i=0;i<256;i++)
		gSMSBuff[i]=0;
	gSMSCount = 0;
	for(i=0;i<16;i++)
		gDataBuff[i]=0;
	gDataCount = 0;
	gCurDataPos2 = 0;
	gMSG = 0;
	for(i=0;i<70;i++)
		gCompBuff[i] = 0;
	//读从机地址
	gLocalAddr = ((*P_IOB_Data)&0xF0)>>4;
	//初始化人机接口设备
	Interface_Init();
	ShowMenu();
	//初始化其他外设,同时读取本机地址
	InitTimerAndInt();		//4K采样率
}
//=========================================================================================
//
//=========================================================================================
void SetClock(unsigned int fosc,unsigned int DivRiteForCUP)
{
  	unsigned int osc,div;
  	switch(fosc)
  	{
		case 24:{osc=0x0000;break;}
		case 20:{osc=0x0020;break;}
    	case 32:{osc=0x0040;break;}
    	case 40:{osc=0x0060;break;}
    	case 49:{osc=0x0080;break;}
  	}
  	switch( DivRiteForCUP)
  	{
    	case 1:{div=0x0008;break;}
    	case 2:{div=0x0009;break;}
    	case 4:{div=0x000A;break;}
    	case 8:{div=0x000B;break;}
    	case 16:{div=0x000C;break;}
    	case 32:{div=0x000D;break;}
    	case 64:{div=0x000E;break;}
  	}
  	osc|=div;
  	*P_SystemClock=osc;
}
//=========================================================================================
//
//=========================================================================================
void InitTimerAndInt()
{
    *P_INT_Ctrl |= C_IRQ3_EXT2;
}
//=========================================================================================
//
//=========================================================================================
void Dispatch()
{
/*	char tmp[2];
	int x,y;
	switch(gStatus)
	{
		case STAT_IDLE:
			if(gDataBuff[gCurDataPos] == gLocalAddr)
			{
				gStatus = STAT_MODE;
				LCD_DrawText("Service Call",8,39,0,1);
			}
			gDataCount --;
			gCurDataPos ++;
			if(gCurDataPos == 16)	//循环使用接收数据缓冲区
				gCurDataPos = 0;
			break;
		case STAT_MODE:
			if(gDataBuff[gCurDataPos] == COMM_SPEECH)
			{
				gStatus = STAT_SPEECH;
				//打开话音信号通路
				CLR_PORTB(SPEECH_CTRL);
				LCD_CLS(0);
				LCD_DrawText("Broadcast",16,26,0,1);
			}
			else if(gDataBuff[gCurDataPos] == COMM_DATA)
				gStatus = STAT_DATA;
			gDataCount --;
			gCurDataPos ++;
			if(gCurDataPos == 16)	//循环使用接收数据缓冲区
				gCurDataPos = 0;
			break;
		case STAT_SPEECH:
			if(gDataCount==0)break;
			if(gDataBuff[gCurDataPos] == COMM_STOP)
			{
				gStatus = STAT_IDLE;
				//关闭话音信号通路
				SET_PORTB(SPEECH_CTRL);
				ShowMenu();
			}
			gDataCount --;
			gCurDataPos ++;
			if(gCurDataPos == 16)	//循环使用接收数据缓冲区
				gCurDataPos = 0;
			break;
		case STAT_DATA:
			if(gDataCount==0)break;
			if(gDataBuff[gCurDataPos] == COMM_STOP)
			{
				gStatus = STAT_IDLE;
				ShowMenu();
			}
			else
			{
				if((gDataBuff[gCurDataPos]<='~')||(gDataBuff[gCurDataPos]>=' '))
				{
					//显示
					gSMSBuff[gSMSCount++] = gDataBuff[gCurDataPos];
					tmp[1] = 0;
					tmp[0] = gDataBuff[gCurDataPos++];
					gDataCount --;
					x = (gSMSCount%16)*8;
					y = (gSMSCount/16)*13;
					LCD_DrawText(tmp,x,y,1,0);
				}
				else
				{
					//显示其ASIC值
				}
			}
			gDataCount --;
			gCurDataPos ++;
			if(gCurDataPos == 16)	//循环使用接收数据缓冲区
				gCurDataPos = 0;
			break;
		default:
			break;
	}
*/
	char hh[2];
	hh[0] = gMSG;
	hh[1] = 0;
	LCD_DrawText(hh,gCurDataPos*8,0,1,0);
}
//=========================================================================================
//
//=========================================================================================
void ShowMenu()
{
	int i,j;
	LCD_CLS(0xFF);
	for(i=0;i<1000;i++)
	{
		for(j=0;j<200;j++);
		*P_Watchdog_Clear = 0x0001;
	}
	LCD_CLS(0);
	for(i=0;i<1000;i++)
	{
		for(j=0;j<200;j++);
		*P_Watchdog_Clear = 0x0001;
	}
	ShowAddr();
	LCD_Line(0,25,127,25,1);
	LCD_DrawText("Waitting...",8,39,1,0);
}
//=========================================================================================
//
//=========================================================================================
void ShowAddr()
{
	char addr[9];
	unsigned char i,j;
	addr[8] = 0;
	addr[0] = 'N';
	addr[1] = 'o';
	addr[2] = '.';
	addr[3] = '1';
	j = 0x08;
	for(i=0;i<4;i++)
	{
		addr[4+i]=(gLocalAddr&j)?'1':'0';
		j >>= 1;
	}
	*P_Watchdog_Clear = 0x0001;
	LCD_DrawText(addr,40,13,1,0);
}

⌨️ 快捷键说明

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