📄 2main.c
字号:
//ok
//此程序通过RS-232接口来完成计算机和单片机通信
//此程序首先发送测试数据55H,再通过中断实现数据的接收和发送
//程序的调试可以用"串口调试助手V2.1"辅助完成
#include "p18cxxx.h"
#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = ON
#pragma config WDTPS =512
#pragma config CCP2MX = ON
#pragma config MCLRE = OFF
#pragma config BOR = ON //RC2 OK
#pragma config BORV = 42
#pragma config WDT = ON
#pragma config LVP = OFF
#define ADDR_8816 PORTF
#define DATA_8816 PORTFbits.RF7
#define REST_8816 PORTGbits.RG0
#define STROBE_8816 PORTGbits.RG1
#define CS1_8816 PORTGbits.RG2
#define CS2_8816 PORTGbits.RG3
#define CS3_8816 PORTGbits.RG4
#define AX0_8816 PORTFbits.RF0
#define AX1_8816 PORTFbits.RF1
#define AX2_8816 PORTFbits.RF2
#define AX3_8816 PORTFbits.RF3
#define AY0_8816 PORTFbits.RF4
#define AY1_8816 PORTFbits.RF5
#define AY2_8816 PORTFbits.RF6
#define DATA_8816 PORTFbits.RF7
#define S1x_PORT PORTE
#define S10 PORTEbits.RE0
#define S11 PORTEbits.RE1
#define S12 PORTEbits.RE2
#define S13 PORTEbits.RE3
#define S14 PORTEbits.RE4
#define S15 PORTEbits.RE5
#define S16 PORTEbits.RE6
#define S1x_TRIS TRISE
#define S10_TRIS TRISEbits.TRISE0
#define S11_TRIS TRISEbits.TRISE1
#define S12_TRIS TRISEbits.TRISE2
#define S13_TRIS TRISEbits.TRISE3
#define S14_TRIS TRISEbits.TRISE4
#define S15_TRIS TRISEbits.TRISE5
#define S16_TRIS TRISEbits.TRISE6
#define S2x_PORT PORTD
#define S20 PORTDbits.RD0
#define S21 PORTDbits.RD1
#define S22 PORTDbits.RD2
#define S23 PORTDbits.RD3
#define S24 PORTDbits.RD4
#define S25 PORTDbits.RD5
#define S26 PORTDbits.RD6
#define S2x_TRIS TRISD
#define S20_TRIS TRISDbits.TRISD0
#define S21_TRIS TRISDbits.TRISD1
#define S22_TRIS TRISDbits.TRISD2
#define S23_TRIS TRISDbits.TRISD3
#define S24_TRIS TRISDbits.TRISD4
#define S25_TRIS TRISDbits.TRISD5
#define S26_TRIS TRISDbits.TRISD6
#define S3x_PORT PORTB
#define S30 PORTBbits.RB0
#define S31 PORTBbits.RB1
#define S32 PORTBbits.RB2
#define S33 PORTBbits.RB3
#define S34 PORTBbits.RB4
#define S35 PORTBbits.RB5
#define S36 PORTBbits.RB6
#define S3x_TRIS TRISB
#define S30_TRIS TRISBbits.TRISB0
#define S31_TRIS TRISBbits.TRISB1
#define S32_TRIS TRISBbits.TRISB2
#define S33_TRIS TRISBbits.TRISB3
#define S34_TRIS TRISBbits.TRISB4
#define S35_TRIS TRISBbits.TRISB5
#define S36_TRIS TRISBbits.TRISB6
#define x0 0
#define x1 1
#define x2 2
#define x3 3
#define x4 4
#define x5 5
#define x6 8
#define xbuf 9
#define y0off 0x00
#define y1off 0x10
#define y2off 0x20
#define y3off 0x30
#define y4off 0x40
#define y5off 0x50
#define y6off 0x60
#define ybufoff 0x70
#define y0on 0x80
#define y1on 0x90
#define y2on 0xa0
#define y3on 0xb0
#define y4on 0xc0
#define y5on 0xd0
#define y6on 0xe0
#define ybufon 0xf0
#define OUT_232 PORTCbits.RC2
union adres
{
unsigned int y;
unsigned char adre[2];
}adresult;
unsigned char buf_RCREG;
unsigned char cmd0;
unsigned char cmd1;
unsigned char tt;
unsigned char aa;
unsigned char bb;
unsigned char dd;
unsigned char S1_reg;
unsigned char S2_reg;
unsigned char S3_reg;
void InterruptHandlerHigh(void);
//初始化程序
void RS232_initial(void)
{
SPBRG=25; //选择传输波特率为9600bps
TXSTA=0X04; //选择异步高速方式传输8位数据
RCSTA=0X80; //允许同步串行口工作
TRISC=0XC0; //将RC7,RC6设置为输入,断绝与外接电路的连接
BAUDCONbits.BRG16=0;
TXSTAbits.TXEN=1; //发送允许
RCSTAbits.CREN=1; //接受数据允许
PIE1bits.RCIE=1; //接收中断使能
INTCON=0XC0; //总中断和外围中断允许
INTCONbits.PEIE=1; //外围中断允许
RCONbits.IPEN=1; //使能中断优先级
INTCONbits.GIE=1; //总中断允许
TXREG=0X55; //发送数据55H进行测试
}
//高优先级中断向量
#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh//跳到中断程
_endasm
}
//高优先级中断服务程序
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
while(PIR1bits.RCIF==1) //若接收中断标志不为1,则为误操作,返回
{
//接收命令
if((buf_RCREG&0x80)==0)//b7=0 at cmd0, b7=1 at cmd1.
{
cmd0=RCREG;
}
else
{
cmd1=RCREG;
buf_RCREG=1;
TXREG=0X55;
}
}
}
void MT8816RESET(void)
{
STROBE_8816=0;
REST_8816=1;
_asm CLRWDT _endasm
_asm CLRWDT _endasm
REST_8816=0;
_asm CLRWDT _endasm
CS1_8816=1;
CS2_8816=1;
CS3_8816=1;
_asm CLRWDT _endasm
ADDR_8816=x0+y0on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=x1+y1on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=x2+y2on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=x3+y3on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=x4+y4on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=x5+y5on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=x6+y6on; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
ADDR_8816=xbuf+ybufon; STROBE_8816=1; _asm CLRWDT _endasm STROBE_8816=0;
CS1_8816=0;
CS2_8816=0;
CS3_8816=0;
}
unsigned char deal_Sxx_signal(void)
{
unsigned char temp=0;
S1x_TRIS=0xFF;
if((S1x_PORT&0x7F)!=0x7F)
{
S1x_TRIS=(S1x_PORT&0x7F)^0x7f;
S1x_PORT=S1x_TRIS;
S1_reg=S1x_TRIS;
temp=1;
}
S2x_TRIS=0xFF;
if((S2x_PORT&0x7F)!=0x7F)
{
S2x_TRIS=(S2x_PORT&0x7F)^0x7f;
S2x_PORT=S2x_TRIS;
S2_reg=S2x_TRIS;
temp=1;
}
S3x_TRIS=0xFF;
if((S3x_PORT&0x7F)!=0x7F)
{
S3x_TRIS=(S3x_PORT&0x7F)^0x7f;
S3x_PORT=S3x_TRIS;
S3_reg=S3x_TRIS;
temp=1;
}
OUT_232=temp;
return(temp);
}
void Set_Sxx_low(void)
{
S1x_TRIS=0;
S2x_TRIS=0;
S3x_TRIS=0;
S1x_PORT=0;
S2x_PORT=0;
S3x_PORT=0;
}
void linker_S1(void)
{ unsigned char i;
STROBE_8816=0;
CS1_8816=1;
for(i=0;i<7;i++)
{
if((S1_reg&0x1)==1)
{
ADDR_8816=i+ybufon; STROBE_8816=1;
_asm CLRWDT _endasm STROBE_8816=0;
}
else
{
ADDR_8816=i+ybufoff; STROBE_8816=1;
_asm CLRWDT _endasm STROBE_8816=0;
}
S1_reg/=2;
}
CS1_8816=0;
}
void linker_S2(void)
{ unsigned char i;
STROBE_8816=0;
CS2_8816=1;
for(i=0;i<7;i++)
{
if((S2_reg&0x1)==1)
{
ADDR_8816=i+ybufon; STROBE_8816=1;
_asm CLRWDT _endasm STROBE_8816=0;
}
else
{
ADDR_8816=i+ybufoff; STROBE_8816=1;
_asm CLRWDT _endasm STROBE_8816=0;
}
S2_reg/=2;
}
CS2_8816=0;
}
void linker_S3(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -