📄 汽车模拟.cpp
字号:
#include<iostream>
#include <windows.h>
using namespace std;
#define PORT_8255_A 0Xc800
#define PORT_8255_B 0Xc801
#define PORT_8255_C 0Xc802
#define PORT_8255_CONSOLE 0Xc803
#define PORT_ADC0809 0Xc880
#define PORT_LED 0Xc860
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define NONE_SW 0
typedef int BOOL;
void DelayTime(int n)
{
int i,j;
for(i=0;i<n;++i)
for(j=0;j<n;++j);
}
//得到旋钮的值
char GetKnobValue(void)
{
unsigned char value;
_asm
{
mov dx,PORT_ADC0809
mov ax,0X80
out dx,ax
in al,dx
mov value,al
}
return value;
}
//初始化8255
void Init8255(unsigned char value)
{
_asm
{
mov dx,PORT_8255_CONSOLE
mov al,value
out dx,al
}
}
//改变步进电机的相位,需要初始化8255
void ControlMoto(int pos)
{
_asm mov dx,PORT_8255_A
switch(pos)
{
case 0://A口
_asm mov al,0001B
break;
case 1://AB口
_asm mov al,0011B
break;
case 2://B口
_asm mov al,0010B
break;
case 3://BC口
_asm mov al,0110B
break;
case 4://C口
_asm mov al,0100B
break;
case 5://CD口
_asm mov al,1100B
break;
case 6://D口
_asm mov al,1000B
break;
case 7://DA口
_asm mov al,1001B
break;
default:
break;
}
_asm out dx,al
}
//判断旋钮是否转动,还需要初始化8255
BOOL IsKnobCanRead()
{
unsigned char n;
_asm
{
mov dx,PORT_8255_B
in al,dx
and al,10000000B
mov n,al
}
if(n==128)return TRUE;
else return FALSE;
}
//读取档位的数据,处理多个档位在上的情况
int ReadSWNum(void)
{
unsigned char value;
_asm
{
mov dx,PORT_LED
in al,dx
mov value,al
}
switch(value)
{
case 0:return NONE_SW;
case 1:return 1;
case 2:return 2;
case 4:return 3;
case 8:return 4;
case 16:return 5;
case 32:return 6;
case 64:return 7;
case 128:return 8;
default:return ERROR;
}
}
//电灯
void SetLight(unsigned char value)
{
_asm
{
mov dx,PORT_LED
mov al,value
out dx,al
}
}
//调节速度,返还延时
int SetRate(int SW_val,unsigned char knob_val)
{
while(IsKnobCanRead()==FALSE);
//int knob_val=static_cast<int>(GetKnobValue());
//int SW_val=ReadSWNum();
//计算延时,还可以再修改
int dely_time;
switch(SW_val)
{
case 0:dely_time=2500;break;
case 1:dely_time=1800;break;
case 2:dely_time=1200;break;
case 3:dely_time=800;break;
}
dely_time = static_cast<int>(dely_time*(1+(255-knob_val)/255.0));
return dely_time;
}
int main()
{
cout<<"开始汽车模拟\n";
int dely_time=0;
int tag_time=0;
Init8255(130);//初始化8255
unsigned char light_backward=240;
unsigned char light_highspeed=0;
while(true)
{
int SW_val = ReadSWNum();//档位的值
unsigned char knob_val = GetKnobValue();//旋钮的值
if(SW_val!=5)
{
system("cls");
printf("\n现在是第%d档位",SW_val);
//正常的档位
if(SW_val==NONE_SW || SW_val==1 || SW_val==2 || SW_val==3)
{
/*system("cls");
/*printf("现在是第%d档位,SW_val\n");*/
dely_time=SetRate(SW_val,knob_val);
for(int i=0;i<8;++i)
{
DelayTime(dely_time);
ControlMoto(i);
}
}
//倒车,全亮全暗
else if(SW_val==4)
{
system("cls");
printf("倒车\n");
dely_time=SetRate(0,knob_val);
for(int i=7;i>=0;--i)
{
DelayTime(dely_time);
ControlMoto(i);
}
SetLight(light_backward);
light_backward=~light_backward;
}
else if(SW_val==ERROR)
{
for(int i=0;i<8;++i)
{
DelayTime(dely_time);
ControlMoto(i);
}
}
//是否超速,4亮4暗
if(dely_time<1080)
{
if(tag_time==0)
{
system("cls");
printf("现在超速,请减速\n");
SetLight(light_highspeed);
light_highspeed=~light_highspeed;
}
}
++tag_time;
if(tag_time==1)tag_time=0;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -