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

📄 shouchiji2.c

📁 这事我在公司的时候
💻 C
字号:
/**********************************************/
//题目:手持机启动程序
//功能:启动设备
//创作人:李焕杰
//创作时间:2006/08/08
/*********************************************/
#include <at892051.H>
#include <intrins.h>

#define unchar unsigned char
#define unint unsigned int

sbit hunzhan=P3^3;
sbit duizhan=P3^2;
sbit jia=P3^5;
sbit jian=P3^4;
sbit lamp=P3^7;
sbit lamphz=P1^0;
sbit lampdz=P1^1;
sbit qh=P1^2;//切换键,设置生命数还是子弹数

sbit LED_DATA=P1^5;//4094,显示
sbit LED_CLK=P1^4;
sbit LED_OE=P1^7;
sbit LED_STB=P1^6;

unchar i;qiehuan;
unint ming;zidan;

unint fashe1;fashe2;fashe3;
unchar Led[6];
unchar Countl,send,a,dsjs;
unchar code ledbuf[19] = // digit convert table segment=0,on
	{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff, //共阴极段表
   //  0    1    2    3    4    5    6   7   8    9     消隐
   0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unchar code fsbuf[10] ={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};

//**************
//*延时函数
//延时4个周期
//**************
void delay()
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

//*******************
//*4094显示函数
//*******************
void SendLED_Byte(unchar by)
{
    unchar sa;
	LED_CLK=0;
    _nop_();
    LED_DATA=0;
    _nop_();
    for(sa=0;sa<8;sa++)
    {
		LED_DATA=by&1;
		by=by>>1;
		delay();
		LED_CLK=1;
		delay();
		LED_CLK=0;
    	delay();
	}
}

void displed(unint mm,zz)
{
	unchar jj,send;
	LED_STB=1;
	LED_OE=0;
	Led[2]=mm/100;
	Led[1]=(mm-Led[2]*100)/10;
	Led[0]=(mm-Led[2]*100)%10;
	Led[5]=zz/100;
	Led[4]=(zz-Led[5]*100)/10;
	Led[3]=(zz-Led[5]*100)%10;
    for(jj=0;jj<6;jj++)
    {
       send=ledbuf[Led[jj]];
       SendLED_Byte(send);
    }
	LED_OE=1;
}

//*********
//发射函数
//功能:实现三位十进制数转换成发射需要的十六进制数
//**********
void fshs(unint m,z)
{
	unint fs1,fs2,fs3,fs4,fs5,fs6,fsm,fsz;
    fs1=m/100;
	fs2=(m-fs1*100)/10;
	fs3=(m-fs1*100)%10;
	fs4=z/100;
	fs5=(z-fs4*100)/10;
	fs6=(z-fs4*100)%10;
	fsm=fsbuf[fs2];
	fsz=fsbuf[fs4];
	fsm=fsm>>4;
	fsz=fsz>>4;
	fashe1=fsbuf[fs1]^fsm;
	fashe2=fsbuf[fs3]^fsz;
	fsz=fsbuf[fs6];
	fsz=fsz>>4;
	fashe3=fsbuf[fs5]^fsz;
}

//*********
//*定时中断0
//**********
void timer0() interrupt 1 using 2
{
	dsjs++;
	if(dsjs==20)
	{
		dsjs=0;
		a=a+1;
		TR0=0;											
		TH0=0X4c;     //定时50ms
		TL0=0X00;
	}
	else
    {
		TH0=0X4c;     //定时50ms
		TL0=0X00;
	}
}

/***********************************************
延时函数  //xms
************************************************/
void delayxms(unint x)
{                         //延时程序,延时x毫秒
      unint j;
	  do
	  {
	  	j=300;
	  	while(--j);
	  } while(--x);
}

main()
{
	SP=0x50;
	PCON=0X00;
	SCON = 0x51;	// Serial port1 data Mode 1 and enable receiver	
	TMOD = 0x22;	// 定时器1方式2,定时器0方式2
	TH1 = 0xe8;	    //定时器初值
	TL1 = 0xe8;
	TH0=0X4c;     //定时50ms
	TL0=0X00;
	ET0=1;//定时器0允许
	TR1=1;
	EA=1;
	lamp=1;
	lamphz=1;
	lampdz=1;
	a=0;
	ming=0;
	zidan=100;
	qiehuan=0;
	displed(ming,zidan);
	delayxms(20);
	while(1)
	{
		_nop_();
		_nop_();
		if(!qh)
		{
			if(qiehuan==0)
				qiehuan=1;
			else
				qiehuan=0;
		delayxms(200);
		}
		if(!jia||!jian)
			TR0=1;
		else
		{
			TR0=0;
			a=0;
		}
		if(!jia)//命数增加
		{
			if(qiehuan)
			{
				if(a==1)
				{
					a=0;
					if(ming<990)
						ming=ming+10;
					else
						ming=999;//最大999条命
				}
				else
				{
					if(ming<999)
						ming=ming+1;
					else
						ming=999;
				}
				displed(ming,zidan);//显示命数
				delayxms(100);//延时100ms
			}
			else
			{
				if(a==1)
				{
					a=0;
					if(zidan<990)
						zidan=zidan + 20;
					else
						zidan=999;//最大999条命
				}
				else
				{
					if(zidan<999)
						zidan=zidan+1;
					else
						zidan=999;
				}
				displed(ming,zidan);//显示子弹数
				delayxms(100);//延时100ms
			}
		}
		if(!jian)//命数减少
		{
			if(qiehuan)
			{
				if(a==1)
				{
					a=0;
					if(ming>10)
						ming=ming - 10;
					else
						ming=0;//命最少为0
				}
				else
				{
					if(ming>0)
						ming=ming - 1;
					else
						ming=0;
				}
				displed(ming,zidan);//显示出命
				delayxms(100);//延时100ms
			 }
			 else
			 {
			 	if(a==1)
				{
					a=0;
					if(zidan>10)
						zidan=zidan - 20;
					else
						zidan=0;//命最少为0
				}
				else
				{
					if(zidan>0)
						zidan=zidan - 1;
					else
						zidan=0;
				}
				displed(ming,zidan);//显示子弹
				delayxms(100);//延时100ms
			 }
		}
			if(!hunzhan&&duizhan)//混战模式
			{	
				lamp=0;//指示灯亮
				lamphz=0;
				lampdz=1;
				fshs(ming,zidan);//调用函数,把命数调整为可以发射的十六进制数
				for(i=0;i<2;i++)
				{
					SBUF=0xaa;
					while(TI==0);
					TI=0;
					SBUF=0x00;
					while(TI==0);
					TI=0;
					SBUF=fashe1;
					while(TI==0);
					TI=0;
					SBUF=fashe2;
					while(TI==0);
					TI=0;
					SBUF=fashe3;
					while(TI==0);
					TI=0;
					SBUF=0xbb;
					while(TI==0);
					TI=0;
					SBUF=0xaa^fashe1^fashe2^fashe3^0xbb;//校验位
					while(TI==0);
					TI=0;
				}
				hunzhan=1;
				delayxms(50);
				lamp=1;
		}
			if(!duizhan&&hunzhan)//队战模式
			{
				fshs(ming,zidan);//调用函数,把命数调整为可以发射的十六进制数
				lamp=0;//指示灯亮
				lampdz=0;
				lamphz=1;
				for(i=0;i<2;i++)
				{
					SBUF=0xaa;
					while(TI==0);
					TI=0;
					SBUF=0xf0;
					while(TI==0);
					TI=0;
					SBUF=fashe1;
					while(TI==0);
					TI=0;
					SBUF=fashe2;
					while(TI==0);
					TI=0;
					SBUF=fashe3;
					while(TI==0);
					TI=0;
					SBUF=0xbb;
					while(TI==0);
					TI=0;
					SBUF=0xaa^0xf0^fashe1^fashe2^fashe3^0xbb;
					while(TI==0);
					TI=0;
				}
				duizhan=1;
				delayxms(50);
				lamp=1;//指示灯灭
			}
			if(!jia&&!jian)//结束
			{
				for(i=1;i<51;i++)
				{
					SBUF=0xaa;
					while(TI==0);
					TI=0;
					SBUF=0x92;
					while(TI==0);
					TI=0;
					SBUF=00;
					while(TI==0);
					TI=0;
					SBUF=i;
					while(TI==0);
					TI=0;
					SBUF=00;
					while(TI==0);
					TI=0;
					SBUF=00;
					while(TI==0);
					TI=0;
					SBUF=0xaa^0x92^i;
					while(TI==0);
					TI=0;
				}
			}
	}
}

⌨️ 快捷键说明

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