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

📄 jianma.c

📁 8279驱动程序 智能小车程序 键码程序 水温控制系统程序
💻 C
字号:
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>	

//-----宏声明-----
#define	C8279	XBYTE[0xf239]
#define	D8279	XBYTE[0xf238]
#define	uchar	unsigned	char

//-----变量定义-----
uchar	idata	codedat[10]; 	//键码存储数组
uchar 	idata 	diss[30];		//显示缓冲区
uchar 	code 	ledseg[]={	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//'0,1,2,3,4,5,6,7'
						 	0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71,//'8,9,a,b,c,d,e,f'
							0x00,0x40,0x37};						//' ,-,N'
sbit	CLOCK=P1^0;				//时钟脉冲
sbit	DAT=P1^1;				//数据串口
bit	 	bdata error=0;			//出错标志
uchar	dat;					//键码变量

//-----延时子程序-----
void delay(  )	
{
	unsigned int k,j;
	for(k=0;k<200;k++)		
	{
		for(j=0;j<500;j++);	
	}
}			
	
//-----初始化-----
void	first(  )	 	
{
	uchar i;
	C8279=0x00;				//置8279工作方式
	C8279=0x2f;				//置键盘扫描速率
	C8279=0xc1;				//清除LED显示
	while(C8279&0x80);		//等待清除结束	
	for(i=0;i<8;i++)
	{
		diss[i]=0x11;		//初始显示送缓冲区
	}
}


//----显示-----
void	disp(   )   	
{
	uchar	i;	
	for(i=0;i<8;i++)
	{
		C8279=i+0x80;
		D8279=ledseg[diss[7-i]];		
	}	
}

//-----刷新显示------
void dis0(   )
{
	uchar i;
	for(i=0;i<8;i++)
	{
		diss[i]=0x11;
	}	
	disp (  );
}

//-----负跳变-----
void	tb1_0(  )             				
{
	while(1)
	{
		if(CLOCK==1)
		{
			while(CLOCK==1);
			return;
		}		
	}
}		

//-----读取一个键码-----
void	read(   ) 
{
	uchar i;
	uchar count=0;		//数据信号'1'计数器			
	do
	{
		tb1_0(   );//读起始位
}while(DAT==1);
	for(i=0;i<8;i++)	//读取8位数据位
	{
		tb1_0();		
		if(DAT==1)
		{
			count++;
			dat=_cror_(dat,1)|0x80;//移位保存
		}
		else
		{
			dat=_cror_(dat,1)&0x7f;
		}
	}
	tb1_0(  );	//读校验位
	if(DAT==1)
	{
		if((count&0x01)==0x01)//奇校验
		{
			error=1;		//置出错标志
			return;
		}	
	}
	else
	{
		if((count&0x01)==0x00)//奇校验
		{
			error=1;	//置出错标志
			return;
		}
	}
	tb1_0(  );
	if(DAT==0)			//读结束位
	{
		error=1;	
	}
} 

//-----出错显示-----
void	errordis(  )
{
	diss[2]=0x0e;	//显示"ERROR"
	diss[3]=0x0a;
	diss[4]=0x0a;
	diss[5]=0x00;
	diss[6]=0x0a;
}

//-----数据送显示缓冲区-----
void disdeal(uchar n)
{
	uchar i;
	for(i=0;i<n;i++)
	{
		diss[3*i]=codedat[i]/16;
		diss[3*i+1]=codedat[i]%16;
		diss[3*i+2]=0x11;
	}
}

//-----动态显示-----
void  dismove(uchar movenum,uchar movetimes)
{
	uchar m,n;	//定义显示次数、移位迭代次数变量
	for(m=0;m<movetimes;m++)
	{
		disp();
		delay();
		for(n=0;n<movenum;n++)
		{
			diss[n]=diss[n+1];
		}
		movenum--;		
	}
}
		

//-----读取一组键码-----
void readdata()
{
	uchar i;
	error=0;	
	read();				//读取第一个键码
	if(error==1)		
	{
		errordis();		//出错显示
		return;
	}
	else
	{
		codedat[0]=dat;
		if(codedat[0]==0xe0)//判第一个键码是否为"E0"?
		{
			read();			//读第二个键码
			if(error==1)		
			{
				errordis();//出错显示
				return;
			}
			else
			{
				codedat[1]=dat;
				if(codedat[1]==0x12)//判第二个键码是否为"12"?
				{
					for(i=2;i<10;i++)//读取'PRNT SCRN'键的情况
					{
						read();
						if(error==1)
						{	
							errordis();//出错显示
							return;
						}
						codedat[i]=dat;
					}
					disdeal(10);	//显示处理
					dismove(29,21);	//移位动态显示			
				}
				else
				{
					for(i=2;i<5;i++)//读取五个键码的情况
					{				
						read();
						if(error==1)
						{	
							errordis();//出错显示
							return;
						}
						codedat[i]=dat;
					}
					disdeal(5);		//显示处理
					dismove(14,6);	//移位动态显示				
				}
			}			
		}
		else 
		{
			if(codedat[0]==0xe1)//判第一个键码是否为"E1"?
			{
				for(i=1;i<8;i++)//读取'PAUSE'键的情况
				{
					read();
					if(error==1)
					{	
						errordis();//出错显示
						return;
					}
					codedat[i]=dat;
				}
				disdeal(8);		//显示处理
				diss[24]=0x12;	//为'PAUSE'键,最后显示'NONE'
				diss[25]=0x00;
				diss[26]=0x12;
				diss[27]=0x0e;
				diss[28]=0x11;
				dismove(29,21);	//移位动态显示			
			}
			else	
			{
				for(i=1;i<3;i++)//读取三个键码的情况
				{
					read();
					if(error==1)
					{				//出错显示
						errordis();
						return;
					}
					codedat[i]=dat;
				}
				if((codedat[1]==0xf0)&&(codedat[0]==codedat[2]))//数据校验
				{
					disdeal(3);		//显示处理											
				}
				else
				{					//出错显示
					errordis();
				}
			}
		}
	}
}

//-----主程序-----
main()
{  first();		//初始化
	while(1)             
	{  dis0();		//刷新显示
		readdata();	//读键码
		disp();		//显示
		delay();	//延时
	}
}

⌨️ 快捷键说明

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