📄 hyperterminal.c
字号:
/****************************************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 + -