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

📄 comm_test.c

📁 在单片机中
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -