void Send_Array_UR1( u8 *str, u8 strlen)
{
u8 k = 0;
do
{
SBUF = (*(str + k));
k++;
TI_Busy_1=1;
while (TI_Busy_1);
}
while (k < strlen);
}
void UARTO1_ISR() interrupt 4 //接收中断,不同处理器可能是不同的函数声明
{
u8 i; //用处提取接收缓冲器的字符
if(TI)
{
TI = 0;
TI_Busy_1 = 0;
}
if(RI)
{
i=SBUF; //提取字符
RI=0;
if(!complete_data_flag_1) //前台程序处完成
{
if(RX_1) //如果接收到0XAA,继续接收后面的字符
{
buffer_1[RX_P]=i; //字符存入数组
if((RX_P>3)&&(buffer_1[RX_P-3]==0xcc) && (buffer_1[RX_P-2]==0x33)&&(buffer_1[RX_P-1]==0xc3)&& (buffer_1[RX_P]==0x3c)) //判断是是否接收完毕一帧数据
{
complete_data_flag_1=1; //如果接收完成,置位RXFRMOK
RX_1 = 0; //清零开始标志位RXAAOK
}
RX_P++; //接收计数器加一
}
if(!RX_1 && (i==0xaa))
{
RX_1=1;
RX_P=0;
}
}
}
}
// 触摸指令处理函数
void Touch_command_selection(void)
{
// 如果没有一帧完整数据,直接退出函数,不执行任何操作
if (!complete_data_flag_1)
return;
// 判断帧头:0x79 = 触摸按键按下
if (buffer_1[0] == 0x79)
{
// 如果触摸锁已经上锁,不响应任何按键
if (Screen_touch_lock)
{
complete_data_flag_1 = 0; // 清除数据接收完成标志
return; // 退出,不处理
}
// 根据 buffer_1[2] 里的按键指令执行对应功能
switch (buffer_1[2])
{
// ====================== 主页功能 ======================
case 0xA4: // 按下:主页 - 1
Screen_touch_lock = 1; // 上锁触摸,防止重复触发
Loop_sending(6); // 执行发送指令 6
break;
case 0xA5: // 按下:主页 - 2
Screen_touch_lock = 1; // 上锁触摸
Loop_sending(5); // 执行发送指令 5
break;
case 0xA7: // 按下:主页 - 3 //第一次按运行
Screen_touch_lock = 1; // 上锁触摸
image_loop_flag = 0; // 关闭动画循环
Loop_sending(4); // 执行发送指令 4
break;
default:
break; // 其他指令不处理
}
}
// 判断帧头:0x78 = 触摸按键松开
else if (buffer_1[0] == 0x78)
{
Screen_touch_lock = 0; // 解锁触摸,可以再次响应
}
// 数据处理完毕,清除接收完成标志,准备接收下一帧数据
complete_data_flag_1 = 0;
}
// 水模式动画循环函数
void image_loop(void)
{
static u8 count = 0; // 静态变量:保存帧计数,不会被重置
// 循环:只要 image_loop_flag = 1,就一直跑动画
do
{
if (++count > 60) // 计数自增,超过60归零
count = 0;
HIM_page_0_temp[2] = count; // 把计数值放入发送数组
Send_Array_UR1(HIM_page_0_temp, 7); // 发送一帧动画数据
delay_ms(60); // 延时60ms,控制动画速度
Touch_command_selection(); // 调用触摸处理,检测按键 第一次按下
} while (image_loop_flag); // 判断是否继续循环
}
// 主函数:程序入口
void main()
{
IOsatar(); // 芯片IO口初始化
Delay100ms(); // 开机延时100ms,稳定系统
image_loop(); // 进入动画循环(一旦进入,除非flag=0,否则不退出)
// 主死循环:系统正常运行任务
while(1)
{
TIME_START(); // 计时/定时器启动
Touch_command_selection(); // 触摸按键指令处理 //第二,三次按下判断
While_loop_sending(); // 循环发送数据
}
}
流程
开机给屏幕发送动画循环,当按下屏幕后转跳。(第一次按下可以正常切换页面,再次按下没反应,第三次按下正常了)
第一次按下后,Touch_command_selection(); i函数里mage_loop_flag = 0; // 关闭动画循环
程序到达while(1) 不然第一次就不会切换面。但是complete_data_flag_1 = 0;这条有时候不运行。导至第二次按下屏幕没反应。
如果中断发生在delay_ms(60); 只运行了按下,锁键,没有抬起动作,第二次按下没反应该?等待抬起?
delay_ms(60); // 延时60ms,控制动画速度
Touch_command_selection(); // 调用触摸处理,检测按键 第一次按下
complete_data_flag_1 = 0; 在这里增加后,正常了。没想明白。
屏幕下发间隔100MS 可能点一下会来两帧。按下。再抬起
|