📄 taskgetf.c
字号:
#include "sm5964reg.h"
#include "newtype.h"
#include "SerialNewType.h"
#include "ht1621.h"
//定义串行通讯缓冲区
//unsigned char idata cv_SerialReceiverBuf[42];
unsigned char idata cv_SerialReceiverBuf[4];
unsigned char idata cv_SerialSendBuf[60];
//定义串行通信缓冲区的读写指针。
unsigned char ReceiverBufWritePoint;
unsigned char ReceiverBufReadPoint;
unsigned char SendBufWritePoint;
unsigned char SendBufReadPoint;
unsigned char ReceiverPackWritePoint;
//超级终端相关变量
unsigned char command_point; //命令开始读指针
unsigned char command_point_new; //新命令开始读指针
//串口发送缓冲区空闲标志
bit Ti; //Ti=1,串口准备好,可以发送数据
bit Ri; //Ri=1,接收缓冲区有数据要接收
bit SendBufFullFlag=0; //=1,发送缓冲区满
extern unsigned char code Versoin[]; //定义版本号常量
extern unsigned char data Mesure_state; //侧量状态
extern unsigned char data disp_flag; //动态显示电压标志
extern unsigned char data stop_flag; //停止测试标志
extern unsigned char data second; //秒
extern unsigned char Display_state;
//葛同府所写模块初始化函数。
void InitialGeTF(void)
{
ReceiverBufWritePoint=0;
ReceiverBufReadPoint=0;
SendBufWritePoint=0;
SendBufReadPoint=0;
Ti=0; //Ti=1,串口准备好,可以发送数据
Ri=0; //Ri=0,接收缓冲区无数据要接收
}
//串口中断函数
void SerialCom() interrupt 4
{
unsigned char temp;
//有接收中断,写入接收缓冲区
if(RI==1) {
RI=0;
Ri=1; //Ri=1,接收缓冲区有数据要接收
temp=SBUF;
cv_SerialReceiverBuf[ReceiverBufWritePoint]=temp;
//接收缓冲区写指针+1
//接收缓冲区写指针大于接收数组最大值,置0
if(++ReceiverBufWritePoint>=sizeof(cv_SerialReceiverBuf)) {ReceiverBufWritePoint=0;}
}
//有发送中断,置Ti标志为1
if(TI==1) {
TI=0;
if (SendBufWritePoint != SendBufReadPoint) {
//从接收缓冲区读数据
SBUF=cv_SerialSendBuf[SendBufReadPoint];
//发送缓冲区读指针+1
SendBufReadPoint++;
//发送缓冲区读指针大于接收数组最大值,置0
if (SendBufReadPoint >= sizeof(cv_SerialSendBuf)) SendBufReadPoint=0;
}
else Ti=0;
}
}
//从串口接收缓冲区读数函数
char SerialReceiveBufRead(void)
{
unsigned char RecByte;
ES=0;
//从接收缓冲区读数据
RecByte=cv_SerialReceiverBuf[ReceiverBufReadPoint];
//接收缓冲区读指针+1
//接收缓冲区读指针大于接收数组最大值,置0
if (++ReceiverBufReadPoint >= sizeof(cv_SerialReceiverBuf)) ReceiverBufReadPoint=0;
if (ReceiverBufWritePoint != ReceiverBufReadPoint) {
Ri=1; //Ri=1,从接收缓冲区读出数据
}
else{
Ri=0; //Ri=0,接收缓冲区无数据
}
ES=1;
return RecByte;
}
//数据放串口发送缓冲区
void SerialSendBufWrite(unsigned char SenByte)
{
ES=0;
if (SendBufWritePoint+1 != SendBufReadPoint ) {
//如果发送缓冲区不满,数据放发送缓冲区
cv_SerialSendBuf[SendBufWritePoint]=SenByte;
//发送缓冲区写指针+1
SendBufWritePoint=++SendBufWritePoint;
//发送缓冲区写指针大于接收数组最大值,置0
if (SendBufWritePoint >= sizeof(cv_SerialSendBuf)) SendBufWritePoint=0;
SendBufFullFlag=0; //发送缓冲区未满
}
else SendBufFullFlag=1; //发送缓冲区未满
//如果串口中断没有发送数据,置发送中断标志
if(Ti==0) {
Ti=1; //表示正在发送数据
TI=1; //产生串口中断
}
ES=1;
}
//打印字符串函数
//遇到'/'字符,输出回车换行
//例如:
// print("ok/"); //打OK,并回车换行
// print("err"); //只打印err,不回车换行
void print(unsigned char *p_string)
{
unsigned char c;
while(*p_string != 0x00){
if (*p_string != '/') {
SerialSendBufWrite(*p_string);
}
else{
c=0x0d;
SerialSendBufWrite(c);
c=0x0a;
SerialSendBufWrite(c);
}
p_string++;
}
}
/*
//十六进制数(<=0f)转ASCII字符
unsigned char hex_to_char(unsigned char c)
{
if (c<0xa){
c=c | 0x30;
}
else{
c=c+0x37;
}
return c;
}
/*
//向串口发送字符函数
void printc (unsigned char c)
{
SerialSendBufWrite( hex_to_char((c & 0xf0)>>4 ) );
SerialSendBufWrite( hex_to_char(c & 0x0f) );
SerialSendBufWrite( 0x20);
} */
/*
//向串口发送整数函数
void printic(unsigned int i)
{
if (SendBufFullFlag==1) return ; //=1,发送缓冲区满
SerialSendBufWrite( hex_to_char((char)((i & 0xf000)>>12)) );
if (SendBufFullFlag==1) return ; //=1,发送缓冲区满
SerialSendBufWrite( hex_to_char((char)((i & 0x0f00)>>8 )) );
if (SendBufFullFlag==1) return ; //=1,发送缓冲区满
SerialSendBufWrite( hex_to_char((char)((i & 0x00f0)>>4 )) );
if (SendBufFullFlag==1) return ; //=1,发送缓冲区满
SerialSendBufWrite( hex_to_char((char)(i & 0x000f)) );
if (SendBufFullFlag==1) return ; //=1,发送缓冲区满
SerialSendBufWrite( 0x20);
} */
/*
//向串口发送整数函数
void printc(unsigned char i)
{
SerialSendBufWrite( hex_to_char((char)((i & 0xf0)>>4 )) );
SerialSendBufWrite( hex_to_char((char)(i & 0x0f)) );
SerialSendBufWrite( 0x20);
} */
/**/
//葛同府所写任务调用。
void TaskGeTF(void)
{
unsigned char temp;
//如果串口有数据,接收并处理
if (Ri==1) {
temp=SerialReceiveBufRead(); //接收字符
//超级终端命令处理(命令最大6字节)
command_analyse(temp);
}
}
//命令解释器(命令最大6字节)
void command_analyse(unsigned char RecByte)
{
unsigned char i,j,temp,temp_point,t[8];
//unsigned char cv_TempBuf[3];
if (RecByte == 0x0d) {
///命令开始读指针
command_point=temp_point=command_point_new;
//新命令开始读指针
command_point_new=ReceiverBufReadPoint;
//读命令
j=0;
for (i=0;i<sizeof(t);i++) {
temp=cv_SerialReceiverBuf[temp_point];
if (temp != 0x0a) { //滤除换行符
t[j]=temp; j++;
}
//接收缓冲区读指针+1,接收缓冲区读指针大于接收数组最大值,置0
if (++temp_point >= sizeof(cv_SerialReceiverBuf)) temp_point=0;
if (temp_point == command_point_new) i=sizeof(t); //读完后表示没有命令
}
//显示命令提示符>
printh(0x0d); printh(0x0a);
//printh('>'); printh(' ');
//ver命令
if ((t[0]=='v') && (t[1]=='e') && (t[2]=='r') && (t[3]==0x0d)) {
printh(':'); print(Versoin); printh(0x0d); printh(0x0a);
return;
}
//显示电压
if (((t[0]=='v') || (t[0]=='V')|| (t[0]=='i') || (t[0]=='I') )&& (t[1]==0x0d)) {
if (disp_flag==1) disp_flag=0;
else disp_flag=1;
return;
}
//停止测试
//显示电压
if (((t[0]=='s') || (t[0]=='S'))&& (t[1]==0x0d)) {
stop_flag=1;
Swich_Ctr=1; //停止放电
return;
}
//调整时间
if (((t[0]=='+') || (t[0]=='-'))&& (t[1]==0x0d)) {
if (t[0]=='+') second++;
if (t[0]=='-') second--;
return;
}
//显示测试
if (((t[0]=='d') || (t[0]=='D'))&& (t[1]==0x0d)) {
Display_state=Display_test;
return;
}
//显示测试
if (((t[0]=='d') || (t[0]=='D'))&& ((t[1]=='a') || (t[1]=='A'))&& (t[2]==0x0d)) {
disp_all();
return;
}
}
else {
printh(RecByte); //打印字符
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -