?? 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
/*****************************************
內置電表通訊
******************************************/
//發(fā)送使能(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發(fā)送使能(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為高阻狀態(tài),0x01為發(fā)送使能,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
}
//文本區(qū)清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收發(fā)使能引腳
****************************************/
enableTxPRG232_dir = OUTPUT;//RS232發(fā)送使能引腳方向
enableTxPRG232_LAT = 0;//關閉RS232發(fā)送功能
enableRxPRG232_dir = OUTPUT;//RS232接收使能引腳方向
enableRxPRG232_LAT = 1;//關閉RS232接收功能
/***************************************
RS485收發(fā)使能引腳
****************************************/
ch0enablesend_dir = OUTPUT;//RS485發(fā)送使能引腳方向
ch0enablesend = 0;//關閉RS485-1發(fā)送功能
ch0enablerec_dir = OUTPUT;//RS485接收使能引腳方向
ch0enablerec_LAT = 1;//關閉RS485-1接收功能
/***************************************
紅外通訊收發(fā)使能引腳
****************************************/
enableTxInfra_dir = OUTPUT;//紅外發(fā)送控制引腳為輸出引腳;
enableTxInfra_LAT = 0;//0關閉紅外發(fā)送,1為打開紅外發(fā)送;
enableRxInfra_dir = OUTPUT;//紅外接收控制引腳為輸出引腳;
enableRxInfra_LAT = 1;//1為關閉紅外接收,0為打開紅外接收;
/***************************************
內置電表通訊收發(fā)使能引腳
****************************************/
enableTxMeter_dir = OUTPUT;
enableTxMeter_LAT = 1;//1為關閉向內置電表發(fā)送數據,0為打開向內置電表發(fā)送數據;
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 + -