⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hyperterminal.c

📁 串口协议
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                                    
**                                    同为技术有限公司  
**                                        研究部 
**
**                                 http://www.towintec.cn
**								   http://towin.siteem.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: HyperTerminal.c
**创   建   人: 于荣成
**最后修改日期: 2008年8月8日 奥运今天开始啦!!!
**描        述: 利用超级终端程序来搭建开发板跟PC之间的通道。
**								
**	
**注        意:本代码是在TOWIN-C51-I开发板上执行的。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 于荣成
** 版  本: v0.1
** 日 期: 2008年8月25日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "HyperTerminal.h"
#include <stdio.h>
#include <stdlib.h>
#include "TOWIN_C51_H.h"


void Set_RTC(void);//set RTC 

/*****************************************************************************/
char idata SerialBuffer[MAX_SERIAL_BUFFER_SIZE];
char idata PromptBuffer[MAX_PROMPT_BUFFER_SIZE];
char idata CursorPosion;
char idata ExecCommandFlag;

unsigned char gLedFlag=0xff;
//unsigned char gDig[6];				//6个数码管的内容
unsigned char gBeep;				//UL2003变量

/*	XBYTE define	*/
#define XBYTE ((char *) 0x20000L)
/*	lamp define	*/
#define LAMPADDR 		0xD000
/*	LED define	*/
#define LEDBITADDR		0xc000
#define LEDDATAADDR		0xB000
/*	UL2003 define	*/
#define BUZZERADDR		0xA000
#define RELAYADDR		0xA000
/*	SMC1602 define	*/
//#define LINE1         0      //第一行
//#define LINE2         1      //第二行


void DisplayDomain();
void DisplayTel();
void Read_RTC(void);
/*	DS1307 variable	*/
extern unsigned char DS1307_settime[8];  //2008.10.13.1 23:11:50 指示灯闪烁的频率为4HZ
extern unsigned char DS1307_rectime[7];  //2008.10.13.1 23:11:50 指示灯闪烁的频率为4HZ
extern unsigned char table[23];
/*	ADC0831	variable */
unsigned char adc_vol[];


extern unsigned char gIrArr[6];


unsigned char   ReadADC0831();
unsigned char rtemp();
void Write2402(unsigned char add,unsigned char dat);
unsigned char Read2402(unsigned char add);


