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

📄 pp.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
字号:
#include "PP.h"
#include "System.h" 
#include "LCD.h"
#include "menu.h"

bit disflag=0;
unsigned char ADDAParaList[]={0,1,12,20,30,40,16,0};
unsigned char PPSendBuf[256];
unsigned char PPReceBuf[257];
unsigned char data PSendCnt;
unsigned char data PReceCnt;
unsigned int data RecvTotal;

unsigned char code SinTable[]={ 					//一周期256点sin值表(幅度:0~255)
   128,   131,   134,   137,   140,   143,   146,   149,   152,   156, 
  159,   162,   165,   168,   171,   174,   176,   179,   182,   185, 
  188,   191,   193,   196,   199,   201,   204,   206,   209,   211, 
  213,   216,   218,   220,   222,   224,   226,   228,   230,   232, 
  234,   236,   237,   239,   240,   242,   243,   245,   246,   247, 
  248,   249,   250,   251,   252,   252,   253,   254,   254,   255, 
  255,   255,   255,   255,   255,   255,   255,   255,   255,   255, 
  254,   254,   253,   252,   252,   251,   250,   249,   248,   247, 
  246,   245,   243,   242,   240,   239,   237,   236,   234,   232, 
  230,   228,   226,   224,   222,   220,   218,   216,   213,   211, 
  209,   206,   204,   201,   199,   196,   193,   191,   188,   185, 
  182,   179,   176,   174,   171,   168,   165,   162,   159,   156, 
  152,   149,   146,   143,   140,   137,   134,   131,   128,   124, 
  121,   118,   115,   112,   109,   106,   103,    99,    96,    93, 
   90,    87,    84,    81,    79,    76,    73,    70,    67,    64, 
   62,    59,    56,    54,    51,    49,    46,    44,    42,    39, 
   37,    35,    33,    31,    29,    27,    25,    23,    21,    19, 
   18,    16,    15,    13,    12,    10,     9,     8,     7,     6, 
    5,     4,     3,     3,     2,     1,     1,     0,     0,     0, 
    0,     0,     0,     0,     0,     0,     0,     0,     1,     1, 
    2,     3,     3,     4,     5,     6,     7,     8,     9,    10, 
   12,    13,    15,    16,    18,    19,    21,    23,    25,    27, 
   29,    31,    33,    35,    37,    39,    42,    44,    46,    49, 
   51,    54,    56,    59,    62,    64,    67,    70,    73,    76, 
   79,    81,    84,    87,    90,    93,    96,    99,   103,   106, 
  109,   112,   115,   118,   121,   124,};

///////////////////////////////////////////////////////////
//并口传输试验设置界面
void PPSetUp()
{
	bit PaintFlag=1;						//绘制曲线标志位
	bit MovHand=1;							//绘制光标标志位
	char data ItemSel=1;					//光标所在行
	Clear(0,240);
	dprintf(10,0,"并口传输实验设置");
	dprintf(2,16*1,"选择波形:");
	if(ADDAParaList[0])
	dprintf(2,16*2,"妚正弦波  盅梯形波");
	else
	dprintf(2,16*2,"盅正弦波  妚梯形波");
	dprintf(2,16*3,"波形示例:");
	dprintf(0,16*12,line);
	dprintf(0,16*13,"选择项目 改变参数");
	dprintf(1,16*14, "芗  兦   戛  戋");
	dprintf(35,16*14, "确定");

	while(1)
	{		
		if(CheckKeyF==1)			//键盘检测
		{
			CheckKey();
			CheckKeyF=0;
		}

		if(MovHand)
		{
			int i;
			for(i=0;i<12;i++)
			{
				if(ItemSel==i)
				dprintf(0,i*16,"贲");
				else
				dprintf(0,i*16,"  ");
			}
			MovHand=0;
		}

		if(PaintFlag)
		{	
			int data i;
			PaintFlag=0;
			Clear(16*4,16*9);
			//横轴
			drawline(32,16*9-8,288,16*9-8);
			//纵轴
			drawline(32,16*9-9,32,16*4+4);
			if(ADDAParaList[0]==0)		//正弦波
			{
				for(i=0;i<256;i++)
				PPSendBuf[i]=SinTable[i];
			}
			else						//梯形波
			{
				i=0;
				for(;i<ADDAParaList[3]*2.56;i++)									//上升沿
				PPSendBuf[i]=(unsigned char)(0xFF*i/(ADDAParaList[3]*2.56));
				for(;i<(ADDAParaList[3]+ADDAParaList[4])*2.56;i++)					//高电平
				PPSendBuf[i]=0xFF;
				for(;i<(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5])*2.56;i++)	//下降沿
				PPSendBuf[i]=0xFF-(unsigned char)(0xFF*(i-(ADDAParaList[3]+ADDAParaList[4])*2.56)/(ADDAParaList[5]*2.56));
				for(;i<256;i++)												//低电平
				PPSendBuf[i]=0;
			}
			for(i=0;i<255;i++)
			Point(i+32,16*9-8-PPSendBuf[i]/4);
		}	

		if(Key[0].pressed==1)       //检测到上键
		{
	        Key[0].pressed=0;
			switch(ItemSel)
			{
			case 1:
				break;
			case 9:
				ItemSel=1;
				break;
			default:
				ItemSel--;
				break;
			}
			MovHand=1;				
		}

		if(Key[1].pressed==1)       //检测到下键
		{
	        Key[1].pressed=0;
			switch(ItemSel)
			{
			case 1:
				if(ADDAParaList[0]==1)		ItemSel=9;
				break;
			case 11:
				break;
			default:
				ItemSel++;
				break;
			}
			MovHand=1;		
		}

		if(Key[2].pressed==1)       //检测到-键
		{
	        Key[2].pressed=0;
			switch(ItemSel)
			{
			case 1:
				if(ADDAParaList[0]==1)
				{
					ADDAParaList[0]=0;
					dprintf(2,16*2,"盅");
					dprintf(12,16*2,"妚");
					PaintFlag=1;
					Clear(16*9,16*12);
				}
				break;
			case 9:
				if(ADDAParaList[3]>0)
				{
					ADDAParaList[3]-=10;
					putufig(9,16*9, ADDAParaList[3],3,0,' ');
					PaintFlag=1;
				}
				break;
			case 10:
				if(ADDAParaList[4]>0)
				{
					ADDAParaList[4]-=10;
					putufig(9,16*10, ADDAParaList[4],3,0,' ');
					PaintFlag=1;
				}
				break;
			case 11:
				if(ADDAParaList[5]>0)
				{
					ADDAParaList[5]-=10;
					putufig(9,16*11, ADDAParaList[5],3,0,' ');
					PaintFlag=1;
				}
				break;
			default:
				break;
			}
		}

		if(Key[3].pressed==1)       //检测到+键
		{
	        Key[3].pressed=0;
			switch(ItemSel)
			{
			case 1:
				if(ADDAParaList[0]==0)
				{
					ADDAParaList[0]=1;
					dprintf(12,16*2,"盅");
					dprintf(2,16*2,"妚");
					PaintFlag=1;
					dprintf(2,16*9, "上升比:   %");
					putufig(9,16*9, ADDAParaList[3],3,0,' ');
					dprintf(2,16*10,"高电平:   %");
					putufig(9,16*10, ADDAParaList[4],3,0,' ');
					dprintf(2,16*11,"下降比:   %");
					putufig(9,16*11, ADDAParaList[5],3,0,' ');
				}
			case 9:
				if(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5]<=90)
				{
					ADDAParaList[3]+=10;
					putufig(9,16*9, ADDAParaList[3],3,0,' ');
					PaintFlag=1;
				}
				break;
			case 10:
				if(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5]<=90)
				{
					ADDAParaList[4]+=10;
					putufig(9,16*10, ADDAParaList[4],3,0,' ');
					PaintFlag=1;
				}
				break;
			case 11:
				if(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5]<=90)
				{
					ADDAParaList[5]+=10;
					putufig(9,16*11, ADDAParaList[5],3,0,' ');
					PaintFlag=1;
				}
			default:
				break;
			}
			MovHand=1;
		}

		if(Key[7].pressed==1)       //确定键
		{
			ClearKey();
			Clear(0,240);
			return;
		}
	}//while(1)
}

//并口端口初始化
void PP_Port_Ini()
{
	P4MDOUT = 0xF0;		//P4高四位输出,低四位输入
	P4 |= 0x0F;
	Wait = 0;
	Intr = 1;
	OE = 0;
	P7MDOUT |= 0x0C;
}

//EPP模式单片机端程序(EPP时序),发送PPSendBuf中数据,接收则存入PPReceBuf
void EPP_SLAVE()
{
	if(!DStrb)			//等待PC端信号
	{
		OE=0;
		if(Write)				//PC端要求读,发送PPSendBuf中数据
		{
			P6MDOUT = 0xFF;		//P6输出模式
			DIR = 1;			//控制74HC245

			P6 = PPSendBuf[PSendCnt];	//发送数据
			Wait = 1;			//通知主机数据准备好
			while(!DStrb);		//主机返回读成功信号
			Wait = 0; 			//等待下次传输
			PSendCnt++;
		}
		else					//PC端要求写,接收数据存入PPReceBuf
		{
			P6MDOUT=0x00;		//配置P6为数字输入 (数字输入=漏极开路+SFR写1)
			P6=0xFF;
			DIR = 0;			//控制74HC245

			Wait = 1;			//返回接收成功信号
			while(!DStrb);		//主机确认数据准备好
			PPReceBuf[PReceCnt]=P6;		//保存数据
   			Wait = 0;			//等待下次传输

			if(PPReceBuf[PReceCnt]==0 || PReceCnt==0xFF)
			disflag=1;
			PReceCnt++;
			RecvTotal++;
		}
	}
}

void ADDA()
{	
	PPSetUp();	  //0123456789012345678901234567890123456789
	Udprintf(0,208," 接收字节数:     0Byte                  ");
	dprintf(35,16*14, "退出");
	PP_Port_Ini();
	PReceCnt=0;

	RecvTotal=0;
	X=0;Y=0;F=0;
	while(1)
	{
		EPP_SLAVE();

		if(CheckKeyF==1)			//键盘检测
		{
			CheckKey();
			CheckKeyF=0;
		}

		if(disflag)
		{
			char *p;
			OE = 1;
			//显示接受到的字符
			p=tprintf(X,Y,PPReceBuf);
			while(F)
			{
				Clear(0,208);
				X=0;Y=0;F=0;
				tprintf(X,Y,p);
			}
			putufig(13,16*13,RecvTotal,5,1,' ');
			OE = 0;
			PReceCnt=0;
			disflag=0;
		}

		if(Key[7].pressed==1)
		{
			OE = 1;
			ClearKey();
			Clear(0,240);
			return;
		}
	}
}

⌨️ 快捷键说明

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