📄 st16c2552.c
字号:
#include <main.h>
#include "ex.h"
//-----------------------------------------------------------------------------
// A15=1,A14=0
// A0---A0
// A1---A1
// A2---A2
// A3---CHSL(1=LCD,0=PROFIBUS)
// IOPA3---RESET
#define ST16_RESET PADATDIR |= 0x0808
#define ST16_WORK PADATDIR &= ~0x08
ioport U16 port8008;
ioport U16 port8009;
ioport U16 port800a;
ioport U16 port800b;
ioport U16 port800c;
ioport U16 port800d;
ioport U16 port800e;
ioport U16 port800f;
ioport U16 port8000;
ioport U16 port8001;
ioport U16 port8002;
ioport U16 port8003;
ioport U16 port8004;
ioport U16 port8005;
ioport U16 port8006;
ioport U16 port8007;
//-----------------------------------------------------------------------------
#define ST16_LCD_RHR_THR port8008
#define ST16_LCD_IER port8009
#define ST16_LCD_FCR_ISR port800a
#define ST16_LCD_LCR port800b
#define ST16_LCD_MCR port800c
#define ST16_LCD_LSR port800d
#define ST16_LCD_MSR port800e
#define ST16_LCD_SPR port800f
#define ST16_LCD_DLL port8008
#define ST16_LCD_DLM port8009
#define ST16_PRO_RHR_THR port8000
#define ST16_PRO_IER port8001
#define ST16_PRO_FCR_ISR port8002
#define ST16_PRO_LCR port8003
#define ST16_PRO_MCR port8004
#define ST16_PRO_LSR port8005
#define ST16_PRO_MSR port8006
#define ST16_PRO_SPR port8007
#define ST16_PRO_DLL port8000
#define ST16_PRO_DLM port8001
//-----------------------------------------------------------------------------
/*
+------------------------------------------------------------------------------+
函 数 名 : st16_init()
功能描述 : st16c2552的初始化
函数原形 : void st16_init()
参数说明 :
支持资源 :
作 者 : 桂林
最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
void st16_init()//375k-8-N-1
{
ST16_WORK;
ST16_RESET;delay_ms(1);
ST16_WORK;
ST16_LCD_IER = 0x01;
ST16_LCD_FCR_ISR = 0x0f;
delay_ms(1);
ST16_LCD_FCR_ISR = 0x09;
ST16_LCD_LCR = 0x83;
ST16_LCD_DLL = 0x04; ST16_LCD_DLM = 0x00;//0x0004=375k
//ST16_LCD_DLL = 0x0d; ST16_LCD_DLM = 0x00;//0x000d=115.2k
ST16_LCD_DLM = 0x00;
ST16_LCD_LCR = 0x03;
ST16_PRO_IER = 0x01;
ST16_PRO_FCR_ISR = 0x0f;
delay_ms(1);
ST16_LCD_FCR_ISR = 0x09;
ST16_PRO_LCR = 0x83;
ST16_PRO_DLL = 0x04;//0x04=375k
ST16_PRO_DLM = 0x00;
ST16_PRO_LCR = 0x03;
XINT1CR = 0x05;
XINT2CR = 0x05;
}
/*
+------------------------------------------------------------------------------+
函 数 名 : st16_lcd_tx()
功能描述 : st16_lcd_tx向LCD发送数据
函数原形 : void st16_lcd_tx(U16 len,U16 *p)
参数说明 : len=数据长度;*p数据指针(低8位有效)
支持资源 : len + d1...dn + CRC
作 者 : 桂林
最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
void st16_lcd_tx(U16 len,U16 *p)
{
U16 tempi=0,crc=0;
while((ST16_LCD_LSR & 0x20)==0);
ST16_LCD_RHR_THR = len;
for(tempi=0;tempi<len;tempi++)
{
while((ST16_LCD_LSR & 0x20)==0);
ST16_LCD_RHR_THR = *p;
crc += *p++;
};
while((ST16_LCD_LSR & 0x20)==0);
ST16_LCD_RHR_THR = crc;
}
/*
+------------------------------------------------------------------------------+
函 数 名 : st16_pro_tx()
功能描述 : st16_pro_tx向PROFIBUS发送数据
函数原形 : void st16_pro_tx(U16 len,U16 *p)
参数说明 : len=数据长度;*p数据指针(低8位有效)
支持资源 : len + d1...dn + CRC(低8位有效)
作 者 : 桂林
最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
void st16_pro_tx(U16 len,U16 *p)
{
U16 tempi=0,crc=0;
while((ST16_PRO_LSR & 0x20)==0);
ST16_PRO_RHR_THR = len;
for(tempi=0;tempi<len;tempi++)
{
while((ST16_PRO_LSR & 0x20)==0);
ST16_PRO_RHR_THR = *p;
crc += *p++;
};
while((ST16_PRO_LSR & 0x20)==0);
ST16_PRO_RHR_THR = crc;
}
/*
+------------------------------------------------------------------------------+
函 数 名 : XINT1_ISR()
功能描述 : XINT1_ISR,ST16_LCD中断处理函数
函数原形 : interrupt void XINT1_ISR()
参数说明 :
支持资源 : len + d1...dn + CRC
作 者 : 桂林
最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
interrupt void XINT1_ISR()
{
// XINT1CR |= 0x8000;
// if((ST16_LCD_FCR_ISR & 0x0f)==4)//rx ok
// {
// rxbuf[0] = ST16_LCD_RHR_THR;
// while((ST16_LCD_LSR & 0x20)==0);ST16_LCD_RHR_THR = rxbuf[0]+1;
// };
// EnableINT;
//----------------------------------------------------
static U16 tempi=0,tempcrc=0;
U16 tempbuf=0;
XINT1CR |= 0x8000;
if((ST16_LCD_FCR_ISR & 0x0f)==4)//rx ok
{
tempbuf = 0x00ff&ST16_LCD_RHR_THR;
switch(GVAR.GS.LCD)
{
case LENGTH:{
if(tempbuf!=0)
{
GVAR.GAB.LCD[0]=tempbuf;
GVAR.GS.LCD=DATA;
};
break;
};
case DATA:{
GVAR.GAB.LCD[1+tempi]=tempbuf;
tempcrc+=tempbuf;
if((tempi++)>=GVAR.GAB.LCD[0])
GVAR.GS.LCD=PARITY;
break;
};
case PARITY:{
GVAR.GS.LCD=LENGTH;
if((tempcrc&0x00ff)==tempbuf)
GVAR.GA.LCD_ASK=1;
break;
};
default:{GVAR.GS.LCD=LENGTH;break;};
};
};
EnableINT;
//----------------------------------------------------
}
/*
+------------------------------------------------------------------------------+
函 数 名 : XINT2_ISR()
功能描述 : XINT2_ISR,ST16_PRO中断处理函数
函数原形 : interrupt void XINT2_ISR()
参数说明 :
支持资源 : len + d1...dn + CRC
作 者 : 桂林
最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
interrupt void XINT2_ISR()
{
// XINT2CR |= 0x8000;
// if((ST16_PRO_FCR_ISR & 0x0f)==4)//rx ok
// {
// rxbuf[1] = ST16_PRO_RHR_THR;
// while((ST16_PRO_LSR & 0x20)==0);ST16_PRO_RHR_THR = rxbuf[1]+1;
// };
// EnableINT;
//----------------------------------------------------
static U16 tempi=0,tempcrc=0;
U16 tempbuf=0;
XINT2CR |= 0x8000;
if((ST16_PRO_FCR_ISR & 0x0f)==4)//rx ok
{
tempbuf = 0x00ff&ST16_PRO_RHR_THR;
switch(GVAR.GS.PROFIBUS)
{
case LENGTH:{
GVAR.GAB.PROFIBUS[0]=tempbuf;
GVAR.GS.PROFIBUS=DATA;
break;
};
case DATA:{
GVAR.GAB.PROFIBUS[1+tempi]=tempbuf;
tempcrc+=tempbuf;
if((tempi++)>=GVAR.GAB.PROFIBUS[0])
GVAR.GS.PROFIBUS=PARITY;
break;
};
case PARITY:{
GVAR.GS.PROFIBUS=LENGTH;
if((tempcrc&0x00ff)==tempbuf)
GVAR.GA.PROFIBUS_ASK=1;
break;
};
default:{GVAR.GS.PROFIBUS=LENGTH;break;};
};
};
EnableINT;
//----------------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -