📄 io.c
字号:
#include <stdarg.h>
#include <string.h>
#include "compiler.h"
#include "config.h"
#include "isp.h"
#include "system.h"
#include "hex.h"
extern void uart_tx(unsigned char tx_data);
char ptxt[40];
unsigned char SreialStr;
void uart0(void) interrupt 4 using 0
{
if (RI == 1)
{
RI = 0;
SreialStr = 0;
hex_decoder(SBUF0);
}
}
void uart1(void) interrupt 7 using 0
{
if (RI1 == 1)
{
RI1 = 0;
SreialStr = 1;
hex_decoder(SBUF1);
}
}
void uart_tx(Uchar tx_data)
{
if(SreialStr == 0)
{
SBUF0 = tx_data;
while (TI==0);
TI=0;
}
else if(SreialStr == 1)
{
SBUF1 = tx_data;
while (TI1==0);
TI1=0;
}
else
{
SBUF0 = tx_data;
while (TI==0);
TI=0;
}
}
void vInitUart(void)
{
#if Sp756P==1
/*
CKCON |= 0x31; //T1、T2时钟Clk/4
//串口1的设置
TMOD |= 0x20; //定时器1工作在模式1,8位重载
SCON1 |= 0x50; //模式1: 异步10位波特率可变,允许接收
//串口0的设置
SCON |= 0x50; //模式1: 异步10位波特率可变,允许接收
T2CON |= 0x30; //用定时器2做串口0的波特率发生器
PCON |= 0x80; //串口0波特率加倍
WDCON |= 0x80; //串口1波特率加倍
TL1 = 0xFD; //波特率=57600
TH1 = 0xFD;
RCAP2H = 0xFF;
RCAP2L = 0xFD; //波特率=115200
EA = 1; //EA=1;ES1=1;ES0=1
ES0 = 1; //串口0中断允许
ES1 = 1; //串口1中断允许
TR2 = 1;
TR1 = 1;
*/
//0xFD(57600) 0xFA(28800) 0xF7(19200) 0xEE(9600)
CKCON |= 0x31; //T1时钟Clk1/4
TMOD |= 0x20; //定时器1:模式2,8位重载
SCON |= 0x50; //模式1: 异步10位波特率可变,允许接收
SCON1 |= 0x50; //模式1: 异步10位波特率可变,允许接收
PCON |= 0x80; //串口0波特率加倍
WDCON |= 0x80; //串口1波特率加倍
TL1 = 0xFD;
TH1 = 0xFD;
IE |= 0xD0; //EA=1;ES1=1;ES0=1
TR1 = 1;
#else
//0xFD(57600) 0xFA(28800) 0xF7(19200) 0xEE(9600)
CKCON |= 0x31; //T1时钟Clk1/4
TMOD |= 0x20; //定时器1:模式2,8位重载
SCON |= 0x50; //模式1: 异步10位波特率可变,允许接收
SCON1 |= 0x50; //模式1: 异步10位波特率可变,允许接收
PCON |= 0x80; //串口0波特率加倍
WDCON |= 0x80; //串口1波特率加倍
TL1 = 0xFD;
TH1 = 0xFD;
IE |= 0xD0; //EA=1;ES1=1;ES0=1
TR1 = 1;
#endif
}
void vSendBuff(unsigned int sDdress,unsigned int mISector,unsigned char sBackBank)
{
unsigned char data sxBchar;
unsigned int sxnum;
unsigned char CheckSum;
unsigned int snum;
sxnum = sDdress;
CheckSum = 0;
uart_tx(':'); //包头
if(mISector==256)sxBchar=0xFF; //数据长度
if(mISector==128)sxBchar=0x80;
CheckSum += sxBchar;
SendBinToChar(sxBchar);
sxBchar = (unsigned char)(sDdress/256); //扇区地址
CheckSum += sxBchar;
SendBinToChar(sxBchar);
sxBchar = (unsigned char)(sDdress%256); //扇区地址
CheckSum += sxBchar;
SendBinToChar(sxBchar);
uart_tx('0'); //数据类型
uart_tx('0');
CheckSum += 0x00;
vBankSet(sBackBank);
for(snum=0;snum <mISector;snum++)
{
sxBchar = vReadFlash(sxnum++);
CheckSum += sxBchar;
SendBinToChar(sxBchar);
}
CheckSum = ~CheckSum;
CheckSum +=1;
sxBchar = CheckSum; //和校验
SendBinToChar(sxBchar);
}
void vCOmSend(unsigned char m_ComLength, unsigned char m_ComType, unsigned short int m_AdderData)
{
//数据包格式: :ll kk aaaa tt [dd...] cc
//: 包头
//ll 数据长度
//kk 程序分区数
//aaaa 扇区地址
//dd... 数据域
//cc 和校验 cc = 0x01H + NOT(ll + kk + aa +aa +tt + dd...)
unsigned char Txchar;
unsigned char CheckSum;
CheckSum = 0;
uart_tx(':'); //包头
Txchar = m_ComLength; //数据长度
CheckSum += Txchar;
SendBinToChar(Txchar);
Txchar = 0x00; //地址
CheckSum += Txchar;
SendBinToChar(Txchar);
Txchar = 0x00;
CheckSum += Txchar;
SendBinToChar(Txchar);
Txchar = m_ComType; //数据类型
CheckSum += Txchar;
SendBinToChar(Txchar);
if(m_ComLength !=0)
{
Txchar = (unsigned char)(m_AdderData/256);
CheckSum += Txchar;
SendBinToChar(Txchar);
Txchar = (unsigned char)(m_AdderData%256);
CheckSum += Txchar;
SendBinToChar(Txchar);
}
CheckSum = ~CheckSum;
CheckSum +=1;
Txchar = (unsigned char)CheckSum; //和校验
SendBinToChar(Txchar);
}
void SendBinToChar(unsigned char BinChar)
{
unsigned char byte;
unsigned char SendHexChar;
byte = BinChar;
byte >>= 4;
if(0<= byte && byte <=9)
{
byte += '0';
SendHexChar = byte;
}
else
{
byte += 'A' - 10;
SendHexChar = byte;
}
uart_tx(SendHexChar);
byte = BinChar;
byte &= 0x0F;
if(0<= byte && byte <=9)
{
byte += '0';
SendHexChar = byte;
}
else
{
byte += 'A' - 10;
SendHexChar = byte;
}
uart_tx(SendHexChar);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -