HMI触摸屏根本没在换页时发数据,单片机却一直接收到, 我用的淘晶驰2.4寸串口触摸屏,
有两三个界面,
page0 监控状态
page1 功能按键
page1 有五六个按键,
分别控制几个单片机IO做动作。
现在我按键发送数据给单片机,
单片机不响应,于是做了一个计数器。
接收到按键按下发送的代码,
串口中断接收到结束符计数器加1.
而现在只要从page0切换到page1.
单片机就一直在接收数据。
然后单片机再把帧计数器数据发送给触摸屏数字变量。
奇了怪了。
#include <REG52.H>
#include <intrins.h> //
#include <string.h>
#include <stdlib.h>
#include “stdio.h”
#define uint unsigned int
#define uchar unsigned char
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) //1T模式
uchar mm=0;
uint S_Counter=0,Counter;
bit Counter_Flag;
uint i,S;
uint a[10]; //定义数组a 存储串口数据串
bit Receive_Flag;
sbit INTPUT0=P1^1;
sbit INTPUT1=P1^0;
sbit INTPUT2=P3^7;
sbit INTPUT3=P3^6;
sbit INTPUT4=P3^5;
sbit INTPUT5=P3^4;
sbit OUT0=P1^5;
sbit OUT1=P1^2;
sbit OUT2=P1^3;
sbit OUT3=P1^4;
sbit OUT4=P1^6;
sbit Y_EN=P1^7;
sbit Y_F=P5^4;
sbit Y_B=P5^5;
uint kcounter,kstatus; //按键计数标志 按键状态标志
/*——————————————*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/*———–(1)延时子程序12MHz 加千百十个显示——–*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
}
/*********************************************/
void resrt_io()
{
OUT4=0;
Y_EN=0;
Y_F=0;
Y_B=0;
OUT0=1;
OUT1=1;
OUT2=1;
OUT3=1;
}
/*×——–UART 中断服务程序——————-**/
/**×**把接收到的数据存进数组a[i]**i开机初始化****/
/***×*接收到触摸屏结束码Receive_Flag标志位置1****/
/****×主程序检测到标志码=1判断指令功能***********/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA||SBUF==0XFF) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
i=0; //数组计数器归零
S_Counter++; //串口帧接收计数器
}
else
{
a[i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
i++;
}
}
}
/************INT0中断入口************************/
/*******************************************/
void exint0() interrupt 0 //INT0中断入口
{
RstKey();
for(;kcounter<20;) //按键循环5次
{
if(!INT0) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INT0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=15)
{
Counter++;
Counter_Flag=1;
}
}
/************INT1中断入口************************/
void exint1() interrupt 2 //按下外部中断1后点亮OUTA一秒钟后熄灭
{
RstKey();
for(;kcounter<5000;) //按键循环5次
{
if(!INT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=4000)
{
//OUT2=~OUT2; //
//OUT3=~OUT3; //
}
}
/*————初始化串口———————*/
void InitUart()
{
SCON=0X50; //8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
T2L=0XE0; //设置定时器处置 110592》9600
T2H=0XFE; //设置定时器处置 110592》9600
AUXR|=0X10; //启动定时器2
TI=1; //
ES=1; //
EA=1; //
}
/********************************************/
void timer0() interrupt 1
{
mm++;
if(mm==1000)
{
mm=0;
OUT2=~OUT2; //
OUT3=~OUT3; //
EX0=~EX0;
}
}
/************************************/
void main( ) /*主程序开始*/
{
resrt_io();
INT0=1;
INT1=1;
IT0=1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0=1; //使能INT0中断
INT1=1;
IT1=1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
TMOD=0x00; //设置定时器为模式0(16位自动重装载)
TL0 = T1MS; //初始化计时值
TH0 = T1MS >> 8;
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EX1=1; //使能INT1中断
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
Receive_Flag=0;
InitUart(); //初始化串口
printf(“0XFF,0XFF,0XFF”);
Delay100ms(5);
i=0;
S=0;
Counter=0; //转盘出料计数
Counter_Flag=0;
delay(10);
while(1)
{
if(Counter_Flag==1)
{
Counter_Flag=0;
printf(“n0.val=%d\xff\xff\xff”,Counter); //转盘计数器
}
//转盘输入低电平 开转盘
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT0) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
S=2;
printf(“va0.val=%d\xff\xff\xff”,S); //
OUT0=0;
}
// 转盘输入高电平 关转盘
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT0) //转盘输入高电平
{
LowVoltKey(); //转盘输入高电平 计数器加一状态标志加一
}
else if(!INTPUT0) //转盘输入低电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
S=1;
printf(“va0.val=%d\xff\xff\xff”,S); //
OUT0=1;
}
//推杆进开信号
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
S=3;
printf(“va0.val=%d\xff\xff\xff”,S); //
Y_EN=1;
Y_F=1; //开推杆向前
Y_B=0;
}
//推杆进关信号
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT1) //推杆进高电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(!INTPUT1) //推杆进低电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
S=3;
printf(“va0.val=%d\xff\xff\xff”,S);//
Y_EN=0;
Y_F=0; //开推杆向前
Y_B=0;
}
//推杆退开信号
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT2) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
S=3;
printf(“va0.val=%d\xff\xff\xff”,S); //
Y_EN=1;
Y_B=1; //开推杆向后
Y_F=0;
}
//推杆退关信号
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT2) //推杆进高电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(!INTPUT2) //推杆进低电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
S=3;
printf(“va0.val=%d\xff\xff\xff”,S); //
Y_EN=0;
Y_F=0; //关推杆向后
Y_B=0;
}
//
if(Receive_Flag==1)
{
Receive_Flag=0;
printf(“n0.val=%d\xff\xff\xff”,S_Counter); //串口帧接收计数器
if(a[0]==0XE2)
{
if(a[1]==0XA1)
{
resrt_io();
Y_EN=1;
Y_F=1; //开推杆向前
Y_B=0;
}
if(a[1]==0XA2)
{
resrt_io();
Y_EN=1;
Y_F=0; //开推杆向后
Y_B=1;
}
if(a[1]==0XA3)
{
resrt_io();
OUT0=0;
}
if(a[1]==0XA4)
{
resrt_io();
OUT0=1;
}
if(a[1]==0XA5)
{
resrt_io();
OUT1=0;
}
if(a[1]==0XA6)
{
resrt_io();
OUT1=1;
}
if(a[1]==0XA8)
{
Y_EN=0;
Y_F=0; //关推杆向前
Y_B=0; //关推杆向后
}
}
}
}
} //L381 CODE 2217