我用的淘晶馳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 |