COMMAND CommandList[MAX_COMMAND_NUM] = {
	{"help",Help," help -- Command help"},
	{"prompt",Prompt," prompt <string> -- Change a prompt"},
	{"clear",Clear," clear -- Clear screen"},
	{"lamp",Lamp," lamp <lamp_no + on/off> -- Change a prompt"},
	{"led",Led," led <led_no + number>-- display data"},
	{"beep",Beep," beep <on/off>-- Change a prompt"},
	{"lcd",Lcd," lcd <line(1 or 2) + str>-- display  screen"},
	{"reboot",Reboot," reboot -- Reboot the MCU"},
	{"relay",Relay," relay <on/off> -- operate relay"},
	{"temp",Temp," temp -- read temperature"},
	{"writetime",WriteTime," writetime <string(08102203105422> -- set time"},		//08(年)10(月)22(日)03(星期)10(点)54(分)22(秒)
	{"readtime",ReadTime," readtime-- read time"},
	{"ad",AD," ad-- display ad data"},
	{"ir",IR," ir-- display ir data"},
	{"writee2prom",WriteE2prom," writee2prom <addr data> -- write e2prom"},
	{"reade2prom",ReadE2prom," reade2prom <addr>-- read e2prom"}
};
/******************************************************************************************************
**	Lamp(char argc, const char **argv)	
**
**	描述:	跑马灯控制
**			numb + on/off; numb指示灯位号(1~4);on亮;off灭			
**
**	调用:					
**********************************************************************************************************/
void Lamp(char argc, const char **argv)
{
	char i,j;
	argv = argv;
	switch(argc)
	{
	case 3:
		i=0xff;
		if (strcmp(argv[1],"1")==0) i=0x00;
		if (strcmp(argv[1],"2")==0) i=0x01;
		if (strcmp(argv[1],"3")==0) i=0x02;
		if (strcmp(argv[1],"4")==0) i=0x03;
		j=0xff;
		if (strcmp(argv[2],"on")==0) j=0x00;
		if (strcmp(argv[2],"off")==0) j=0x01;
		if ((i==0xff) || (j==0xff))
		{
				;
		}
		else
		{
			if (j==0)						//on
			{
				j = 0x01;
				j = j << i;					//指示灯位置
				j = j ^ 0xff;				//取反  
				gLedFlag = (gLedFlag & j);	//相与取得数据
			}
			else							//off
			{
				j = 1;
				j = j << i;
				gLedFlag = (gLedFlag | j);
			}
			XBYTE[LAMPADDR]=gLedFlag;		//指示灯操作
		}
		SerialSendStr("\n");
		break;
	default:
		SerialSendStr(" Invalid 'lamp' command\n");
		break;
	}
}
/******************************************************************************************************
**	Led(char argc, const char **argv)	
**
**	描述:	数码管显示,只能够单管显示
**			no + number; no指LED位号(1~6);number显示的数字		
**
**	调用:					
			头文件:math.h、stdlib.h
			atoi()将字符串转换成整型数的函数
			原形:int atoi(const char *s)
			功能:把s所指向的字符串转换成int类型。
			s格式为:符号 数字
			返回值:字符串的转换值。若出错则返回0;
			不过还是找不到具体内容 
			C库里函数具体的内容 我找有段时间了 都没找遇到一个 
**********************************************************************************************************/
void Led(char argc, const char **argv)
{
	char i,j;
	argv = argv;
	switch(argc)
	{
	case 3:
		i=atoi(argv[1]);
		j=atoi(argv[2]);
		j = table[j];
		XBYTE[LEDBITADDR]=0xff;
		XBYTE[LEDDATAADDR]=j;//0x30;
		XBYTE[LEDBITADDR]=0xff^ (0x01 << (i-1));
/*
		gDig[0]=0xff;
		for(i=0;i<6;i++)
		{
			gDig[i]=0xff;
		}
		i=strlen(argv[0]);			//字符串的字符实际长度
		for(j=0;j<i;j++)
		{
			gDig[j]=argv[1][j];
		}
*/
		SerialSendStr("\n");
		break;
	default:
		SerialSendStr(" Invalid 'led' command\n");
		break;
	}
}
/******************************************************************************************************
**	Beep(char argc, const char **argv)	
**
**	描述:	蜂鸣器控制
**			蜂鸣器控制 ON 蜂鸣器响,OFF 蜂鸣器停
**	调用:	
**				
**********************************************************************************************************/
void Beep(char argc, const char **argv)			//蜂鸣器操作
{
	char j;
	argv = argv;
	switch(argc)
	{
	case 2:
		j=0xff;
		if (strcmp(argv[1],"off")==0)
		{
			j=0xfe;
			gBeep=(gBeep & j);
			XBYTE[BUZZERADDR]=gBeep;
		}
		if (strcmp(argv[1],"on")==0)
		{
			j=0x01;
			gBeep=gBeep | j;
			XBYTE[BUZZERADDR]=gBeep;
		}
		SerialSendStr("\n");
		break;
	default:
		SerialSendStr(" Invalid 'beep' command\n");
		break;
	}
}
/******************************************************************************************************
**	Lcd(char argc, const char **argv)	
**
**	描述:	液晶上显示超级终端上发送的数据
**			line+str: line =1 ,则在第一行显示
**						   =2,在第二行显示
**					  str  需要显示的字符串   
**	调用:			
**				
**********************************************************************************************************/
void Lcd(char argc, const char **argv)
{
	unsigned char line=1;
	unsigned char *sp;
	
	argv = argv;
	sp = argv[2];
	
	switch(argc)
	{
		case 3:
//			LCD_init();
			if(strcmp(argv[1],"1")==0)					//if (strcmp(argv[1],"1")==0) i=0x00;
			{
				line = 0;
			}
			else if(strcmp(argv[1],"2")==0)
			{
				line = 1;				
			}
			LCD_write_string(0x00,line,sp);
			if(line)
			{
				SerialSendStr(" lcd line is 2 \n");
			}
			else
			{
				SerialSendStr(" lcd line is 1 \n");
			}

		SerialSendStr("\n");
		break;
	default:
		SerialSendStr(" Invalid 'lcd' command\n");
		break;
	}
}
/******************************************************************************************************
**	Relay(char argc, const char **argv)
**
**	描述:	继电器控制
**			继电器控制 ON 继电器闭合,OFF 继电器断开
**	调用:	
**				
**********************************************************************************************************/
void Relay(char argc, const char **argv)
{
	char j;
	argv = argv;
	switch(argc)
	{
	case 2:
		j=0xff;
		if (strcmp(argv[1],"off")==0)			//字符串比较正确
		{
			j=0xbf;
			gBeep=(gBeep & j);
			XBYTE[RELAYADDR]=gBeep;
		}
		if (strcmp(argv[1],"on")==0)			//反斜杠还是影响了命令
		{
			j=0x40;
			gBeep=gBeep | j;
			XBYTE[RELAYADDR]=gBeep;
		}
		SerialSendStr("\n");
		break;
	default:
		SerialSendStr(" Invalid 'relay' command\n");
		break;
	}
}
/******************************************************************************************************
**	Temp(char argc, const char **argv)
**
**	描述:	将DS18B20的温度传送到超级终端显示。
**			温度格式为: 32.5C
**********************************************************************************************************/
void Temp(char argc, const char **argv)
{
	int j;
	char str[20];
	argv = argv;
	switch(argc)
	{
	case 1:
		j=read_temp();
		str[0] = (j/100) +0x30;
		j=(j % 100);
		str[1] = (j/10) +0x30;
		j=(j % 10);
		str[2] = '.';						//小数点
		str[3] = j +0x30;
		str[4] = 'C';
		str[5] = '\r';
		str[6] = '\n';
		SerialSendStr(str);
		SerialSendStr("\r\n");
		break;
	default:
		SerialSendStr(" Invalid 'temp' command: too many arguments\r\n");
		break;
	}
}
/******************************************************************************************************
**	ReadTime(char argc, const char **argv)
**
**	描述:	读DS1307的时间
**			显示2008(年)10(月)22(日)03(星期)10(点)54(分)22(秒)括号的内容不显示
**	调用:	Read_RTC(void)	//读取DS1307数据
**				
**********************************************************************************************************/
void ReadTime(char argc, const char **argv)
{
	char str[22];
	argv = argv;
	switch(argc)
	{
	case 1:
		Read_RTC();												//读时间
		str[0]= '2';
		str[1]= '0';
		str[2]=((DS1307_rectime[6]>>4) & 0x0f) + 0x30;			//年
		str[3]=(DS1307_rectime[6] & 0x0f) + 0x30;
		str[4]='/';
		str[5]=((DS1307_rectime[5]>>4) & 0x01) + 0x30;			//月
		str[6]=(DS1307_rectime[5] & 0x0f) + 0x30;
		str[7]='/';
		str[8]=((DS1307_rectime[4]>>4) & 0x03) + 0x30;			//日
		str[9]=(DS1307_rectime[4] & 0x0f) + 0x30;
		str[10]='/';
		str[11]=((DS1307_rectime[2]>>4) & 0x03) + 0x30;			//时
		str[12]=(DS1307_rectime[2] & 0x0f) + 0x30;
		str[13]='/';
		str[14]=((DS1307_rectime[1]>>4) & 0x07) + 0x30;			//分
		str[15]=(DS1307_rectime[1] & 0x0f) + 0x30;
		str[16]='/';
		str[17]=((DS1307_rectime[0]>>4) & 0x07) + 0x30;			//秒
		str[18]=(DS1307_rectime[0] & 0x0f) + 0x30;
		str[19]='\n';
		str[20]='\r';
		SerialSendStr(str);
		break;
	default:
		SerialSendStr(" Invalid 'read' command\r\n");
		break;
	}
}
/******************************************************************************************************
**	WriteTime(char argc, const char **argv)
**
**	描述:	初始化DS1307的时间
**			写入08(年)10(月)22(日)03(星期)10(点)54(分)22(秒)括号的内容不显示
**	调用:	settime(void)	//写DS1307数据
**				
**********************************************************************************************************/
void WriteTime(char argc, const char **argv)
{
	unsigned char i,j,tmp;
	unsigned char *sp;
	
	argv = argv;
	sp = argv[1];								//指针指向命令数据的地址
	switch(argc)
	{
		case 2:
			for(i= 0; i<7;i++)
			{
				tmp = *sp;						//argv[1]指针指向的数据
				tmp = ((tmp-0x30)&0x0f)<<4;
				sp++;
				j = *sp;
				j = j&0x0f;
				tmp = tmp|j;
				DS1307_settime[6-i] = tmp;
				sp++;							
			}		
/*
	case 8:
		i=atoi(argv[7]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[0]=j;
		i=atoi(argv[6]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[1]=j;
		i=atoi(argv[5]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[2]=j;
		i=atoi(argv[4]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[3]=j;

		i=atoi(argv[3]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[4]=j;
		i=atoi(argv[2]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[5]=j;
		i=atoi(argv[1]);
//		SerialSendStr(argv[1]);
		j=((i/10)<<4)+((i % 10));
		set_rtc_code[6]=j;
*/		
		settime();
		break;
	default:
		SerialSendStr(" Invalid 'reboot' command: too many arguments\r\n");
		break;
	}
}
/******************************************************************************************************
**	AD(char argc, const char **argv)
**
**	描述:	AD转换
**			读A/D转换的值 输出数据为5位数据,如:2.55V
**	调用:	
**				
**********************************************************************************************************/
void AD(char argc, const char **argv)
{
	unsigned char j;
	float voltage,i,vol;
	unsigned int voltmp;
	char str[20];

	argv = argv;
	switch(argc)
	{
	case 1:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -