|
|
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 //接收中斷,不同處理器可能是不同的函數(shù)聲明
{
u8 i; //用處提取接收緩沖器的字符
if(TI)
{
TI = 0;
TI_Busy_1 = 0;
}
if(RI)
{
i=SBUF; //提取字符
RI=0;
if(!complete_data_flag_1) //前臺(tái)程序處完成
{
if(RX_1) //如果接收到0XAA,繼續(xù)接收后面的字符
{
buffer_1[RX_P]=i; //字符存入數(shù)組
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)) //判斷是是否接收完畢一幀數(shù)據(jù)
{
complete_data_flag_1=1; //如果接收完成,置位RXFRMOK
RX_1 = 0; //清零開始標(biāo)志位RXAAOK
}
RX_P++; //接收計(jì)數(shù)器加一
}
if(!RX_1 && (i==0xaa))
{
RX_1=1;
RX_P=0;
}
}
}
}
// 觸摸指令處理函數(shù)
void Touch_command_selection(void)
{
// 如果沒有一幀完整數(shù)據(jù),直接退出函數(shù),不執(zhí)行任何操作
if (!complete_data_flag_1)
return;
// 判斷幀頭:0x79 = 觸摸按鍵按下
if (buffer_1[0] == 0x79)
{
// 如果觸摸鎖已經(jīng)上鎖,不響應(yīng)任何按鍵
if (Screen_touch_lock)
{
complete_data_flag_1 = 0; // 清除數(shù)據(jù)接收完成標(biāo)志
return; // 退出,不處理
}
// 根據(jù) buffer_1[2] 里的按鍵指令執(zhí)行對(duì)應(yīng)功能
switch (buffer_1[2])
{
// ====================== 主頁功能 ======================
case 0xA4: // 按下:主頁 - 1
Screen_touch_lock = 1; // 上鎖觸摸,防止重復(fù)觸發(fā)
Loop_sending(6); // 執(zhí)行發(fā)送指令 6
break;
case 0xA5: // 按下:主頁 - 2
Screen_touch_lock = 1; // 上鎖觸摸
Loop_sending(5); // 執(zhí)行發(fā)送指令 5
break;
case 0xA7: // 按下:主頁 - 3 //第一次按運(yùn)行
Screen_touch_lock = 1; // 上鎖觸摸
image_loop_flag = 0; // 關(guān)閉動(dòng)畫循環(huán)
Loop_sending(4); // 執(zhí)行發(fā)送指令 4
break;
default:
break; // 其他指令不處理
}
}
// 判斷幀頭:0x78 = 觸摸按鍵松開
else if (buffer_1[0] == 0x78)
{
Screen_touch_lock = 0; // 解鎖觸摸,可以再次響應(yīng)
}
// 數(shù)據(jù)處理完畢,清除接收完成標(biāo)志,準(zhǔn)備接收下一幀數(shù)據(jù)
complete_data_flag_1 = 0;
}
// 水模式動(dòng)畫循環(huán)函數(shù)
void image_loop(void)
{
static u8 count = 0; // 靜態(tài)變量:保存幀計(jì)數(shù),不會(huì)被重置
// 循環(huán):只要 image_loop_flag = 1,就一直跑動(dòng)畫
do
{
if (++count > 60) // 計(jì)數(shù)自增,超過60歸零
count = 0;
HIM_page_0_temp[2] = count; // 把計(jì)數(shù)值放入發(fā)送數(shù)組
Send_Array_UR1(HIM_page_0_temp, 7); // 發(fā)送一幀動(dòng)畫數(shù)據(jù)
delay_ms(60); // 延時(shí)60ms,控制動(dòng)畫速度
Touch_command_selection(); // 調(diào)用觸摸處理,檢測(cè)按鍵 第一次按下
} while (image_loop_flag); // 判斷是否繼續(xù)循環(huán)
}
// 主函數(shù):程序入口
void main()
{
IOsatar(); // 芯片IO口初始化
Delay100ms(); // 開機(jī)延時(shí)100ms,穩(wěn)定系統(tǒng)
image_loop(); // 進(jìn)入動(dòng)畫循環(huán)(一旦進(jìn)入,除非flag=0,否則不退出)
// 主死循環(huán):系統(tǒng)正常運(yùn)行任務(wù)
while(1)
{
TIME_START(); // 計(jì)時(shí)/定時(shí)器啟動(dòng)
Touch_command_selection(); // 觸摸按鍵指令處理 //第二,三次按下判斷
While_loop_sending(); // 循環(huán)發(fā)送數(shù)據(jù)
}
}
流程
開機(jī)給屏幕發(fā)送動(dòng)畫循環(huán),當(dāng)按下屏幕后轉(zhuǎn)跳。(第一次按下可以正常切換頁面,再次按下沒反應(yīng),第三次按下正常了)
第一次按下后,Touch_command_selection(); i函數(shù)里mage_loop_flag = 0; // 關(guān)閉動(dòng)畫循環(huán)
程序到達(dá)while(1) 不然第一次就不會(huì)切換面。但是complete_data_flag_1 = 0;這條有時(shí)候不運(yùn)行。導(dǎo)至第二次按下屏幕沒反應(yīng)。
如果中斷發(fā)生在delay_ms(60); 只運(yùn)行了按下,鎖鍵,沒有抬起動(dòng)作,第二次按下沒反應(yīng)該?等待抬起?
delay_ms(60); // 延時(shí)60ms,控制動(dòng)畫速度
Touch_command_selection(); // 調(diào)用觸摸處理,檢測(cè)按鍵 第一次按下
complete_data_flag_1 = 0; 在這里增加后,正常了。沒想明白。
屏幕下發(fā)間隔100MS 可能點(diǎn)一下會(huì)來兩幀。按下。再抬起
|
|