📄 cmpmnckj.c
字号:
}
if(n==1 || (n==0 && m==3))
{
FSsj(0X1B);//3#按键
FSsj('j');
if(m==3)
{FSsj((0X9000+Xzsj+2+4+(35+4)*2+2)>>8);}
if(m!=3)
{FSsj((0X8000+Xzsj+2+4+(35+4)*2+2)>>8);}
FSsj(Xzsj+2+4+(35+4)*2+2);
FSsj(Yzsj+2+4+2>>8);
FSsj(Yzsj+2+4+2);
FSsj((Xzsj+2+4+35+(35+4)*2-2)>>8);
FSsj(Xzsj+2+4+35+(35+4)*2-2);
FSsj(Yzsj+2+4+35-2>>8);
FSsj(Yzsj+2+4+35-2);
FSsj(0X1B);
FSsj('z');
FSsj((0Xf000+Xzsj+2+4+(35+4)*2+2+6)>>8);
FSsj(Xzsj+2+4+(35+4)*2+2+6);
FSsj(0X8000+Yzsj+2+4+2+10>>8);
FSsj(Yzsj+2+4+2+10);
FSsj(sj3+0x30);
}
if(n==1 || (n==0 && m==4))
{
FSsj(0X1B);//4#按键
FSsj('j');
if(m==4)
{FSsj((0X9000+Xzsj+2+4+(35+4)*3+2)>>8);}
if(m!=4)
{FSsj((0X8000+Xzsj+2+4+(35+4)*3+2)>>8);}
FSsj(Xzsj+2+4+(35+4)*3+2);
FSsj(Yzsj+2+4+2>>8);
FSsj(Yzsj+2+4+2);
FSsj((Xzsj+2+4+35+(35+4)*3-2)>>8);
FSsj(Xzsj+2+4+35+(35+4)*3-2);
FSsj(Yzsj+2+4+35-2>>8);
FSsj(Yzsj+2+4+35-2);
FSsj(0X1B);
FSsj('z');
FSsj((0Xf000+Xzsj+2+4+(35+4)*3+2+6)>>8);
FSsj(Xzsj+2+4+(35+4)*3+2+6);
FSsj(0X8000+Yzsj+2+4+2+10>>8);
FSsj(Yzsj+2+4+2+10);
FSsj(sj4+0x30);
}
if(n==1 || (n==0 && m==5))
{
FSsj(0X1B);//5#按键
FSsj('j');
if(m==5)
{FSsj((0X9000+Xzsj+2+4+(35+4)*4+2)>>8);}
if(m!=5)
{FSsj((0X8000+Xzsj+2+4+(35+4)*4+2)>>8);}
FSsj(Xzsj+2+4+(35+4)*4+2);
FSsj(Yzsj+2+4+2>>8);
FSsj(Yzsj+2+4+2);
FSsj((Xzsj+2+4+35+(35+4)*4-2)>>8);
FSsj(Xzsj+2+4+35+(35+4)*4-2);
FSsj(Yzsj+2+4+35-2>>8);
FSsj(Yzsj+2+4+35-2);
FSsj(0X1B);
FSsj('z');
FSsj((0Xf000+Xzsj+2+4+(35+4)*4+2+6)>>8);
FSsj(Xzsj+2+4+(35+4)*4+2+6);
FSsj(0X8000+Yzsj+2+4+2+10>>8);
FSsj(Yzsj+2+4+2+10);
FSsj(sj5+0x30);
}
if(n==1 || (n==0 && m==6))
{
FSsj(0X1B);//6#按键
FSsj('j');
if(m==6)
{FSsj((0X9000+Xzsj+2+4+(35+4)*5+2)>>8);}
if(m!=6)
{FSsj((0X8000+Xzsj+2+4+(35+4)*5+2)>>8);}
FSsj(Xzsj+2+4+(35+4)*5+2);
FSsj(Yzsj+2+4+2>>8);
FSsj(Yzsj+2+4+2);
FSsj((Xzsj+2+4+35+(35+4)*5-2)>>8);
FSsj(Xzsj+2+4+35+(35+4)*5-2);
FSsj(Yzsj+2+4+35-2>>8);
FSsj(Yzsj+2+4+35-2);
FSsj(0X1B);
FSsj('z');
FSsj((0Xf000+Xzsj+2+4+(35+4)*5+2+6)>>8);
FSsj(Xzsj+2+4+(35+4)*5+2+6);
FSsj(0X8000+Yzsj+2+4+2+10>>8);
FSsj(Yzsj+2+4+2+10);
FSsj(sj6+0x30);
}
}
//=================================================================
//判别按键(返回键值1,2,3....10) 返回0无按键
uchar pbAN(uint Xzb,uint Yzb) //X坐标在Xzb中,Y坐标在Yzb中
{
// AN1 AN2 AN3 AN4 AN5 AN6
// AN7 AN8 AN9 AN10
uint code AN1 [4]={ 0XB8,0X100,0X116,0X175};// 1#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN2 [4]={0X131,0X100,0X18E,0X175};// 2#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN3 [4]={0X1AA,0X100,0X1FD,0X175};// 3#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN4 [4]={0X219,0X100,0X278,0X175};// 4#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN5 [4]={0X297,0X100,0X2EF,0X175};// 5#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN6 [4]={0X30E,0X100,0X360,0X175};// 6#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN7 [4]={ 0XB8,0X1A0,0X126,0X210};// 7#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN8 [4]={0X1AA,0X1A0,0X1FD,0X210};// 8#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN9 [4]={0X219,0X1A0,0X278,0X210};// 9#按键左上角(X1,Y1) 右下角(X2,Y2)
uint code AN10 [4]={0X30E,0X1A0,0X360,0X210};// 10#按键左上角(X1,Y1) 右下角(X2,Y2)
if ((Xzb>AN1[0]) && (Xzb<AN1[2]) && (Yzb>AN1[1]) && (Yzb<AN1[3])) {return 1;};
if ((Xzb>AN2[0]) && (Xzb<AN2[2]) && (Yzb>AN2[1]) && (Yzb<AN2[3])) {return 2;};
if ((Xzb>AN3[0]) && (Xzb<AN3[2]) && (Yzb>AN3[1]) && (Yzb<AN3[3])) {return 3;};
if ((Xzb>AN4[0]) && (Xzb<AN4[2]) && (Yzb>AN4[1]) && (Yzb<AN4[3])) {return 4;};
if ((Xzb>AN5[0]) && (Xzb<AN5[2]) && (Yzb>AN5[1]) && (Yzb<AN5[3])) {return 5;};
if ((Xzb>AN6[0]) && (Xzb<AN6[2]) && (Yzb>AN6[1]) && (Yzb<AN6[3])) {return 6;};
if ((Xzb>AN7[0]) && (Xzb<AN7[2]) && (Yzb>AN7[1]) && (Yzb<AN7[3])) {return 7;};
if ((Xzb>AN8[0]) && (Xzb<AN8[2]) && (Yzb>AN8[1]) && (Yzb<AN8[3])) {return 8;};
if ((Xzb>AN9[0]) && (Xzb<AN9[2]) && (Yzb>AN9[1]) && (Yzb<AN9[3])) {return 9;};
if ((Xzb>AN10[0]) && (Xzb<AN10[2]) && (Yzb>AN10[1]) && (Yzb<AN10[3])) {return 10;};
return 0;
}
//============================================================================
//jccmp检测触摸屏,3次采样为同一键值为有效
jccmp()
{
uint Xzb,Yzb; //X坐标在Xzb中,Y坐标在Yzb中
uchar zj[6]; //接收触摸屏数据的第2,3,4,5字节。
uchar jz[5]; //放键值(可能为:1,2,3,4,5,6,7,8,9,10)
uchar i;
while(1)
{
for(i=0;i<3;i++)
{
while(1){if(JSsj()==0xa0)break;}
zj[2]=JSsj();
zj[3]=JSsj();
zj[4]=JSsj();
zj[5]=JSsj();
Xzb=zj[2];
Xzb=Xzb<<6;
Xzb=Xzb+zj[3];//X坐标在Xzb中
Yzb=zj[4];
Yzb=Yzb<<6;
Yzb=Yzb+zj[5];//Y坐标在Yzb中
jz[i]=pbAN(Xzb,Yzb);//求键值
};
if((jz[0]=jz[1]) && (jz[1]=jz[2]) && (jz[0]!=0))
{return(jz[0]);};
}
}
//=========================================================================================
void main(void)
{
uchar an;//
uchar m=1;//m=1,2,3,4,5,6代表当前处理的数据是那一位.
uchar sj[7]={0,1,2,3,4,5,6};
CMP_DATA=1;
ZD_BUSY=1;
ZD_DATA=1;
Xzsj=39;//6位键盘占242*86点,这是键盘区左上角的X,Y坐标.如果变更左上角的坐标,需重新校准触摸屏.
Yzsj=21;
//清屏幕(黑色)
FSsj(0X1B);
FSsj(0X51);
FSsj(0);
h6jp();//画出6位数字键盘
m=1;
xj6k(m,1,sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]);
//循环接收数据
while(1)
{
an=jccmp();
if((an>=1) && (an<=6))
{m=an;
xj6k(m,1,sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]);
}
if(an==8)//增加
{
if(sj[m]<9)
{sj[m]=sj[m]+1;}
else
{sj[m]=0;}
xj6k(m,0,sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]);
}
if(an==9)//减小
{
if(sj[m]==0 || sj[m]>9)
{sj[m]=9;}
else
{sj[m]=sj[m]-1;}
xj6k(m,0,sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]);
}
if(an==7)
{
FSsj(0X1B);
FSsj(0X51);
FSsj(0);
h6jp();
m=1;
sj[1]=1;
sj[2]=2;
sj[3]=3;
sj[4]=4;
sj[5]=5;
sj[6]=6;
xj6k(m,1,sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]);
}//取消
if(an==10)
{
FSsj(0X1B); //调用字符集3
FSsj(0X33);
FSsj(0X1B); //设置字符旋转方向
FSsj(0X66);
FSsj(0X04);
// FSsj(0X1B);
//FSsj(0X04);
FSsj(0X1B);
FSsj('z');
FSsj(0Xc0);
FSsj(0Xcf);
FSsj(0X80);
FSsj(0Xff);
FSsj(0XF7);
FSsj(0XF8);
FSsj(0XF9);
FSsj(0XFA);
FSsj(0XFB);
FSsj(0XFC);
}//确认
/* FSsj(0X1B);//1#按键
FSsj('z');
FSsj((0X9000+Xzsj+2+4+5)>>8);
FSsj(Xzsj+2+4+5);
FSsj((0X8000+Yzsj+2+4+11)>>8);
FSsj(Yzsj+2+4+11);
FSsj(0X1B);
FSsj(0X33);
FSsj(0X1B);
FSsj(0X66);
FSsj(0X44);
FSsj('1');*/
//在左上角显示收到数据
FSsj(0X1B);
FSsj(0X33);
FSsj(0X1B);
FSsj(0X66);
FSsj(0X4);
FSsj(0X1B);
FSsj('z');
FSsj(0X90);
FSsj(0);
FSsj(0X80);
FSsj(0);
FSsj('X');
FSsj('=');
FSsj(zh16(Xzb>>8));
FSsj(zh16(Xzb>>4));
FSsj(zh16(Xzb));
FSsj('H');
FSsj(',');
FSsj('Y');
FSsj('=');
FSsj(zh16(Yzb>>8));
FSsj(zh16(Yzb>>4));
FSsj(zh16(Yzb));
FSsj('H');
FSsj(an+0x30);
}
}
//用XY坐标直接划点
// FSsj(0X1B);//划点指令
// FSsj('d');
// FSsj(0XF0+(Xzb>>8));//划白点
// FSsj(Xzb&0XFF);
// FSsj(Yzb>>8);
// FSsj(Yzb&0XFF);
//XY坐标除以4后划点
// Xzb=Xzb/4;
// Yzb=Yzb/4;
// FSsj(0X1B);//划点指令
// FSsj('d');
// FSsj(0XF0);//划白点
// FSsj(Xzb);
// FSsj(0);
// FSsj(Yzb);
//=========================================================================================
//例1:当通讯波特率F=9.6KHz,单片机晶振Z=18.432MHz时,TIMEzq=50
//计算方法:
//当波特率为9.6KHz时,每个二进制位的宽度为104uS.振荡周期数zq=(1000/9.6)*18.432MHz=1920个振荡周期
//调用本函数的其它指令执行时间为(12+24*3+12*3)=120个振荡周期.
//执行每个循环需要(12+24=36)个振荡周期,则TIMEzq=(zq-120)/36=(1920-120)/36=50
//即:TIMEzq=[((1000/F)*Z)-120]/36=50
//-------------
//例2:当通讯波特率F=4.8KHz,单片机晶振Z=18.432MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=103
//-------------
//例3:当通讯波特率F=19.2KHz,单片机晶振Z=18.432MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=23
//-------------
//例4:当通讯波特率F=9.6KHz,单片机晶振Z=12.000MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=31
//-------------
//例5:当通讯波特率F=4.8KHz,单片机晶振Z=12.000MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=66
//-------------
//例6:当通讯波特率F=19.2KHz,单片机晶振Z=12.000MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=14
//-------------
//例7:当通讯波特率F=9.6KHz,单片机晶振Z= 6.000MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=14
//-------------
//例8:当通讯波特率F=9.6KHz,单片机晶振Z=11.0592MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=28
//-------------
//例9:当通讯波特率F=9.6KHz,单片机晶振Z=22.1184MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=60
//-------------
//例10:当通讯波特率F=9.6KHz,单片机晶振Z=24.0000MHz时:
// TIMEzq=[((1000/F)*Z)-120]/36=66
//------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -