📄 pccommunicate.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define uch unsigned char
extern void set_motor(unsigned short,unsigned short);
extern void set_DJ(unsigned short);
extern uch AD0_convert(uch);
extern uch AD1_convert(uch);
// Function put_char:put a char to SCI0
void put_char(uch c) {
while((SCI0SR1&0x80)==0);
SCI0DRL=c;
}
// Function get_char:wait for a char from SCI0
uch get_char(void) {
while((SCI0SR1&0x20)==0);
return(SCI0DRL);
}
// Funciton get_DEC:wait for a DEC number and change char to int
uch get_DEC(void) {
uch d;
do {
d=get_char();
}
while(d<'0'||d>'9');
put_char(d);
return(d-0x30);
}
// Funciton get_HEX:wait for a HEX number and change char to int
uch get_HEX(void) {
uch h;
do {
h=get_char();
}
while((h<'0'||h>'9')&&(h<'a'||h>'f')&&(h<'A'||h>'F'));
if(h>='0'&&h<='9') {
put_char(h);
return(h-0x30);
} else if(h>='a'&&h<='f') {
put_char(h-32);
return(h-0x57);
} else if(h>='A'&&h<='F') {
put_char(h);
return(h-0x37);
}
}
// Function put_HEX:change a int number to char and put
void put_HEX(uch c) {
if(c<10)
put_char(c+0x30);
else
put_char(c+0x37);
}
// Fuction print:print a string which ended by '#' or '$'
void print(signed char * c) {
uch i;
i=0;
while(c[i]!='#'&&c[i]!='$')
{ put_char(c[i]);
i++;
}
if(c[i]=='#')
{ put_char(0x0D);
put_char(0x0A);
}
}
// Function print_help:print help text
void print_help(void) {
put_char('H');
put_char(0x0D);
put_char(0x0A);
print(" 按'Q'键退出通信模式#");
put_char(0x0D);
put_char(0x0A);
print(" A -- AD转换测试#");
print(" B -- 控制PB口LED#");
print(" D -- 查看指定存储空间数据#");
print(" M -- 控制电机转动#");
print(" R -- 读取拨码开关状态#");
print(" S -- 停止电机转动#");
print(" W -- 测量后轴速度#");
print(" Z -- 控制舵机转动#");
}
// Function stop_running:stop the car from running
void stop_running(void) {
put_char('S');
put_char(0x0D);
put_char(0x0A);
put_char(0x0D);
put_char(0x0A);
set_motor(0,0);
}
// Function controlDuoJi:set the direction
void control_DuoJi(void) {
uch z3,z2,z1,z0;
unsigned short z;
print("Z 请输入舵机控制值(3000-6000):$");
z3=get_DEC();
z2=get_DEC();
z1=get_DEC();
z0=get_DEC();
z=z3*1000+z2*100+z1*10+z0;
put_char(0x0D);
put_char(0x0A);
if(z<6001&&z>2999)
set_DJ(z);
else
print(" 输入范围错误!$");
put_char(0x0D);
put_char(0x0A);
}
// Function control_Motor:set the speed
void control_Motor(void) {
uch speed,s1,s0,fb;
unsigned int s;
print("M 请设定速度:(0-99) $");
s1=get_DEC();
s0=get_DEC();
speed=s1*10+s0;
s=speed*5;
put_char(0x0D);
put_char(0x0A);
print(" 请选择方向:F--前进 B--后退 $");
do {
fb=get_char();
}
while(fb!='f'&&fb!='F'&&fb!='b'&&fb!='B');
if(fb=='f'||fb=='F') {
put_char('F');
set_motor(s,0);
} else{
put_char('B');
set_motor(0,s);
}
put_char(0x0D);
put_char(0x0A);
}
// Function diplay:Display the memery
void display(void) {
uch i,a3,a2,a1,a0,b3,b2,b1,b0;
unsigned int mhead,mtail;
uch *p;
put_char('D');
put_char(' ');
a3=get_HEX();
a2=get_HEX();
a1=get_HEX();
a0=get_HEX();
put_char('-');
b3=get_HEX();
b2=get_HEX();
b1=get_HEX();
b0=get_HEX();
put_char(13);
put_char(10);
put_char(13);
put_char(10);
mhead=a3*4096+a2*256+a1*16;
mtail=b3*4096+b2*256+b1*16+16;
while(mhead<mtail){
print(" -$");
a3=(uch)(mhead/4096);
a2=(uch)((mhead-a3*4096)/256);
a1=(uch)((mhead-a3*4096-a2*256)/16);
a0=mhead-a3*4096-a2*256-a1*16;
put_HEX(a3);
put_HEX(a2);
put_HEX(a1);
put_HEX(a0);
print(" $");
p=(uch *)mhead;
for(i=0;i<16;i++) {
b3=*p;
b1=(uch)(b3/16);
b0=b3-b1*16;
put_HEX(b1);
put_HEX(b0);
put_char(' ');
p++;
}
mhead+=16;
put_char(13);
put_char(10);
}
}
void ctl_ptb(void){
uch b,b1,b2;
put_char('B');
put_char(13);
put_char(10);
print(" 请输入想要实现的状态:$");
b1=get_HEX();
b2=get_HEX();
b=b1*16+b2;
PORTB=b;
put_char(13);
put_char(10);
}
void read_sw(void){
uch s;
put_char('R');
put_char(13);
put_char(10);
print(" 拨码开关返回值为: $");
s=PORTK;
s=s&0x0F;
put_char('0');
put_HEX(s);
put_char(13);
put_char(10);
}
void AD_test(){
uch ch,r,r1,r2;
put_char('C');
put_char(13);
put_char(10);
print(" 要转换第几通道(0-F):$");
ch=get_HEX();
put_char(13);
put_char(10);
if(ch<8)
r=AD0_convert(ch);
else
r=AD1_convert(ch-8);
print(" 转换结果为:$");
r1=(uch)(r/16);
r2=r-r1*16;
put_HEX(r1);
put_HEX(r2);
put_char(13);
put_char(10);
}
void AD_all(){
uch ch,r,r1,r2;
put_char('A');
put_char(13);
put_char(10);
print("所有通道转换结果为:#");
for(ch=0;ch<8;ch++){
r=AD0_convert(ch);
r1=(uch)(r/16);
r2=r-r1*16;
print(" $");
put_HEX(r1);
put_HEX(r2);
}
put_char(13);
put_char(10);
for(ch=0;ch<8;ch++){
r=AD1_convert(ch);
r1=(uch)(r/16);
r2=r-r1*16;
print(" $");
put_HEX(r1);
put_HEX(r2);
}
put_char(13);
put_char(10);
}
void read_speed(){
put_char('W');
put_char(13);
put_char(10);
print(" 此功能尚未完成#");
}
// Function PC:Control every command
void PCCommunicate(void) {
uch op;
put_char(0x0D);
put_char(0x0A);
print("****************************************************************#");
print("* 西北工业大学智能车竞赛光电组控制类组委会硬件平台测试程序 *#");
print("* 版本:1.0 BY ZGC *#");
print("* 创建时间:2008.2.23 *#");
print("* 西北工业大学智能车协会 *#");
print("*--------------------------------------------------------------*#");
print("* 测试内容: *#");
print("* 1. PB口LED状态显示; *#");
print("* 2. PK口拨码开关输入; *#");
print("* 3. 舵机控制; *#");
print("* 4. 电机控制; *#");
print("* 5. 查看 0000-FFFF 内存储空间的数据; *#");
print("* 6. 测试16路AD转换; *#");
print("* 7. 测量后轴速度。 *#");
print("*--------------------------------------------------------------*#");
print("*具体操作请按'H'键。 *#");
print("****************************************************************#");
do{
put_char('>');
op=get_char();
if(op==0x0D){
put_char(0x0D);
put_char(0x0A);
}
else if(op=='h'||op=='H')
print_help();
else if(op=='q'||op=='Q') {
put_char('Q');
put_char(0x0D);
put_char(0x0A);
}
else if(op=='s'||op=='S')
stop_running();
else if(op=='z'||op=='Z')
control_DuoJi();
else if(op=='m'||op=='M')
control_Motor();
else if(op=='d'||op=='D')
display();
else if(op=='b'||op=='B')
ctl_ptb();
else if(op=='r'||op=='R')
read_sw();
else if(op=='a'||op=='A')
AD_all();
else if(op=='c'||op=='C')
AD_test();
else if(op=='w'||op=='W')
read_speed();
else{
put_char(op);
put_char(0x0D);
put_char(0x0A);
print(" 错误命令,看帮助请按'H'键#");
}
}
while(op!='q'&&op!='Q');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -