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

📄 maichong.c

📁 使用89s52单片机的 可根据按键设定而输出不同的脉冲信号的 单片机程序,使用keilC编写
💻 C
字号:
#include"reg51.h"
#include"absacc.h"
#include"stdio.h"
#include"math.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define LigCode XBYTE[0xffff]
#define LigSel XBYTE[0xdfff]
#define Keysel XBYTE[0xbfff]
uchar code BitTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位驱动码 
uchar code DispTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //字形码 
uchar idata Dispbuf[4];
uchar PluseArray[8][10];
uchar idata state;
uint idata keydelay;
uchar  idata displaynum;
uint idata number;
uchar idata mod;      //模式转换
uchar idata PluseNum;
uchar idata PluseState;//当输入脉冲显示状态
uchar idata fg;

typedef struct _model
{
	uchar length;
	uint time;
	uchar member[10];
}Model;

Model idata model[8];
Model tempmodel;


void READKEY();
void display();
void PluseTranslate();
void Init();


/*void mDelay(unsigned int Delay)      //延时子程序1ms
{  unsigned int i; 
 for(;Delay>0;Delay--) 
 { for(i=0;i<124;i++) 
  {;} 
 } 
} */
void Timer1()interrupt 3
{	
	TH1=(65536-2000)/256;
	TL1=(65536-2000)%256;
	if(state==0)
	{
		number++;
		if(number>model[mod].time/2)
		{
			number=0;
			PluseNum=PluseNum+1;
		}
		if(PluseNum==model[mod].length)
		PluseNum=0;

	}	
}


void READKEY()                      
{	
	uchar keytmp;
	uchar i;
	LigSel=0xfe;
	keytmp=Keysel;

	keytmp&=0xff;
	switch(keytmp)
{	case 0xff:
	if(fg!=0)
	fg=0;
	break;
	case 0xfe:
	if(fg==0)
	{
		fg=1;
		if(state>=1&&state<=10)
		{
			state=0;PluseState=1;number=0;PluseNum=0;
		}
	}
	break;
	case 0xf7:                   //加
	if( fg==0)
	
	{	fg=1;
		if(state==0)                //正常状态 
		{	mod++;
		if(mod==20)
		mod=1;
	
		}
		if(state==1)
		{
			tempmodel.time++;
			if(tempmodel.time==10000)
			{tempmodel.time=0;}
		}
		if(state==2)
		{
			tempmodel.length++;
			if(tempmodel.length==255)
			{tempmodel.length=0;}
		}
		if(state>=3&&state<=10)
	{	
		PluseArray[state-3][PluseState-1]=1;
		PluseState++;		
		if(PluseState==tempmodel.length+1)
		{state=state+1;PluseState=1;}
		if(state==11)
		{
			state=0;
				PluseNum=0;
			number=0;
			PluseTranslate();
			model[mod].time=tempmodel.time;model[mod].length=tempmodel.length;///////更新输出脉冲
			for(i=0;i<20;i++)
			{
				model[mod].member[i]=tempmodel.member[i];
			}
		}
	}
	}
		break;
	case 0xfb:             //减
	if(fg==0)
	{	fg=1;
		if(state==0)     ///正常状态
	{	mod--;
		if(mod==0)
		mod=20;
	
	}	
	if(state==1)
	{tempmodel.time--;
	if(tempmodel.time==0)
	tempmodel.time=9999;
	}
	if(state==2) 
	{
		tempmodel.length--;
		if(tempmodel.length==0)
		tempmodel.length=255;
	}
	if(state>=3&&state<=10)
	{	
		PluseArray[state-3][PluseState-1]=0;
		PluseState++;		
		if(PluseState==tempmodel.length+1)
		{state=state+1;PluseState=1;}
		if(state==11)
		{
			state=0;
			PluseNum=0;
			number=0;
			PluseTranslate();
			model[mod].time=tempmodel.time;model[mod].length=tempmodel.length;///////更新输出脉冲
			for(i=0;i<20;i++)
			{
				model[mod].member[i]=tempmodel.member[i];
			}
		}
	}
	}
	break;
	case 0xfd:                       //调整
	if(fg==0)
{	fg=1;
	state++;
	if(state==11)
	{
		state=0;
			PluseNum=0;
			number=0;
		PluseTranslate();
		model[mod].time=tempmodel.time;model[mod].length=tempmodel.length;///////更新输出脉冲
		for(i=0;i<20;i++)
		{
			model[mod].member[i]=tempmodel.member[i];
		}
	}
		if(state==1)
	{	
		tempmodel.time=model[mod].time;tempmodel.length=model[mod].length;     //用tempmodel装入当前结构体的值
		for(i=0;i<20;i++)
		{
			tempmodel.member[i]=model[mod].member[i];
		}
	}
	
	
	
	
	}
		break;
}
}

void Getcode()
{	uchar temp;
	uchar Displaynumber;
	if(state==0)
	{	Displaynumber=mod;   
		Dispbuf[0]=10;
		
	Dispbuf[1]=10;

	Dispbuf[2]=Displaynumber/10;
	temp=Displaynumber%10;
	Dispbuf[3]=temp;
	}
	if(state==1)
{	Displaynumber=tempmodel.time;
	Dispbuf[0]=Displaynumber/1000;
	temp=Displaynumber%1000;	
	Dispbuf[1]=temp/100;
	temp=temp%100;
	Dispbuf[2]=temp/10;
	temp=temp%10;
	Dispbuf[3]=temp;
}
	if(state==2)
	{
		Displaynumber=tempmodel.length;
		Dispbuf[0]=10;
		Dispbuf[1]=Displaynumber/100;
		temp=Displaynumber%100;
		Dispbuf[2]=Displaynumber/10;
		temp=temp/10;
		Dispbuf[3]=temp;
	}
	if(state>=3&&state<=10)
	{	Displaynumber=PluseState;
		Dispbuf[0]=state-2;
		Dispbuf[1]=10;
		Dispbuf[2]=PluseState/10;
		temp=PluseState%10;
		Dispbuf[3]=temp;
		
	}
	


}

void display()
{	uchar tmp;
	displaynum++;
	if(displaynum>3)
	displaynum=0;
	LigSel=BitTab[displaynum];
	tmp=Dispbuf[displaynum];
	LigCode=DispTab[tmp];
}

void PluseTranslate()
{uchar sum;
uchar i,j;
for(j=0;j<tempmodel.length;j++)	
{for(i=0;i<8;i++)
	sum+=PluseArray[i][j]*pow(2,i);
tempmodel.member[j]=sum;
}

}

void Init()
{uchar i,j;
for(j=1;j<10;j++)
{
	model[j].length=10;
	model[j].time=1000;
	for(i=0;i<10;i++)
	{
		model[j].member[i]=0xdd;
	}
}
}



void main()
{


P1=0xff;
fg=0;
mod=1;
state=0;
number=0;
mod=1;
keydelay=0;
Init();
TMOD=0x15;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
//TH0=(65536-2000)/256;
//TL0=(65536-2000)%256;
TR1=1;
//TR0=1;
EA=1;
ET1=1;
//ET0=1;
while(1)
{	keydelay++;				
	if(keydelay>1000)
	{	LigCode=0x00;
			READKEY();
			keydelay=0;
			}
if(state==0)
{	
	P1=model[mod].member[PluseNum];
}
Getcode();           //取得显示数字
	
display();       //显示

}	
	}

⌨️ 快捷键说明

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