久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2212|回復: 2
收起左側

HMI觸摸屏根本沒在換頁時發數據,單片機卻一直接收到

[復制鏈接]
ID:140644 發表于 2021-2-5 07:43 | 顯示全部樓層 |閱讀模式
    我用的淘晶馳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   
回復

使用道具 舉報

ID:440403 發表于 2021-2-5 09:45 | 顯示全部樓層
先不要接單片機,直接屏幕接TTL接到電腦,看看是不是真的這樣,先確定是哪一方的問題

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:140644 發表于 2021-2-5 14:56 | 顯示全部樓層
兩儀式 發表于 2021-2-5 09:45
先不要接單片機,直接屏幕接TTL接到電腦,看看是不是真的這樣,先確定是哪一方的問題

謝謝,
程序重新修改了一下好了。
用的外部中斷0,定時器做抗干擾計數器。
中斷響應以后關閉中斷使能,計數器計數后再打開。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品久久久一区二区三区 | 日韩一区二区三区视频 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品精品 | 亚洲国产黄色av | 国产成人99久久亚洲综合精品 | 日韩一区二区三区在线视频 | 免费一区| 国产99久久精品一区二区永久免费 | 成人高潮片免费视频欧美 | 91成人免费电影 | 精品免费av| 午夜黄色 | 欧美三级电影在线播放 | 亚洲视频一区二区三区 | 夜夜爽99久久国产综合精品女不卡 | 国产免费又黄又爽又刺激蜜月al | 一区二区三区亚洲 | 国产精品成人久久久久 | 精品日韩在线观看 | 精品国产欧美在线 | 91精品成人久久 | 色婷婷国产精品综合在线观看 | 高清国产午夜精品久久久久久 | 好姑娘高清在线观看电影 | 国产精品久久国产精品99 | 人人艹人人 | 在线欧美一区 | 欧美日本韩国一区二区 | 国产在线观看一区二区三区 | 看av网址 | 精品国产免费一区二区三区五区 | 日韩网站免费观看 | 久久国产日本 | 亚洲aⅴ| 日韩国产专区 | 亚洲成人午夜在线 | 久久久久久99 | 国产丝袜一区二区三区免费视频 | 可以看黄的视频 | 在线观看精品视频网站 |