📄 main.c
字号:
IO0CLR = 0X04 << 24; //le 1
IO1PIN = IO1PIN & 0XFFF0FFFF | (0x08 << 16);
IO0SET = 0X04 << 24;
IO0CLR = 0X08 << 24; //le 2
IO1PIN = IO1PIN & 0XFFF0FFFF | (0x08 << 16);
IO0SET = 0X08 << 24;
} else {
flgs.state = 0;
if (warn_info & 0x80){ //从跳频变成定频,恢复跳频前的频道
fre_value = back.ffre;
////CtrlOut(0x03);
LedRefresh(0x03);
}
warn_info &= 0x7f;
}
}
/*********************************************************************************************************
** 函数名称: WarnInfo
** 功能描述: 告警信息采集及处理 P0.18:0.20--->tm,vswr,ld
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年11月28日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void WarnInfo(void){
INT8U temp[5];
INT16U wcrc;
temp[0] = (IO0PIN & 0X001C0000) >> 18;
temp[1] = (warn_info & 0x7f) ^ temp[0];
if (temp[1] != 0x00 ){
warn_info = warn_info & 0x80 | temp[0];
if (temp[0] == 0x04) {
flgs.warn = 0;
temp[2] = 0x40 | fre_value;
pow_value = back.ppow;
CtrlOut(0x0f);
LedRefresh(0x0f);
} else {
flgs.warn = 1;
temp[2] = 0xc0 | fre_value;
pow_value = 0x01;
CtrlOut(0x0f);
LedRefresh(0x0f);
}
temp[0] = 0x01;
temp[1] = 0x0b;
wcrc = GetCRC16(temp, 3);
temp[3] = (INT8U)((wcrc & 0xff00) >> 8);
temp[4] = (INT8U)(wcrc & 0x00ff);
OSMboxPost(SendMbox, (void *)temp);
}
}
/*********************************************************************************************************
** 函数名称: InfoGather
** 功能描述: 告警,键盘信息采集
** 输 入: pdata
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InfoGather(void *pdata){
pdata = pdata;
while (1) {
FreConverInfo(); //定频,跳频检测 P0.22
WarnInfo(); //告警检测
KeyInfo(); //键盘信息采集
}
}
/*********************************************************************************************************
** 函数名称: KeyInfo
** 功能描述: 键盘信息采集及处理
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年11月27日
** 描 述: 增加防干扰措施,及调整按键时间
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void KeyInfo(void){
INT8U ktemp[2] ;
//INT32U ktemp3;
if (!flgs.state){ //处于定频状态?
IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16);
IO1CLR = 0Xf0 << 16;
IO1DIR = IO1DIR & 0xff0fffff | (0X30 << 16); //p1.20:21 are used as output port
IO1SET = 0X30 << 16;
OSTimeDly(2);
ktemp[0] = (IO1PIN & (0Xc0 << 16)) >> 16;
if ((ktemp[0] != 0XC0) && (ktemp[0] != 0X00)) {
IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16);
IO1CLR = 0Xf0 << 16;
IO1DIR = IO1DIR & 0xff0fffff | (0X30 << 16); //p1.20:21 are used as output port
IO1SET = 0X30 << 16;
OSTimeDly(20);
ktemp[0] = (IO1PIN & (0Xc0 << 16)) >> 20;
IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16);
IO1CLR = 0Xf0 << 16;
IO1DIR = IO1DIR & 0xff0fffff | (0Xc0 << 16); //p1.20:21 are used as output port
IO1SET = 0Xc0 << 16;
OSTimeDly(10);
ktemp[0] |= (IO1PIN & (0X30 << 16)) >> 20;
flgs.key = (ktemp[0] == 0X00) ? 1 : 0; //防干扰
#ifdef __DEBUG //调试信息
UART1Putch(ktemp[0]);
UART1Putch(0XFF);
#endif
while (!flgs.key ){
IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16);
IO1CLR = 0Xf0 << 16;
IO1DIR = IO1DIR & 0xff0fffff | (0X30 << 16); //p1.20:21 are used as output port
IO1SET = 0X30 << 16;
OSTimeDly(10);
ktemp[1] = (IO1PIN & (0Xc0 << 16)) >> 20;
IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16);
IO1CLR = 0Xf0 << 16;
IO1DIR = IO1DIR & 0xff0fffff | (0Xc0 << 16); //p1.20:21 are used as output port
IO1SET = 0Xc0 << 16;
OSTimeDly(10);
ktemp[1] |= (IO1PIN & (0X30 << 16)) >> 20;
#ifdef __DEBUG //调试信息
UART1Putch(ktemp[1]);
UART1Putch(0X0F);
#endif
flgs.key = (ktemp[1] == ktemp[0]) ? 0:1 ;
KeyDecode(ktemp[0]);
if (flgs.key) {
flgs.key = 0;
break;
}
else
{
OSTimeDly(20); //100ms
}
}
}
}
}
/*********************************************************************************************************
** 函数名称: KeyDecode
** 功能描述: 键盘解码
** 输 入: key_value :采集到的键盘编码
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void KeyDecode(INT8U key_value){
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
switch (key_value){
case 0x09 : { //fre up
flgs.fre = 1;
fre_value = (fre_value >= 0x29) ? 0x01 : (fre_value + 1);
LedRefresh(0x03);
break;
}
case 0x06 : { //fre down
flgs.fre = 1;
fre_value = (fre_value <= 0x01) ? 0x29 : (fre_value - 1);
LedRefresh(0x03);
break;
}
case 0x0b : {
flgs.test_change = 1;
break;
}
case 0x05 : { //pow up
if (!flgs.test && !flgs.warn) {
flgs.pow=1;
pow_value = (pow_value >= 0x04) ? 0x01 : (pow_value + 1);
LedRefresh(0x0f);
}
break;
}
case 0x0a : { //pow down
if (!flgs.test && !flgs.warn) {
flgs.pow=1;
pow_value = (pow_value == 0x01) ? 0x04 : (pow_value - 1);
LedRefresh(0x0f);
}
break;
}
default: break;
}
OS_EXIT_CRITICAL();
if (flgs.key)
{
FrePowChange();
}
}
/*********************************************************************************************************
** 函数名称: fre_pow_change
** 功能描述: 更新设备状态
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年12月08日
** 备 注:消除键盘误动作
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FrePowChange(void){
INT8U temp[5],i;
INT16U fcrc;
if (flgs.fre){
flgs.fre = 0;
flgs.change = 1;
back.ffre = fre_value;
//CtrlOut(0x03);
temp[0] = FreSaveAddr;
temp[1] = fre_value;
temp[2] = (INT8U)I2cWrite(CAT1025, temp, 2); //保存频率值
temp[0] = 0x01;
temp[1] = 0x0b;
temp[2] = flgs.warn ? (0xc0 | fre_value) : (0x40 | fre_value);
}
if (flgs.pow){
flgs.pow = 0;
flgs.change = 1;
back.ppow = pow_value;
CtrlOut(0x0f);
temp[0] = PowSaveAddr;
temp[1] = pow_value;
temp[2] = (INT8U)I2cWrite(CAT1025, temp, 2); //保存功率值
temp[0] = 0x01;
temp[1] = 0x0b;
temp[2] = pow_value;
}
if (flgs.test_change){
flgs.test_change = 0;
flgs.change = 1;
flgs.test = ~flgs.test;
if (flgs.test){ //test
test_value = 0xf1;
test_on();
pow_value = 0x01;
} else {
test_value = 0xf2;
test_off();
pow_value = back.ppow;
}
CtrlOut(0x0f);
LedRefresh(0x0f);
temp[0]=0x01;
temp[1]=0x0c;
temp[2]=test_value;
}
if (flgs.change)
{
flgs.change = 0;
fcrc = GetCRC16(temp, 3);
temp[3] = (INT8U)((fcrc & 0xff00) >> 8);
temp[4] = (INT8U)(fcrc & 0x00ff);
UART1Putch(0xb0);
for (i=0; i<5; i++) UART1Putch(temp[i]);
OSMboxPost(SendMbox, (void *)temp);
}
}
/*********************************************************************************************************
** 函数名称: CtrlOut
** 功能描述: 输出控制字
** 输 入: 控制字类别
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CtrlOut(INT8U ctrl_no){
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
if (ctrl_no == 0x03){ //fre
IO0PIN = IO0PIN & 0XFFFF00FF |(fre_value << 8);
}
if (ctrl_no == 0x0f){ //pow
IO0PIN = IO0PIN & 0XFFFCFFFF |((pow_value -1) << 16);
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: LedRefresh
** 功能描述: 更新8字管状态
** 输 入: 更新类别
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LedRefresh(INT8U fresh_no){
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
if (fresh_no == 0x03) {
fre.h = fre_value /10;
fre.l = fre_value %10;
IO0CLR = 0X04 << 24; //le 1
IO1PIN = IO1PIN & 0XFFF0FFFF | (fre.h << 16);
IO0SET = 0X04 << 24;
IO0CLR = 0X08 << 24; //le 2
IO1PIN = IO1PIN & 0XFFF0FFFF | (fre.l << 16);
IO0SET = 0X08 << 24;
}
if (fresh_no == 0x0f) {
IO0CLR = 0X10 << 24; //le 3
IO1PIN = IO1PIN & 0XFFF0FFFF;
IO0SET = 0X10 << 24;
IO0CLR = 0X20 << 24; //le 4
IO1PIN = IO1PIN & 0XFFF0FFFF | (pow_value << 16);
IO0SET = 0X20 << 24;
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: Eint3Exception
** 功能描述: 外部中断3服务程序
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Eint3Exception(void){
if(flgs.state){
OSSemPost(FreSem);
}
EXTINT = 0X08;
VICVectAddr = 0 ;
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main (void){
OSInit();
OSTaskCreate(FreConversion, (void *)0, &FreConversionStk[TASK_STK_SIZE - 1], 2);
OSTaskCreate(SendData, (void *)0, &SendDataStk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(ReceData, (void *)0, &ReceDataStk[2*TASK_STK_SIZE - 1], 4);
OSTaskCreate(Each10sComm, (void *)0, &Each10sCommStk[TASK_STK_SIZE - 1], 5);
OSTaskCreate(InfoGather, (void *)0, &InfoGatherStk[TASK_STK_SIZE - 1], 6);
OSStart();
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -