📄 comm_test.c
字号:
#include <p33FJ256GP506.h>
#include <stdio.h>
#define FCY 30000000 // xtal = 4.0000Mhz; PLL=50/4 FOSC=50MHZ FCY=FOSC/2
#define MILLISEC FCY/10000 // 1 mSec delay constant
#define UILLISEC FCY/100000 // 100uSec delay constant
#define DELAY 15
#define OUTPUT 0
#define INPUT 1
//UART 校验方式定义
#define PARITY_NONE 0
#define PARITY_EVEN 1
#define PARITY_ODD 2
/*****************************************
内置电表通讯
******************************************/
//发送使能(PIN63-RG12)
#define enableTxMeter PORTGbits.RG12
#define enableTxMeter_LAT LATGbits.LATG12
#define enableTxMeter_dir TRISGbits.TRISG12
//接收使能(PIN23-RB10)
#define enableRxMeter PORTBbits.RB10
#define enableRxMeter_LAT LATBbits.LATB10
#define enableRxMeter_dir TRISBbits.TRISB10
/*****************************************
RS232通讯
******************************************/
//Enable prog232 send(PIN35-RF6)(DE = 1)
#define enableTxPRG232 PORTFbits.RF6
#define enableTxPRG232_LAT LATFbits.LATF6
#define enableTxPRG232_dir TRISFbits.TRISF6
//Enable prog232 rec(PIN36-RG3)(RE = 0)
#define enableRxPRG232 PORTGbits.RG3
#define enableRxPRG232_LAT LATGbits.LATG3
#define enableRxPRG232_dir TRISGbits.TRISG3
/*****************************************
RS485通讯
******************************************/
//CH0发送使能(DE=1)(PIN27-RB12)
#define ch0enablesend PORTBbits.RB12
#define ch0enablesend_LAT LATBbits.LATRB12
#define ch0enablesend_dir TRISBbits.TRISB12
//CH0接收使能(RE=0)(PIN28-RB13)
#define ch0enablerec PORTBbits.RB13
#define ch0enablerec_LAT LATBbits.LATB13
#define ch0enablerec_dir TRISBbits.TRISB13
/*****************************************
红外通讯
******************************************/
//Enable infra send(PIN46-RD0)(DE = 1)
#define enableTxInfra PORTDbits.RD0
#define enableTxInfra_LAT LATDbits.LATD0
#define enableTxInfra_dir TRISDbits.TRISD0
//Enable infra rec(PIN24-RB11)(RE=0)
#define enableRxInfra PORTBbits.RB11
#define enableRxInfra_LAT LATBbits.LATB11
#define enableRxInfra_dir TRISBbits.TRISB11
/*****************************************
LCD显示屏模块
******************************************/
// LCD CS PIN61 RG0
#define CS PORTGbits.RG0
#define CS_LAT LATGbits.LATG0
#define CS_DIR TRISGbits.TRISG0
// LCD WR PIN52 RD4
#define SID PORTDbits.RD4
#define SID_LAT LATDbits.LATD4
#define SID_DIR TRISDbits.TRISD4
// LCD E PIN53 RD5
#define SCK PORTDbits.RD5
#define SCK_LAT LATDbits.LATD5
#define SCK_DIR TRISDbits.TRISD5
//LED扩展芯片片选信号管脚
#define LED_CS PORTGbits.RG6
#define LED_CS_LAT LATGbits.LATG6
#define LED_CS_DIR TRISGbits.TRISG6
//LED扩展芯片时钟信号管脚
#define SPISCK PORTFbits.RF0
#define SPISCK_LAT LATFbits.LATF0
#define SPISCK_dir TRISFbits.TRISF0
//写LED扩展芯片管脚
#define SPISO PORTFbits.RF1
#define SPISO_LAT LATFbits.LATF1
#define SPISO_dir TRISFbits.TRISF1
#define SPISI PORTGbits.RG1
#define SPISI_LAT LATGbits.LATG1
#define SPISI_dir TRISGbits.TRISG1
//FLASH 256K片选信号管脚
#define SPICS_FLASH1 PORTDbits.RD7
#define SPICS_FLASH1_LAT LATDbits.LATD7
#define SPICS_FLASH1_dir TRISDbits.TRISD7
//FLASH 2M片选信号管脚
#define SPICS_FLASH2 PORTDbits.RD6
#define SPICS_FLASH2_LAT LATDbits.LATD6
#define SPICS_FLASH2_dir TRISDbits.TRISD6
typedef struct{
unsigned RSE_485 : 2;
//485控制使能,0x02为高阻状态,0x01为发送使能,0x00为接收使能;
unsigned LCD_K : 1;//LED背光控制
unsigned LED_13 : 1; //从左到右第11个灯
unsigned LED_12 : 1; //从左到右第10个灯
unsigned LED_11 : 1; //从左到右第9个灯
unsigned LED_10 : 1; //从左到右第8个灯
unsigned LED_9 : 1; //从左到右第7个灯
unsigned LED_8 : 1;//从左到右第1个灯
unsigned LED_7: 1; //从左到右第2个灯
unsigned LED_6: 1; //从左到右第3个灯
unsigned LED_5: 1; //从左到右第4个灯
unsigned LED_4: 1; //从左到右第5个灯
unsigned LED_3: 1; //从左到右第6个灯
unsigned LED_2: 1;//GPRS
unsigned LED_1 : 1;//GPRS
} LEDBITS;//LED位域字结构类型
typedef union {
unsigned char port[2];
//定义两个端口,其中port[0]为PORTA,port[1]为PORTB;
LEDBITS led_bits;//定义LED位域字结构;
} LED_CONTROL_WORD;//LED控制字结构类型;
LED_CONTROL_WORD led_control_word;
//定义LED控制字结构;
unsigned char AC_TABLE[] = {
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置
};
unsigned char rx_str[255];
unsigned char i = 0;
void cpu_init(void);
void PutStr(unsigned char row,unsigned char col,unsigned char *puts);
void LcmClearTXT( void );
void LcmInit( void );
void WriteData( unsigned char Dbyte );
void WriteCommand( unsigned char Cbyte );
void SendChar(unsigned char SynChar, unsigned char Mchar, unsigned char Lchar);
void DelayN100uSec(unsigned int N);
void DelayNmSec(unsigned int N);
void led_init(void);
void led_write(unsigned int opcode_add, unsigned char data);
void led_config(void);
void update_to_led(const unsigned char *data);
void UART1_Init(unsigned int baudrate, unsigned char parity_check);
void InitUART2(unsigned int baudrate,unsigned char parity_check);
void CloseUART2(void);
void ConfigIntUART2(void);
void sendcharmeter(unsigned char data);
void enablePRG_232(void);
void enableinfraRed(void);
void enable485Recv(void);
void enable485Send(void);
void enablebuttomcomm(void);
void DMA0_init(void);
void DMA0_start(unsigned int len);
void DMA1_start(unsigned int length);
_FOSCSEL(FNOSC_PRIPLL);// Primary oscillator (XT, HS, EC) w/ PLL
_FOSC(POSCMD_XT & OSCIOFNC_ON & FCKSM_CSDCMD);
_FPOR(FPWRT_PWR128); //Power-on Reset Timer 128ms
_FWDT(FWDTEN_ON & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS32768);//Watchdog timer enabled Prescaler=1:128 Watchdog Timer Postscaler=1:32768
unsigned char DMA_RAM[2048] __attribute__ ((address(0x4000)));
void DelayNmSec(unsigned int N)
{
unsigned int j;
while(N--)
{
ClrWdt();
for(j=0;j < MILLISEC;j++);
}
ClrWdt();
}
void DelayN100uSec(unsigned int N)
{
unsigned int j;
while(N--)
{
ClrWdt();
for(j=0;j < UILLISEC;j++);
}
}
void SendChar(unsigned char SynChar, unsigned char Mchar, unsigned char Lchar)
{
ClrWdt();
unsigned char i;
SCK = 0;
SID = 0;
for(i = 0; i < 8; i++)
{
SID = (SynChar & 0x80) ? 1 : 0; //移出的位给SID
SCK = 0;
SCK=1;
SynChar <<= 1; //左移一位
}
for(i = 0; i < 8; i++)
{
SID = (Mchar & 0x80) ? 1 : 0; //移出的位给SID
SCK = 0;
SCK=1;
Mchar <<= 1; //左移一位
}
for(i = 0; i < 8; i++)
{
SID = (Lchar & 0x80) ? 1 : 0; //移出的位给SID
SCK = 0;
SCK=1;
Lchar <<= 1; //左移一位
}
SCK = 0;
SID = 0;
DelayN100uSec(1);
}
void WriteCommand( unsigned char Cbyte )
{
CS = 1 ;
SendChar(0xf8,0xf0 & Cbyte, 0xf0 & (Cbyte << 4));
CS = 0 ;
}
void WriteData( unsigned char Dbyte )
{
CS = 1;
SendChar(0xfa,0xf0 & Dbyte, 0xf0 & (Dbyte << 4));
CS = 0;
}
void LcmInit( void )
{
CS_DIR = OUTPUT;
CS = 1;
DelayN100uSec(1);
CS = 0;
DelayN100uSec(1);
CS = 1;
DelayN100uSec(2);
CS_DIR = INPUT;
SCK_DIR = OUTPUT;
SCK = 0;
SID_DIR = OUTPUT;
SID = 0;
WriteCommand(0x03) ; //AC归0,不改变DDRAM内容
WriteCommand(0x0C) ; //显示ON,游标OFF,游标位反白OFF
WriteCommand(0x01) ; //清屏,AC归0
}
//文本区清RAM函数
void LcmClearTXT( void )
{
ClrWdt();
unsigned char i ;
WriteCommand(0x30) ; //8BitMCU,基本指令集合
WriteCommand(0x90) ; //AC归起始位
for(i = 0; i < 32; i++)
WriteData(0x20);
WriteCommand(0x88); //AC归起始位
for(i = 0; i < 16; i++)
WriteData(0x20);
}
void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{
ClrWdt();
WriteCommand(0x20); //8BitMCU,基本指令集合
WriteCommand(AC_TABLE[8*row+col]) ; //起始位置
while(*puts != '\0') //判断字符串是否显示完毕
{
if(col==8) //判断换行
{ //若不判断,则自动从第一行到第三行
col=0 ;
row++ ;
}
if(row==4) row=0 ; //一屏显示完,回到屏左上角
WriteCommand(AC_TABLE[8*row+col]) ;
WriteData(*puts) ; //一个汉字要写两次
puts++ ;
WriteData(*puts) ;
puts++ ;
col++ ;
}
// WriteCommand(0x0c) ; //显示ON,游标OFF,游标位反白OFF
}
void cpu_init(void){
/****************************************
时钟频率设置
*****************************************/
CLKDIV=0;// N1 = 2;
CLKDIVbits.PLLPRE=0;//N2 = 2;
PLLFBDbits.PLLDIV=59;//M = 60, set value is (M - 1);
/***************************************
禁止中断嵌套
****************************************/
INTCON1bits.NSTDIS = 0;//禁止中断嵌套;
/***************************************
关闭所有模块功能
****************************************/
PMD1 = 0xffff;
PMD2 = 0xffff;
PMD3 = 0xffff;
PMD1 = 0xff9f;
/***************************************
端口扩展芯片片选引脚
****************************************/
LED_CS_DIR = OUTPUT;//端口扩展芯片片选引脚为输出端口;
LED_CS = 1;//关闭端口扩展芯片;
/***************************************
FLASH存储芯片片选引脚
****************************************/
SPICS_FLASH1_dir = OUTPUT;//flash1(256K)片选管脚方向;
SPICS_FLASH2_dir = OUTPUT;//flash2(2M)片选管脚方向;
/***************************************
FLASH存储芯片和端口扩展芯片复用引脚
****************************************/
SPISCK_dir = OUTPUT;//时钟信号管脚方向;
SPISI_dir = INPUT;//数据读取管脚方向;
SPISO_dir = OUTPUT;//数据写入管脚方向;
/***************************************
RS232收发使能引脚
****************************************/
enableTxPRG232_dir = OUTPUT;//RS232发送使能引脚方向
enableTxPRG232_LAT = 0;//关闭RS232发送功能
enableRxPRG232_dir = OUTPUT;//RS232接收使能引脚方向
enableRxPRG232_LAT = 1;//关闭RS232接收功能
/***************************************
RS485收发使能引脚
****************************************/
ch0enablesend_dir = OUTPUT;//RS485发送使能引脚方向
ch0enablesend = 0;//关闭RS485-1发送功能
ch0enablerec_dir = OUTPUT;//RS485接收使能引脚方向
ch0enablerec_LAT = 1;//关闭RS485-1接收功能
/***************************************
红外通讯收发使能引脚
****************************************/
enableTxInfra_dir = OUTPUT;//红外发送控制引脚为输出引脚;
enableTxInfra_LAT = 0;//0关闭红外发送,1为打开红外发送;
enableRxInfra_dir = OUTPUT;//红外接收控制引脚为输出引脚;
enableRxInfra_LAT = 1;//1为关闭红外接收,0为打开红外接收;
/***************************************
内置电表通讯收发使能引脚
****************************************/
enableTxMeter_dir = OUTPUT;
enableTxMeter_LAT = 1;//1为关闭向内置电表发送数据,0为打开向内置电表发送数据;
enableRxMeter_dir = OUTPUT;
enableRxMeter_LAT = 1;//1为关闭接收内置电表数据,0为打开接收内置电表数据;
}
void led_init(void){
/*********************************
关闭2个FLASH储存器和端口扩展芯片的片选信号;
**********************************/
SPICS_FLASH1 = 1;
LED_CS = 1;
SPICS_FLASH2 = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -