📄 main.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 + -