本帖最后由 仰望星期五 于 2013-2-2 11:40 编辑
#include <htc.h>
#include <pic18.h>
#include <pic18f45k20.h>
#include "keyinit.h"
#define uchar unsigned char
#define uint unsigned int
uchar rebuf[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uchar lednun,ledstat,reflag=0,recount=0;
void serinit()
{
IRCF2=1;
IRCF1=0;
IRCF0=1; //内部晶振4Mhz
BRG16=0; //使用8位波特率发生器
SPBRG=0x19; //波特率9600 十进制25
TXSTA=0x24; //异步模式、8位发送、使能发送、高速
RCSTA=0x90; //使能串口、连续接收
TRISC6=1; //RX,TX设置为输入
TRISC7=1;
}
void fdata(uchar data)
{
TXREG=data;
while(!TRMT);
}
void delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=100;j>0;j--);
}
void ioinit()
{
TRISA=0X00;
TRISB=0X00;
TRISD=0X00;
TRISE=0X00;//设置为输出
PORTA=0X00;
PORTB=0X00;
PORTD=0X00;
PORTE=0X00;//输出低电平
}
void main()
{
uchar i;
serinit(); //串口初始化
ioinit(); //端口初始化
GIE=1; //开总中断
RCIE=1; //开接收中断
PEIE=1; //开外设中
while(1)
{
if(reflag==1)
{
/* for(i=0;i<9;i++)
{
TXREG=rebuf;
while(!TRMT);
}
*/
reflag=0;
GIE=0;
if((rebuf[2]==0)&&(rebuf[3]==0)&&(rebuf[4]==0)&&(rebuf[5]==0))
{
if(rebuf[6]==0x02)
{
if(rebuf[8]==0x01)
{
ledstat=1;
}
else if(rebuf[8]==0x00)
{
ledstat=0;
}
lednun=rebuf[7];
switch(lednun)
{
case 0xa0:
{
if(ledstat==1)
{
AIN=0;
delay(10);
AIN=1;
delay(300);
AIN=0;
}
else if(ledstat==0)
{
BIN=0;
delay(10);
BIN=1;
delay(300);
BIN=0;
}
}break;
case 0xa1:
K1=ledstat;
break;
case 0xa2:
K2=ledstat;
break;
case 0xa3:
K3=ledstat;
break;
case 0xa4:
K4=ledstat;
break;
case 0xa5:
K5=ledstat;
break;
case 0xa6:
K6=ledstat;
break;
case 0xa7:
K7=ledstat;
break;
case 0xa8:
K8=ledstat;
break;
case 0xa9:
K9=ledstat;
break;
case 0xaa:
K10=ledstat;
break;
case 0xab:
K11=ledstat;
break;
case 0xac:
K12=ledstat;
break;
case 0xad:
K13=ledstat;
break;
case 0xae:
K14=ledstat;
break;
case 0xaf:
K15=ledstat;
break;
case 0xb0:
K16=ledstat;
break;
case 0xb1:
K17=ledstat;
break;
case 0xb2:
K18=ledstat;
break;
case 0xb3:
K19=ledstat;
break;
case 0xb4:
K20=ledstat;
break;
default:
reflag=0;
break;
}
}
else
{
reflag=0;
}
}
else
{
reflag=0;
}
GIE=1;
}
}
}
void interrupt uart()
{
if(RCIF&&0x01)
{
rebuf[recount++]=RCREG;//存储接收数据
// TXREG=RCREG;
// while(!TRMT);
if(rebuf[0] == 0x01) //判断数据帧头是否为0x01
{
if(recount>=9)
{
recount=0;
reflag=1;
}
}
else
{
recount=0;
}
// TXREG=RCREG;
}
}
看下串口的初始化以及中断函数 应该对你有帮助
|