|
我用的淘晶馳2.4寸串口觸摸屏,
有兩三個(gè)界面,
page0 監(jiān)控狀態(tài)
page1 功能按鍵
page1 有五六個(gè)按鍵,
分別控制幾個(gè)單片機(jī)IO做動(dòng)作。
現(xiàn)在我按鍵發(fā)送數(shù)據(jù)給單片機(jī),
單片機(jī)不響應(yīng),于是做了一個(gè)計(jì)數(shù)器。
接收到按鍵按下發(fā)送的代碼,
串口中斷接收到結(jié)束符計(jì)數(shù)器加1.
而現(xiàn)在只要從page0切換到page1.
單片機(jī)就一直在接收數(shù)據(jù)。
然后單片機(jī)再把幀計(jì)數(shù)器數(shù)據(jù)發(fā)送給觸摸屏數(shù)字變量。
奇了怪了。
#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]; //定義數(shù)組a 存儲串口數(shù)據(jù)串
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; //按鍵計(jì)數(shù)標(biāo)志 按鍵狀態(tài)標(biāo)志
/*------------------------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/*-----------(1)延時(shí)子程序12MHz 加千百十個(gè)顯示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/****************按鍵計(jì)數(shù)器狀態(tài)寄存器歸零*************/
void RstKey()
{
kcounter=0; //按鍵計(jì)數(shù)器歸零
kstatus=0; //狀態(tài)寄存器歸零
}
/*****************按鍵低電平檢測函數(shù)*****************/
void LowVoltKey(void) //按鍵計(jì)數(shù)器狀態(tài)標(biāo)志加一
{
kcounter++;
kstatus++;
}
/*****************按鍵高電平檢測函數(shù)*****************/
void HighVoltKey(void) //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
{
kcounter++; //按鍵計(jì)數(shù)器加一
kstatus=0; //按鍵狀態(tài)標(biāo)志歸零
}
/*********************************************/
void resrt_io()
{
OUT4=0;
Y_EN=0;
Y_F=0;
Y_B=0;
OUT0=1;
OUT1=1;
OUT2=1;
OUT3=1;
}
/*×--------UART 中斷服務(wù)程序-------------------**/
/**×**把接收到的數(shù)據(jù)存進(jìn)數(shù)組a[i]**i開機(jī)初始化****/
/***×*接收到觸摸屏結(jié)束碼Receive_Flag標(biāo)志位置1****/
/****×主程序檢測到標(biāo)志碼=1判斷指令功能***********/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA||SBUF==0XFF) //觸摸屏結(jié)束碼
{
Receive_Flag=1; //接收數(shù)據(jù)標(biāo)志置一
RI=0; //
i=0; //數(shù)組計(jì)數(shù)器歸零
S_Counter++; //串口幀接收計(jì)數(shù)器
}
else
{
a[i]=SBUF; //數(shù)組下標(biāo)位置的數(shù)據(jù)等于SBUF
RI=0; //
i++;
}
}
}
/************INT0中斷入口************************/
/*******************************************/
void exint0() interrupt 0 //INT0中斷入口
{
RstKey();
for(;kcounter<20;) //按鍵循環(huán)5次
{
if(!INT0) //按鍵低電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(~!INT0) //按鍵高電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=15)
{
Counter++;
Counter_Flag=1;
}
}
/************INT1中斷入口************************/
void exint1() interrupt 2 //按下外部中斷1后點(diǎn)亮OUTA一秒鐘后熄滅
{
RstKey();
for(;kcounter<5000;) //按鍵循環(huán)5次
{
if(!INT1) //按鍵低電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(~!INT1) //按鍵高電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=4000)
{
//OUT2=~OUT2; //
//OUT3=~OUT3; //
}
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON=0X50; //8位數(shù)據(jù),可變波特率
AUXR|=0x01; //串口1選擇定時(shí)器2為波特率發(fā)生器
AUXR|=0X04; //定時(shí)器2時(shí)鐘為Fosc,即1T
T2L=0XE0; //設(shè)置定時(shí)器處置 110592》9600
T2H=0XFE; //設(shè)置定時(shí)器處置 110592》9600
AUXR|=0X10; //啟動(dòng)定時(shí)器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; //設(shè)置INT0的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
EX0=1; //使能INT0中斷
INT1=1;
IT1=1; //設(shè)置INT1的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
TMOD=0x00; //設(shè)置定時(shí)器為模式0(16位自動(dòng)重裝載)
TL0 = T1MS; //初始化計(jì)時(shí)值
TH0 = T1MS >> 8;
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0 = 1; //使能定時(shí)器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; //轉(zhuǎn)盤出料計(jì)數(shù)
Counter_Flag=0;
delay(10);
while(1)
{
if(Counter_Flag==1)
{
Counter_Flag=0;
printf("n0.val=%d\xff\xff\xff",Counter); //轉(zhuǎn)盤計(jì)數(shù)器
}
//轉(zhuǎn)盤輸入低電平 開轉(zhuǎn)盤
RstKey();
for(;kcounter<5;) //按鍵循環(huán)5次
{
if(!INTPUT0) //按鍵低電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(~!INTPUT0) //按鍵高電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=3) /*按鍵狀態(tài)標(biāo)志大于等于3為有效值*/
{
S=2;
printf("va0.val=%d\xff\xff\xff",S); //
OUT0=0;
}
// 轉(zhuǎn)盤輸入高電平 關(guān)轉(zhuǎn)盤
RstKey();
for(;kcounter<5;) //按鍵循環(huán)5次
{
if(~!INTPUT0) //轉(zhuǎn)盤輸入高電平
{
LowVoltKey(); //轉(zhuǎn)盤輸入高電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(!INTPUT0) //轉(zhuǎn)盤輸入低電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=3) /*按鍵狀態(tài)標(biāo)志大于等于3為有效值*/
{
S=1;
printf("va0.val=%d\xff\xff\xff",S); //
OUT0=1;
}
//推桿進(jìn)開信號
RstKey();
for(;kcounter<5;) //按鍵循環(huán)5次
{
if(!INTPUT1) //按鍵低電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(~!INTPUT1) //按鍵高電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=3) /*按鍵狀態(tài)標(biāo)志大于等于3為有效值*/
{
S=3;
printf("va0.val=%d\xff\xff\xff",S); //
Y_EN=1;
Y_F=1; //開推桿向前
Y_B=0;
}
//推桿進(jìn)關(guān)信號
RstKey();
for(;kcounter<5;) //按鍵循環(huán)5次
{
if(~!INTPUT1) //推桿進(jìn)高電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(!INTPUT1) //推桿進(jìn)低電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=3) /*按鍵狀態(tài)標(biāo)志大于等于3為有效值*/
{
S=3;
printf("va0.val=%d\xff\xff\xff",S);//
Y_EN=0;
Y_F=0; //開推桿向前
Y_B=0;
}
//推桿退開信號
RstKey();
for(;kcounter<5;) //按鍵循環(huán)5次
{
if(!INTPUT2) //按鍵低電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(~!INTPUT2) //按鍵高電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=3) /*按鍵狀態(tài)標(biāo)志大于等于3為有效值*/
{
S=3;
printf("va0.val=%d\xff\xff\xff",S); //
Y_EN=1;
Y_B=1; //開推桿向后
Y_F=0;
}
//推桿退關(guān)信號
RstKey();
for(;kcounter<5;) //按鍵循環(huán)5次
{
if(~!INTPUT2) //推桿進(jìn)高電平
{
LowVoltKey(); //按鍵低電平 計(jì)數(shù)器加一狀態(tài)標(biāo)志加一
}
else if(!INTPUT2) //推桿進(jìn)低電平
{
HighVoltKey(); //按鍵計(jì)數(shù)器加一 狀態(tài)標(biāo)志歸零
}
}
if(kstatus>=3) /*按鍵狀態(tài)標(biāo)志大于等于3為有效值*/
{
S=3;
printf("va0.val=%d\xff\xff\xff",S); //
Y_EN=0;
Y_F=0; //關(guān)推桿向后
Y_B=0;
}
//
if(Receive_Flag==1)
{
Receive_Flag=0;
printf("n0.val=%d\xff\xff\xff",S_Counter); //串口幀接收計(jì)數(shù)器
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; //關(guān)推桿向前
Y_B=0; //關(guān)推桿向后
}
}
}
}
} //L381 CODE 2217 |
|