📄 pp.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 + -