本帖最后由 飞扬自我 于 2019-3-13 23:41 编辑
四,触控屏开发与下位机软件开发
4.1触控屏开发。
每个地方都是一个地址,所以后续的编程和显示都是按照设置的地址进行操作。具体操作设置见下图:
4.2下位机软件开发
通过上面的触控,每一次触控触摸屏都会自动下发一次指令,具体指令见表。
对于本次的指令只要是0x80,0x81,0x82,0x83以及0x84指令。
SerialScreenData_TypeDef SerialScreenData; //定义串口屏结构组
/*********************************初始化结构体*************************************************/
void inint_SerialScreenData(void)
{
//接收信息缓冲区
u8 counter;
for(counter=0;counter<9;counter++)
SerialScreenData.ProcesData[counter]=0; //串口屏下发信息缓冲区
SerialScreenData.ProcesDataClear_flag=0; //数据处理缓冲数组清除标志位 1允许清理
SerialScreenData.Updata_flag=0x01; //更新数据标志作为数据处理的判断标志
//输出IO设置相关
SerialScreenData.OutputDataSet=0x00; //用于存储Output的设置数据
SerialScreenData.UartWrite82Input[0]=0x5A; //串口用82指令写动态波形数据Buf 0 帧头
SerialScreenData.UartWrite82Input[1]=0xA5; //串口用82指令写动态波形数据Buf 1 帧头
SerialScreenData.UartWrite82Input[2]=0x05; //串口用82指令写动态波形数据Buf 2 操作码
SerialScreenData.UartWrite82Input[3]=0x82; //串口用82指令写动态波形数据Buf 3 发送字节数据
SerialScreenData.UartWrite82Input[4]=0x01; //串口用82指令写动态波形数据Buf 4 地址高位
for(counter=5;counter<8;counter++)
SerialScreenData.UartWrite82Input[counter]=0x00; //串口用82指令写动态波形数据Buf
//DAC设置相关
for(counter=0;counter<2;counter++)
SerialScreenData.DACData[counter]=0x00; //用于存储串口屏下发的DAC输出电压值转换后的数据 DACData[0]--->DAC1; DACData[1]--->DAC2
SerialScreenData.DACChannel=0x00; //设置DAC的通道 0x00000000----->DAC_Channel_1; 0x00000010----->DAC_Channel_2;
//画图波形设置 adc
for(counter=0;counter<8;counter++)
SerialScreenData.Channelflag[counter]=0x00; //Channelflag[0]--->channel_1#;...........;Channelflag[7]--->channel_8#
SerialScreenData.UartWrite84Buf[0]=0x5A; //串口用84指令写动态波形数据Buf 0 帧头
SerialScreenData.UartWrite84Buf[1]=0xA5; //串口用84指令写动态波形数据Buf 1 帧头
SerialScreenData.UartWrite84Buf[2]=0x12; //串口用84指令写动态波形数据Buf 2 发送数量
SerialScreenData.UartWrite84Buf[3]=0x84; //串口用84指令写动态波形数据Buf 3 操作码
SerialScreenData.UartWrite84Buf[4]=0xff; //串口用84指令写动态波形数据Buf 4 通道标识
for(counter=5;counter<21;counter++)
SerialScreenData.UartWrite84Buf[counter]=0x00; //串口用84指令写动态波形数据Buf
//工作状态标志位
for(counter=0;counter<4;counter++)
SerialScreenData.State[counter]=0x00; // State[0] 运行; State[1] 急停; State[2] 报错; State[3] 停止
SerialScreenData.WarnningCode=0x00; //0x00~0xff 运行报警代码
//子站参数相关
SerialScreenData.UartWrite82Node[0]=0x5A; //串口用82指令写动态波形数据Buf 0 帧头 //设置的子站地址 16进制
SerialScreenData.UartWrite82Node[1]=0xA5; //串口用82指令写动态波形数据Buf 1 帧头
SerialScreenData.UartWrite82Node[2]=0x04; //串口用82指令写动态波形数据Buf 2 操作码
SerialScreenData.UartWrite82Node[3]=0x82; //串口用82指令写动态波形数据Buf 3 发送字节数据
SerialScreenData.UartWrite82Node[4]=0x00; //串口用82指令写动态波形数据Buf 4 地址高位
SerialScreenData.UartWrite82Node[5]=0x6A; //串口用82指令写动态波形数据Buf 4 地址低位
SerialScreenData.UartWrite82Node[6]=0x00; //串口用82指令写动态波形数据Buf
//10ms定时计数器
SerialScreenData.MsCounter=0;
}
主控程序的部分代码 while(1)
{
if(SerialScreenData.ProcesDataClear_flag) //数据处理完,数据等待接收
{
if(SerialScreenData.DACChannel==0x00) //DAC1
Dac_Set_Vol(SerialScreenData.DACData[0],SerialScreenData.DACChannel);
if(SerialScreenData.DACChannel==0x10) //DAC2
Dac_Set_Vol(SerialScreenData.DACData[1],SerialScreenData.DACChannel);
WriteByte595(~SerialScreenData.OutputDataSet);
SerialScreenData.ProcesDataClear_flag=0x00;
}
if(SerialScreenData.MsCounter==50) //50ms
{
u8 Inputdata=0x00;
u8 Nodestation=0x00;
u8 bitcouter=0;
// Input
GPIOInputdata=ReadWord165();
Inputdata=GPIOInputdata&0x00ff;
for(bitcouter=0;bitcouter<8;bitcouter++)
{
if(Inputdata&(0x01<<bitcouter))
SerialScreenData.UartWrite82Input[7]=0x00;
else
SerialScreenData.UartWrite82Input[7]=0x01;
SerialScreenData.UartWrite82Input[5]=bitcouter*2;
USART2Write(SerialScreenData.UartWrite82Input,8);
}
//Node station
Nodestation=(GPIOInputdata&0xff00)>>8;
SerialScreenData.UartWrite82Node[6]=Nodestation;
USART2Write(SerialScreenData.UartWrite82Node,7);
}
if(SerialScreenData.MsCounter>100) // 100ms任务
{
//画图
if(SerialScreenData.Channelflag[0]==1)
SerialScreenData.UartWrite84Buf[6]=125+125*sin(pi*(i0+= 2)/180+pi/24); //channel_0
else
SerialScreenData.UartWrite84Buf[6]=0x00;
if(SerialScreenData.Channelflag[1]==1)
SerialScreenData.UartWrite84Buf[8] =125+125*sin(pi*(i1+= 4)/180+pi/12); //channel_1
else
SerialScreenData.UartWrite84Buf[8]=0x00;
if(SerialScreenData.Channelflag[2]==1)
SerialScreenData.UartWrite84Buf[10]=125+125*sin(pi*(i2+= 6)/180+pi/10); //channel_2
else
SerialScreenData.UartWrite84Buf[10]=0x00;
if(SerialScreenData.Channelflag[3]==1)
SerialScreenData.UartWrite84Buf[12]=125+125*sin(pi*(i3+= 8)/180+pi/8); //channel_3
else
SerialScreenData.UartWrite84Buf[12]=0x00;
if(SerialScreenData.Channelflag[4]==1)
SerialScreenData.UartWrite84Buf[14]=125+125*sin(pi*(i4+=10)/180+pi/6); //channel_4
else
SerialScreenData.UartWrite84Buf[14]=0x00;
if(SerialScreenData.Channelflag[5]==1)
SerialScreenData.UartWrite84Buf[16]=125+125*sin(pi*(i5+=12)/180+pi/4); //channel_5
else
SerialScreenData.UartWrite84Buf[16]=0x00;
if(SerialScreenData.Channelflag[6]==1)
SerialScreenData.UartWrite84Buf[18]=125+125*sin(pi*(i6+=14)/180+pi/3); //channel_6
else
SerialScreenData.UartWrite84Buf[18]=0x00;
if(SerialScreenData.Channelflag[7]==1)
SerialScreenData.UartWrite84Buf[20]=125+125*sin(pi*(i7+=16)/180); //channel_7
else
SerialScreenData.UartWrite84Buf[20]=0x00;
if(i0==359) i0=0;
if(i1==359) i1=0;
if(i2==359) i2=0;
if(i3==359) i3=0;
if(i4==359) i4=0;
if(i5==359) i5=0;
if(i6==359) i6=0;
if(i7==359) i7=0;
USART2Write(SerialScreenData.UartWrite84Buf,21);
SerialScreenData.MsCounter=0x00;
if((j++)%2==0)
GPIO_SetBits(GPIOC,GPIO_Pin_12);
else
GPIO_ResetBits(GPIOC,GPIO_Pin_12);
}
串口数据识别代码段:/******************************接收中断服务程序************************************/
//迪文串口屏触控输出指令接收
// 帧头 数据长度 操作码 地址 寄存器数量 数值
//急停: 5A A5 06 83 00 55 01 00 01
//运行: 5A A5 06 83 00 55 01 00 80
//报警: 5A A5 06 83 00 55 01 00 08
//DAC1: 5A A5 06 83 00 61 01 00 01 (10mv)
//DAC2: 5A A5 06 83 00 65 01 00 01 (10mv)
//DAC1: 5A A5 06 83 00 6A 01 00 38 (十进制为65)
//通道: 5A A5 06 83 00 50 01 80 00 (1-7 的加权值为80 40 20 10 08 04 02 01 高8位)
//IN: (无输出)
//OUT: 5A A5 06 83 00 5A 01 00 80 (1-7 的加权值为80 40 20 10 08 04 02 01 低8位)
void USART2_IRQHandler(void)
{
// SerialScreenData_TypeDef SerialScreenData; //定义串口屏结构组
u8 get_char;
u16 time_out=10000; //等待超时
u8 j=0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
get_char=USART2->DR;
if(GetFinish_flag==0) //不是接收数据状态
{
if(State_flag==1) //等待帧头 5A A5
{
DataReg[1]=DataReg[0];
DataReg[0]=get_char; //接收的字节进行存储等待帧头校验
if((DataReg[0]==0xa5)&&(DataReg[1]==0x5a)) //帧头校验
{
State_flag=0x00; //帧头校验成功
GetFinish_flag=1; //接收数据标志物置1
Getdata[0]=DataReg[0];
Getdata[1]=DataReg[1]; //存储帧头到DataReg[]数组;
}
else
{
State_flag=0x01; //帧头校验失败
GetFinish_flag=0x00; //接收数据标志物置0,继续等待帧头
}
}
}
else //帧头校验成功开始接收数据
{
if((++GetDataCounter)<7) //接收的数据计算器<数据长度 继续接收数据
{
// GetDataCounter++;
Getdata[GetDataCounter+1]=get_char;
}
else //接收数据结束
{
Getdata[GetDataCounter+1]=get_char; //接收最后一个数据
GetDataCounter=0;
GetFinish_flag=0;
State_flag=0x01;
while(SerialScreenData.ProcesDataClear_flag)
{
while(time_out--)
;
SerialScreenData.WarnningCode=0x01; //处理超时,接收数据丢失
break;
}
for(j=0;j<9;j++)
SerialScreenData.ProcesData[j]=Getdata[j];
SerialScreenData.Updata_flag=0x01;
}
}
}
}
|