找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2131|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

HMI觸摸屏根本沒在換頁時(shí)發(fā)數(shù)據(jù),單片機(jī)卻一直接收到

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140644 發(fā)表于 2021-2-5 07:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    我用的淘晶馳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   
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:440403 發(fā)表于 2021-2-5 09:45 | 只看該作者
先不要接單片機(jī),直接屏幕接TTL接到電腦,看看是不是真的這樣,先確定是哪一方的問題

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

板凳
ID:140644 發(fā)表于 2021-2-5 14:56 | 只看該作者
兩儀式 發(fā)表于 2021-2-5 09:45
先不要接單片機(jī),直接屏幕接TTL接到電腦,看看是不是真的這樣,先確定是哪一方的問題

謝謝,
程序重新修改了一下好了。
用的外部中斷0,定時(shí)器做抗干擾計(jì)數(shù)器。
中斷響應(yīng)以后關(guān)閉中斷使能,計(jì)數(shù)器計(jì)數(shù)后再打開。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表