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

📄 c8051f021.c

📁 片上系统单片机C8051F021的应用程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	}
	for(i=0;i<4;i++)		//写入pwnum1
	{
		*pwrite=pwnum1[i];
		pwrite++;
	}
	PSCTL=0x00;
	FLSCL&=0xc0;
	EA=1;
}

/*---------------功能一显示子程序------------------------*/				
void f1disp(void)
{
	f1co++;
	if (f1co==10)
	{
		f1co=0;
		npd_ad(0x80,adnum0[0],adnum0[1],adnum0[2]);	//显示第一路AD
		wr_lcd(comm,0x30);
		wr_lcd(comm,0x95);
		wr_lcd(dat,0x56);			//显示V
		npd_ad(0x88,adnum1[0],adnum1[1],adnum1[2]);	//显示第二路AD
		wr_lcd(comm,0x30);
		wr_lcd(comm,0x9d);
		wr_lcd(dat,0x56);			//显示V
	}
}
/*---------------功能二一显示子程序------------------------*/				
void f2disp(void)
{
	switch (f2count)
	{
		case 0:
		{
			chns_disp(tab2);
			npd_da(0x88,danum0[0],danum0[1],danum0[2],danum0[3]);	//显示第一路AD
			break;
		}
		case 1:
		{
			chns_disp(tab3);
			npd_da(0x88,danum1[0],danum1[1],danum1[2],danum1[3]);	//显示第二路AD
			break;
		}
	}
	wr_lcd(comm,0x30);
	wr_lcd(comm,0x9e);
	wr_lcd(dat,0x20);
	wr_lcd(dat,0x56);			//显示V
}
/*---------------功能三显示子程序------------------------*/				
void f3disp(void)
{
	switch (f3count)
	{
		case 0:
		{
			chns_disp(tab5);
			//npd_da(0x80,pwpr0[0],pwpr0[1],pwpr0[2],pwpr0[3]);		//显示占空比
			npd_da(0x88,pwnum0[0],pwnum0[1],pwnum0[2],pwnum0[3]);	//显示第一路PWM
			break;
		}
		case 1:
		{
			chns_disp(tab6);
			//npd_da(0x80,pwpr1[0],pwpr1[1],pwpr1[2],pwpr1[3]);		//显示占空比
			npd_da(0x88,pwnum1[0],pwnum1[1],pwnum1[2],pwnum1[3]);	//显示第二路PWM
			break;
		}
	}
	wr_lcd(comm,0x30);
	wr_lcd(comm,0x9e);
	wr_lcd(dat,0x20);
	wr_lcd(dat,0x56);			//显示V
}
/*---------------功能四显示子程序------------------------*/				
void f4disp(void)
{
	chns_disp(tab7);
	if (fqnum0[0]==0&&fqnum0[1]==0&&fqnum0[2]==0)
	{
		npd_fa(0x88,fqnum0[3],fqnum0[4],fqnum0[5]);		//XXX
		wr_lcd(comm,0x30);			//HZ
		wr_lcd(comm,0x9d);
		wr_lcd(dat,0x48);
		wr_lcd(dat,0x5a);
	}
	else if(fqnum0!=0)
	{
		npd_fb(0x88,fqnum0[0],fqnum0[1],fqnum0[2],fqnum0[3]);	//XXX.X
		wr_lcd(comm,0x30);			//KHZ
		wr_lcd(comm,0x9e);
		wr_lcd(dat,0x20);
		wr_lcd(dat,0x4b);
		wr_lcd(comm,0x9f);
		wr_lcd(dat,0x48);
		wr_lcd(dat,0x5a);
	}
	else
	{
		npd_da(0x88,fqnum0[1],fqnum0[2],fqnum0[3],fqnum0[4]);	//XX.XX
		wr_lcd(comm,0x30);			//KHZ
		wr_lcd(comm,0x9e);
		wr_lcd(dat,0x20);
		wr_lcd(dat,0x4b);
		wr_lcd(comm,0x9f);
		wr_lcd(dat,0x48);
		wr_lcd(dat,0x5a);
	}
}	
/*---------------图形数字显示子程序1------------------------*/	
void npd_ad(uchar lcd_x,uchar num1,uchar num2,uchar num3)	//显示三位数字num1,num2,num3,形式为X.XX.
{															//可选择在上下半屏幕显示:
															//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
	uchar lcd_y=0x80;
	uchar i=0;
	uchar j=0;
	uchar code *nump;	//数字图形表指针
	uchar py=0;				//表指针偏移量
	for (j=0;j<32;j++)			//显示第1,2个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num1);	//显示num1
		py=j*3;				//修改显示的起始地址,到下一行
		for (i=0;i<3;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		nump=tabd;			//显示小数点
		py=j;
		wr_lcd(dat,nump[py]);
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第3,4个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num2);	//显示num2
		py=j*3;				//修改显示的起始地址,到下一行
		for (i=0;i<3;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		nump=selnt(num3);	//显示num3的第一列
		py=j*3;
		wr_lcd(dat,nump[py]);
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第5,6个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num3);	//显示num3的剩余两列
		py=j*3+1;				//修改显示的起始地址,到下一行
		for (i=0;i<2;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		for (i=0;i<2;i++)		//空显示两列
		{
			wr_lcd(dat,0x00);
		}
		lcd_y++;
	}
	wr_lcd(comm,0x36);
}
/*---------------图形数字显示子程序2------------------------*/	
void npd_da(uchar lcd_x,uchar num1,uchar num2,uchar num3,uchar num4)	//显示三位数字num1,num2,num3,num4.形式为XX.XX.
{															//可选择在上下半屏幕显示:
															//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
	uchar lcd_y=0x80;
	uchar i=0;
	uchar j=0;
	uchar code *nump;	//数字图形表指针
	uchar py=0;				//表指针偏移量
	for (j=0;j<32;j++)			//显示第1,2个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		if (num1==0)
		{
			for (i=0;i<3;i++)
			{
				wr_lcd(dat,0x00);
			}
		}
		else
		{
			nump=selnt(num1);	//显示num1
			py=j*3;				//修改显示的起始地址,到下一行
			for (i=0;i<3;i++)
			{
				wr_lcd(dat,nump[py+i]);
			}
		}
		nump=selnt(num2);			//显示num2
		py=j*3;
		wr_lcd(dat,nump[py]);
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第3,4个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num2);	//显示num2
		py=j*3+1;				//修改显示的起始地址,到下一行
		for (i=0;i<2;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		nump=tabd;			//显示小数点
		py=j;
		wr_lcd(dat,nump[py]);
		nump=selnt(num3);			//显示num3
		py=j*3;
		wr_lcd(dat,nump[py]);
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第5,6个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num3);	//显示num3的剩余两列
		py=j*3+1;				//修改显示的起始地址,到下一行
		for (i=0;i<2;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		nump=selnt(num4);	//显示num4
		py=j*3;
		for (i=0;i<2;i++)		
		{
			wr_lcd(dat,nump[py+i]);
		}
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第7,8个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num4);	//显示num4的剩余一列
		py=j*3+2;				//修改显示的起始地址,到下一行
		wr_lcd(dat,nump[py]);
		for (i=0;i<3;i++)		//空显示三列
		{
			wr_lcd(dat,0x00);
		}
		lcd_y++;
	}
	wr_lcd(comm,0x36);
}
/*---------------图形数字显示子程序3------------------------*/	
void npd_fa(uchar lcd_x,uchar num1,uchar num2,uchar num3)	//显示三位数字num1,num2,num3.形式为XXX.
{															//可选择在上下半屏幕显示:
															//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
	uchar lcd_y=0x80;
	uchar i=0;
	uchar j=0;
	uchar code *nump;	//数字图形表指针
	uchar py=0;				//表指针偏移量
	for (j=0;j<32;j++)			//显示第1,2个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		if (num1==0)
		{
			for (i=0;i<3;i++)
			{
				wr_lcd(dat,0x00);
			}
		}
		else
		{
			nump=selnt(num1);	//显示num1
			py=j*3;				//修改显示的起始地址,到下一行
			for (i=0;i<3;i++)
			{
				wr_lcd(dat,nump[py+i]);
			}
		}
		if (num2==0)			
		{
			wr_lcd(dat,0x00);
		}
		else
		{
			nump=selnt(num2);			//显示num2
			py=j*3;
			wr_lcd(dat,nump[py]);
		}
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第3,4个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		if (num2==0)			
		{
			for (i=0;i<2;i++)
			{
				wr_lcd(dat,0x00);
			}
		}
		else
		{
			nump=selnt(num2);	//显示num2
			py=j*3+1;				//修改显示的起始地址,到下一行
			for (i=0;i<2;i++)
			{
				wr_lcd(dat,nump[py+i]);
			}
		}
		nump=selnt(num3);			//显示num3
		py=j*3;
		for (i=0;i<2;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第5,6个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num3);		//显示num3的剩余一列
		py=j*3+2;				//修改显示的起始地址,到下一行
		wr_lcd(dat,nump[py+i]);
		for (i=0;i<3;i++)		
		{
			wr_lcd(dat,0x00);
		}
		lcd_y++;
	}
	wr_lcd(comm,0x36);
}
/*---------------图形数字显示子程序4------------------------*/	
void npd_fb(uchar lcd_x,uchar num1,uchar num2,uchar num3,uchar num4)	//显示三位数字num1,num2,num3,num4.形式为XXX.X
{															//可选择在上下半屏幕显示:
															//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
	uchar lcd_y=0x80;
	uchar i=0;
	uchar j=0;
	uchar code *nump;	//数字图形表指针
	uchar py=0;				//表指针偏移量
	for (j=0;j<32;j++)			//显示第1,2个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		if (num1==0)
		{
			for (i=0;i<3;i++)
			{
				wr_lcd(dat,0x00);
			}
		}
		else
		{
			nump=selnt(num1);	//显示num1
			py=j*3;				//修改显示的起始地址,到下一行
			for (i=0;i<3;i++)
			{
				wr_lcd(dat,nump[py+i]);
			}
		}
		if (num2==0)			
		{
			wr_lcd(dat,0x00);
		}
		else
		{
			nump=selnt(num2);			//显示num2
			py=j*3;
			wr_lcd(dat,nump[py]);
		}
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第3,4个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		if (num2==0)			
		{
			for (i=0;i<2;i++)
			{
				wr_lcd(dat,0x00);
			}
		}
		else
		{
			nump=selnt(num2);	//显示num2
			py=j*3+1;				//修改显示的起始地址,到下一行
			for (i=0;i<2;i++)
			{
				wr_lcd(dat,nump[py+i]);
			}
		}
		nump=selnt(num3);			//显示num3
		py=j*3;
		for (i=0;i<2;i++)
		{
			wr_lcd(dat,nump[py+i]);
		}
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第5,6个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num3);		//显示num3的剩余一列
		py=j*3+2;				//修改显示的起始地址,到下一行
		wr_lcd(dat,nump[py+i]);
		nump=tabd;			//显示小数点
		py=j;
		wr_lcd(dat,nump[py]);
		nump=selnt(num4);		//显示num4
		py=j*3;
		for (i=0;i<2;i++)		
		{
			wr_lcd(dat,nump[py+i]);
		}
		lcd_y++;
	}
	lcd_x+=0x02;
	lcd_y=0x80;
	for (j=0;j<32;j++)			//显示第7,8个汉字的位置
	{
		wr_zb(lcd_x,lcd_y);
		nump=selnt(num4);	//显示num4的剩余一列
		py=j*3+2;				//修改显示的起始地址,到下一行
		wr_lcd(dat,nump[py]);
		for (i=0;i<3;i++)		//空显示三列
		{
			wr_lcd(dat,0x00);
		}
		lcd_y++;
	}
	wr_lcd(comm,0x36);
}

uchar code * selnt(uchar i)				//选择数字(无小数点)码的表地址
{										//数字放在i中
	switch (i)
	{
		case 0: return tabn0;break;
		case 1: return tabn1;break;
		case 2: return tabn2;break;
		case 3: return tabn3;break;
		case 4: return tabn4;break;
		case 5: return tabn5;break;
		case 6: return tabn6;break;
		case 7: return tabn7;break;
		case 8: return tabn8;break;
		case 9: return tabn9;break;
	}
}
/*------------------运算子程序--------------------*/
void bcda4(uchar *a,uchar b0,uchar b1,uchar b2,uchar b3)	
{															//BCD码加法子程序,*a0_*a3+b0_b3,结果放在*a1_*a3中
	a[3]+=b3;
	if (a[3]>=10)
	{
		a[3]-=10;
		a[2]+=1;
	}
	a[2]+=b2;
	if (a[2]>=10)
	{
		a[2]-=10;
		a[1]+=1;
	}
	a[1]+=b1;
	if (a[1]>=10)
	{
		a[1]-=10;
		a[0]+=1;
	}
	a[0]+=b0;
	if (a[0]>=10)
	{
		a[0]-=10;
	}
}
	
void bcds4(uchar *a,uchar b0,uchar b1,uchar b2,uchar b3)	
{															//BCD码减法子程序,*a0_*a3-b0_b3,结果放在*a1_*a3中
	if (a[3]<b3)
	{
		a[2]-=1;
		if (a[2]==255)
		{
			a[2]=9;
			a[1]-=1;
			if (a[1]==255)
			{
				a[1]=9;
				a[0]-=1;
				if (a[0]==255)
				{
					a[0]=9;
				}
			}
		}
		a[3]+=10;
	}
	a[3]-=b3;
	if (a[2]<b2)
	{
		a[1]-=1;
		if (a[1]==255)
		{
			a[1]=9;
			a[0]-=1;
			if (a[0]==255)
			{
				a[0]=9;
			}
		}
		a[2]+=10;
	}
	a[2]-=b2;
	if (a[1]<b1)
	{
		a[0]-=1;
		if (a[0]==255)
		{
			a[0]=9;
		}
		a[1]+=10;
	}
	a[1]-=b1;
	if (a[0]<b0)
	{
		a[3]+=10;
	}
	a[0]-=b0;
}
uint bcdhb(uchar *a,uchar n)		//将a数组存放在BCD码合并到res指向的uint型的数中,a数组的元素个数为n
{
	uchar i=0;
	uint res=0;
	for (;i<n;i++)
	{
		res*=10;
		res+=a[i];
	}
	return res;
}			
/*------------------主程序--------------------*/
void main ()
{
	SP=0x7f;
	PSW=0x00;
	config();
	init_lcd();
	init_disp();
	pwnum0[0]=0;
	pwnum0[1]=0;
	pwnum0[2]=0;
	pwnum0[3]=0;
	pwnum1[0]=0;
	pwnum1[1]=0;
	pwnum1[2]=0;
	pwnum1[3]=0;
	flashre();
	while (1)
	{
		keyans();
		adfun();
		dafun();
		pwm0fun();
		pwm1fun();
		if (fun1==1)
		{
			f1disp();
		}
		if (fun2==1)
		{
			f2disp();
		}
		if (fun3==1)
		{
			f3disp();
		}
		if (fun4==1)
		{
			f4disp();
		}
		//delay1 (8000);

   	}
}
void tt0(void) interrupt 1 using 1
{
	TR0=0;
	ET0=0;
	kscan();
	TL0=0xea;				
	TH0=0xcb;
	TR0=1;
	ET0=1;		
}
void pca(void) interrupt 9
{
	CF=0;
	if (pwnum0[0]==0&&pwnum0[1]==0&&pwnum0[2]==0&&pwnum0[3]==0)
	{
		PCA0CPM0&=0xbf;		//将ECOM0清1
	}
	else 
	{
		PCA0CPM0|=0x40;		//将ECOM0置1		
		PCA0CPL0=pwcp0l;
		PCA0CPH0=pwcp0h;
	}
	if (pwnum1[0]==0&&pwnum1[1]==0&&pwnum1[2]==0&&pwnum1[3]==0)
	{
		PCA0CPM1&=0xbf;		//将ECOM1置1
	}
	else 
	{
		PCA0CPM1|=0x40;		//将ECOM0置1
		PCA0CPL1=pwcp1l;
		PCA0CPH1=pwcp1h;
	}
}

⌨️ 快捷键说明

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