📄 uart0.c
字号:
#include "..\inc\44b.h"
#include "..\inc\function.h"
#include "..\inc\Globalv.h"
#include "..\inc\extvar.h"
#include "..\inc\macrofun.h"
#include "..\inc\quanju.h"
//**********UART0初始化*******************///
void uart_init(void)
{
rULCON0 = 0x03; // 8位数据位,一位停止位,无奇偶校验
rUCON0 = 0x385; // 中断模式接受、发送,缓冲区空时立即引发中断
rUFCON0 = 0x47; //FIFO 模式,触发水平为4字节
rUMCON0 = 0x00; //禁止AFC模式
rUBRDIV0 = 0x185; //波特率9600,MCLK=60M赫兹
}
//**************串口接收数据中断************************//
__irq void uart_recvdata(void)
{
int i,fifo_count;
outl(BIT_URXD0,rI_ISPC);
fifo_count = (rUFSTAT0 & 0x0f);
for(i=0;i<fifo_count;i++)
{
*inbuff_write = rURXH0;
inbuff_write++;
}
if(inbuff_write == inbuff_fulladdress)
{
inbuff_full = TRUE;
rPDATG |= 0x02; //禁止串口接收
}
if(inbuff_write == inbuff_end+1) inbuff_write = inbuff_start;
if(inbuff_write == inbuff_fulladdress)
{
inbuff_full = TRUE;
rPDATG |= 0x02; //禁止串口接收
}
}
//**************并口接收数据中断**************************//
__irq void parallel(void)
{
outl(BIT_EINT0,rI_ISPC);
if(!inbuff_full)
{
*inbuff_write = *PIOData_addr;
inbuff_write++;
if(inbuff_write == inbuff_fulladdress)
{
inbuff_full = TRUE;
}
if(inbuff_write == inbuff_end+1) inbuff_write = inbuff_start;
if(inbuff_write == inbuff_fulladdress)
{
inbuff_full = TRUE;
}
HVPI0DATA = FALSE;
}
HVPI0DATA = TRUE;
}
//**************获取接口类型******************//
BOOL Getintface_type(void)
{
BOOL intface;
if((rPDATG & 0xe0) == 0x80)
{
intface=FALSE;
}
else{intface=TRUE;}
return intface;
}
//***************从接收缓冲区读数据*************//
BYTE receive(void)
{
BYTE temp;
while(inbuff_write == inbuff_read);
temp = *inbuff_read++;
inbuff_fulladdress++;
if(Getintface_type())
{
if(inbuff_read == (inbuff_end+1)) inbuff_read = inbuff_start;
if(inbuff_fulladdress == inbuff_end+1) inbuff_fulladdress = inbuff_start;
if(HVPI0DATA) Enablepportint();
}
else
{
if(inbuff_read == (inbuff_end+1)) inbuff_read = inbuff_start;
if(inbuff_fulladdress == inbuff_end+1) inbuff_fulladdress = inbuff_start;
if(!inbuff_full)
{
rPDATG &= ~(0x02); //RTS 置高,通知PC停止传送
}
}
return temp;
}
//*************************************************************************//
void Command0a(void)
{
// MOTORDRIVE();
Checkpaperstate();
}
//**************************************************************************//
void MOTORDRIVE(void)
{
int i, str;
int string[8]={0x24,0x16,0x04,0x09,0x00,0x12,0x20,0x29};
//int string[8]={0x24, 0x1c, 0x04, 0x03, 0x00, 0x18, 0x20, 0x23};
for(i=0;i<8;i++)
{
i=phase;
str=string[phase];
rPDATD=0x3f&str;
phase++;
if(phase == 7)
{
phase=0;
}
}
}
//**************************************************************************//
void ESCcommand(void)
{
BYTE sendbackstring[8] = {'s','u','c','c','e','s','s','!'};
BYTE temp;
temp=receive();
if(temp==0x4c)
{
temp=receive();
if(temp==0x0c)
{
rPDATG |=0x100;
for(temp=0;temp<8;temp++)
{
*outbuff_write++=sendbackstring[temp];
if(outbuff_write==outbuff_end+1) outbuff_write = outbuff_start;
}
sendbytestopc();
}
}
else
{
return;
}
}
//******************************************************************************//
void sendbytestopc(void)
{
if(!Getintface_type())
{
do
{
rUTXH0 = *outbuff_read++;
if(outbuff_read==outbuff_end+1) outbuff_read = outbuff_start;
}
while(outbuff_write != outbuff_read);
}
}
//********************AD检测**************************//
BYTE GetADValue(void)
{
BYTE temp_ad;
SelectAdChanelAndStart(AD_PAPER);
temp_ad = (BYTE)(rADCDAT >>2);
return temp_ad;
}
//*******************************************//
void Checkpaperstate(void)
{
BYTE paper_ad,i;
paper_ad=GetADValue();
paper_ad=255-paper_ad;
if(paper_ad>=Paperend_AD)
{
for(i=0;i<12;i++)
{
*outbuff_write++=sendpaperstate[i];
if(outbuff_write==outbuff_end+1) outbuff_write = outbuff_start;
}
sendbytestopc();
}
else
{
for(i=0;i<10;i++)
{
*outbuff_write++=sendpaperend[i];
if(outbuff_write==outbuff_end+1) outbuff_write = outbuff_start;
}
sendbytestopc();
}
}
void SelectAdChanelAndStart(BYTE AdNo)
{
int j;
if(AdNo>7) return;
rADCCON=0x0|(AdNo<<2);
for(j=0;j<1000;j++);
rADCCON=0x1|(AdNo<<2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -