📄 main_1205.c
字号:
#include "RS232.h"
#include "KeyPad.h"
#include "LCD.h"
#include "44b.h"
//////////////////////////////////
void Test_LowPwr(void)
{
//Mode_LowPwr();
}
/////////////////////////////////
void Test_RS232(void)
{
int Msg = 32;
RS232_open(115200l,COM_8BIT|COM_NOPARITY|STOP_1BIT);
while( Msg < 128 )
{
RS232_send_char( Msg );
Msg++;
}
}
#define RX_FRAME_START 0x00
#define RX_FRAME_LENGTH 0xF1
#define RX_FRAME_DATA 0xF2
#define RX_FRAME_CRC 0xF3
#define RX_FRAME_END 0xF4
#define RX_FRAME_OK 0xF5
#define RX_BUF_NULL 0x00
#define RX_BUF_OK 0xB1
#define RX_BUF_READING 0xB2
#define COM_TIMER_MAX 3000
struct RS232_STRUCT{
unsigned char Active;
unsigned char State;
unsigned char BufState;
unsigned int Timer;
unsigned int Position;
unsigned char TmpBuf[16];
unsigned char Msg[2048];
unsigned char Data[2048];
};
struct RS232_STRUCT RS232_inf;
unsigned char RS232_FrameBuf[2048];
volatile unsigned int RS232_Timer;
volatile unsigned int RS232_Count;
void RS232_RxScan(unsigned char Count)
{
unsigned int i,length;
if(Count > 16){
RS232_inf.State = RX_FRAME_START;
return;
}
//RS232_send_char(0xAA); //----For test
//RS232_send_char(0x55);
//for(i=0;i<Count;i++) RS232_send_char( RS232_inf.TmpBuf[i] );
i = 0;
while( Count > i )
{
switch( RS232_inf.State )
{
//---------------------
case RX_FRAME_START:
{
for( ; i<Count; i++)
{
if( RS232_inf.TmpBuf[i] == 0x7E){
RS232_inf.Msg[0] = 0x7E;
RS232_inf.Position = 1;
RS232_inf.State = RX_FRAME_LENGTH;
i++;
break;
}
}
break;
}
//---------------------
case RX_FRAME_LENGTH:
{
if( RS232_inf.Position == 1 ){
if( RS232_inf.TmpBuf[i] == 0x4B){
if( RS232_inf.BufState != RX_BUF_READING ){
RS232_inf.Data[0] = 0x7E;
RS232_inf.Data[1] = 0x4B;
RS232_inf.BufState = RX_BUF_OK;
}
RS232_inf.State = RX_FRAME_START;
i = Count + 1;
}else{
RS232_inf.Msg[1] = RS232_inf.TmpBuf[i];
RS232_inf.Position = 2;
i++;
}
}else if( RS232_inf.Position == 2 ){
RS232_inf.Msg[2] = RS232_inf.TmpBuf[i];
if( ( ((unsigned int)(RS232_inf.Msg[1])<<8)+RS232_inf.Msg[2])<2040 ){
RS232_inf.State = RX_FRAME_DATA;
RS232_inf.Position = 3;
i++;
//RS232_send_char(0xaa); //For test
}else{
RS232_inf.State = RX_FRAME_START;
}
}else{
RS232_inf.State = RX_FRAME_START;
}
break;
}
//---------------------
case RX_FRAME_DATA:
{
length = ((unsigned int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2];
for( ; i<Count; )
{
if( (RS232_inf.Position-3) < length ){
RS232_inf.Msg[RS232_inf.Position] = RS232_inf.TmpBuf[i];
RS232_inf.Position += 1;
i++;
}else{
RS232_inf.State = RX_FRAME_CRC;
//RS232_send_char(0xbb); //For test
//RS232_send_char( (RS232_inf.Position)>>8 );
//RS232_send_char( i );
//RS232_send_char( RS232_inf.Position );
//RS232_send_char( length );
break;
}
}
break;
}
//---------------------
case RX_FRAME_CRC:
{
if( RS232_inf.Position == ( ((int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2] +3) ){
RS232_inf.Msg[RS232_inf.Position] = RS232_inf.TmpBuf[i];
RS232_inf.Position += 1;
i++;
//RS232_send_char( (RS232_inf.Position)>>8 ); //For test
//RS232_send_char( RS232_inf.Position );
//RS232_send_char(0xc1); //For test
}else if( RS232_inf.Position == ( ((int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2] +4) ){
RS232_inf.Msg[RS232_inf.Position] = RS232_inf.TmpBuf[i];
RS232_inf.Position += 1;
RS232_inf.State = RX_FRAME_END;
i++;
//RS232_send_char(0xcc); //For test
//RS232_send_char( i );
//RS232_send_char( RS232_inf.TmpBuf[i] );
}else{
RS232_inf.State = RX_FRAME_START;
//RS232_send_char(0xc0); //For test
}
break;
}
//---------------------
case RX_FRAME_END:
{
if( RS232_inf.Position == ( ((int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2] +5) )
{
if(RS232_inf.TmpBuf[i] == 0x7E){
RS232_inf.Msg[ RS232_inf.Position ] = 0x7E;
if( RS232_inf.BufState != RX_BUF_READING ){
for( i=0; i<=RS232_inf.Position; i++)
RS232_inf.Data[i] = RS232_inf.Msg[i];
RS232_inf.BufState = RX_BUF_OK;
//RS232_send_char(0xee); //For test
}
RS232_inf.State = RX_FRAME_START;
i = Count + 1; //----To Exit,
//since every frame is tragged by 'PC';
//RS232_send_char(0xdd); //For test
}else{
RS232_inf.State = RX_FRAME_START;
}
}else{
RS232_inf.State = RX_FRAME_START;
}
i++;
break;
}
//-------------------
default:
{
RS232_inf.State = RX_FRAME_START;
i = Count + 1; //----To Exit;
break;
}
}
}
}
void __irq ISR_RS232_Rx(void)
{
unsigned char i;
rI_ISPC = BIT_URXD1;
if(rUFSTAT1 & 0xf){
RS232_Timer = 0;
i = 0;
while( (rUFSTAT1&0xf) >0 )
{
RS232_inf.TmpBuf[ i++ ] = rURXH1;
if(i >= 15){ break;}
}
RS232_RxScan(i);
}
}
//=============================
int RS232_init(unsigned int baud, unsigned int mode)
{
rCLKCON |= (1<<9);
rPCONC |= 0x0f000000;
rPDATC |= 0x4000;
RS232_Timer = 0;
RS232_Count = 0;
RS232_inf.Position = 0;
RS232_inf.Timer = 0;
RS232_inf.State = RX_FRAME_START;
RS232_inf.BufState = RX_BUF_NULL;
pISR_URXD1=(unsigned)ISR_RS232_Rx;
rUBRDIV1= ( (int)(MCLK/(16*baud) + 0.5) -1 );
//rUFCON1 = 0xf7; // Reset FIFO
//rUFCON1 = 0x00;
rUFCON1 = (1<<4) | (3<<1) | 1;
rUMCON1 = 0x0;
rULCON1 = mode; //
//rUCON1 = 0x245;
//rUCON1 = 0x05;
rUCON1 = 0x285;
rINTMSK=~(BIT_GLOBAL|BIT_URXD1);
//rUBRDIV1=((mul_div(MCLK,2,baud<<4)+1)>>1)-1;//
//rUBRDIV1= ( (int)(MCLK/(16*baud) + 0.5) -1 );
//rUFCON1 = 0xf1; // normal FIFO
//while(1);
return 0;
}
////////////////////////////////
volatile unsigned int Key_Flag;
volatile unsigned int Key_Buf;
volatile unsigned int Timer_Count;
volatile unsigned int Key_Time;
volatile unsigned int Com_Time;
extern struct KEY_struct KEY_inf;
extern void Key_scan();
void __irq Timer5Done(void)
{
rI_ISPC |= BIT_TIMER5;
Timer_Count++;
//RS232_send_char(variable);
//rPDATE ^= (1<<3);
//===== KeyPad scan =====
if( KEY_inf.Work ){
KEY_inf.Timer++;
if(KEY_inf.Timer > KEY_TIMER_MAX){
KEY_inf.Timer = 0;
Key_scan();
}
}
//===== Com Timer =====
if( RS232_inf.State != RX_FRAME_START ){
RS232_inf.Timer++;
if(RS232_inf.Timer > COM_TIMER_MAX){
RS232_inf.Timer = 0;
RS232_inf.State = RX_FRAME_START;
}
}
}
void Timer5_init(void)
{
rINTMSK |= BIT_TIMER5;
Timer_Count = 0;
pISR_TIMER5=(int)Timer5Done;
// rINTMSK=~(BIT_GLOBAL|BIT_TIMER5);
// pISR_TIMER5=(int)Timer5Done;
rPCONE = ( rPCONE & (~(3<<6)) ) | ( (0x1)<<6 );
rPDATE &= ~(1<<3);
//rTCFG0 = 0xf0f0f;
//rTCFG1 = 0x01234;
rCLKCON |= 1<<3;
rTCFG0 &= 0x0000FFFF;
rTCFG1 &= 0x000FFFFF;
rTCFG1 |= 0x3<<20;
//rTCNTB5=0xffff;
rTCNTB5 = ( MCLK )/(1000*16);
//rTCON=0x2222202;
//rTCON=0x5999901;
rTCON = 0x2<<24;
rTCON = 0x5<<24;
rINTMSK &= ~(BIT_GLOBAL|BIT_TIMER5);
//while(1);
//rINTMSK=BIT_GLOBAL;
}
///////////////////////////////
void Test_KeyPad(void)
{
Key_open();
Timer5_init();
while(1){
if(KEY_inf.Value != 0){
RS232_send_char(KEY_inf.Value);
KEY_inf.Value = 0;
}
}
}
//////////////////////
unsigned short Crc16_check(unsigned char *Dat, unsigned int Length)
{
unsigned short Crc;
int i;
Crc =0;
for(i=0; i<Length; i++)
{
Crc = (unsigned char)(Crc >> 8) | (Crc << 8);
Crc ^= Dat[i];
Crc ^= (unsigned char)(Crc & 0xff) >> 4;
Crc ^= (Crc << 8) << 4;
Crc ^= ((Crc & 0xff) << 4) << 1;
}
return Crc;
}
int RS232_frame_get(void)
{
unsigned int i,length;
unsigned short crc;
i = 0;
if( RS232_inf.BufState == RX_BUF_OK )
{
RS232_inf.BufState = RX_BUF_READING;
if( RS232_inf.Data[1] == 0x4B ){
RS232_FrameBuf[0] = 0x4B;
i = 1;
}else{
length = ( (unsigned int)(RS232_inf.Data[1]) << 8 ) + RS232_inf.Data[2];
if( length < 2040){
for(i=0; i<length; i++) {RS232_FrameBuf[i] = RS232_inf.Data[i+3];}
crc = Crc16_check( RS232_FrameBuf, length);
if( crc != ( ((unsigned short)(RS232_inf.Data[length+3])<<8) + RS232_inf.Data[length+4]) )
{ i = 0; }
}else{
i = 0;
}
}
RS232_inf.BufState = RX_BUF_NULL;
}
return i;
}
void Test_Com(void)
{
int num;
int i;
while(1)
{
num = RS232_frame_get();
if( num ){
for(i=0;i<num;i++) { RS232_send_char( RS232_FrameBuf[i] ); }
}
}
}
///////////////////////////////
int Main(void)
{
unsigned char k;
StartTest:
//RS232_open(115200,COM_8BIT|COM_NOPARITY|STOP_1BIT);
LCD_open();
Key_open();
LCD_clear_screen();
LCD_locate(1,6); LCD_write_string("功能测试",1);
LCD_locate(6,4); LCD_write_string("[1] 中断测试",0);
LCD_locate(8,4); LCD_write_string("[2] 低功耗测试",0);
LCD_locate(10,4); LCD_write_string("[3] 串口测试",0);
//Test_PWM();
//Test_EINT4567();
RS232_init(115200,COM_8BIT|COM_NOPARITY|STOP_1BIT);
Timer5_init();
Test_Com();
k=0;
while(k<'1' || k>'3'){
k = Key_get(1);
}
switch(k)
{
case '1':
//Test_Interrupt();
break;
case '2':
//Test_LowPwr();
break;
case '3':
//Test_RS232();
break;
default:
break;
}
goto StartTest;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -