📄 sci.c
字号:
//该程序实现2407的串口异步通信
#include "NC.h"
//禁止总中断子程序
void inline disable()
{
asm(" setc INTM");
asm(" setc SXM");
}
//使能总中断子程序
void inline enable()
{
asm(" clrc INTM");
}
main( )
{
disable(); //禁止所有中断
IFR=0xFFFF; // 清除中断标志
SCSR1=0X87FF; //CLKIN=6M,CLKOUT=24M
WDCR=0xE8; //不使能看门狗
SCICCR=0x07; //1个停止位,不使能奇偶校验,空闲线多处理器模式,07为外部回送或外部发送/接受模式,
//17为内部,8位字符
SCICTL1=0x13; //#0013H 使能接收和发送,SLEEP=0 禁止休眠
//方式 , 禁止接收错误中断,TXWAKE=0 即没
//有选定的发送特征
SCICTL2=0x03; //dis接收和发送中断
SCIHBAUD=0X0;//0x2;
SCILBAUD=0Xc2;//0x70; //波特率=9600B/S
SCICTL1=0x33; //使SCI脱离复位状态
SCIPRI=0x60; //SCI中断(接收和发送中断)为低优先级中断
MCRA=0x3;
IMR=0x10; //使能UART中断-INT5
enable(); //使能总中断
SCITXBUF=0x77; //见P229页的说明
while(1)
{
SCICTL1=0x33;
// while((SCICTL2 & 0x40)!=0x40);
};
}
void UartSent() //发送服务程序
{
static int i=0;
const char var[20]={0xaa,0xbb,0xcc,0xdd,0xee,0xff};//"f2407A UART is fine?";//定义一段需要发送的字符串
// char *var;
// var[0]=0xaa;
// var[1]=0xbb;
// var[2]=0x12;
// var[3]=0xcc;
if(i>strlen(var)) return; //如果需要发送的字符都已经发送完,则中断直接返回
SCITXBUF=var[i++]; //依次发送定义的字符串中的各个字符
IFR=0x0010; //清除IFR中相应的中断标志
enable(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
}
void UartRec() //接收服务程序
{
static int receive[21],j=0; //19个目标字符,但是接受到时,第一个为0,所以至少应该是20个元素得一个数组,
//定义为21个元素的数组可以使receive的第一个和最后一个都是NULL?
receive[j] = SCIRXBUF; //依次接收字符
if(receive[1]==102) PADATDIR=0x0808; //判断第一个字符是否为f,可用于判断G代码的类型
j++;
if(j>=21) j = 0; //可以去掉
IFR= 0x0010; //清除IFR中相应的中断标志
enable(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
}
void interrupt uarttr() //中断服务程序
{
switch (PIVR) //根据中断向量寄存器PVIR的值区别是接收还是发送中断
{
case 6: UartRec();break; //如果PIVR=6,则发生了接收中断,执行接收服务程序
case 7: UartSent();break; //如果PIVR=7,则发生了发送中断,执行发送服务程序
}
}
//当由于干扰而引起其它中断时,中断进入此程序直接返回主程序
void interrupt nothing()
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -