新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32-觸摸屏實驗

        STM32-觸摸屏實驗

        作者: 時間:2016-11-23 來源:網絡 收藏
        void Touch_Init(void);//初始化

        u8 Read_ADS(u16 *x,u16 *y); //帶舍棄的雙方向讀取
        u8 Read_ADS2(u16 *x,u16 *y); //帶加強濾波的雙方向坐標讀取
        u16 ADS_Read_XY(u8 xy); //帶濾波的坐標讀取(單方向)
        u16 ADS_Read_AD(u8 CMD); //讀取AD轉換值
        void ADS_Write_Byte(u8 num); //向控制芯片寫入一個數據
        void Drow_Touch_Point(u8 x,u16 y);//畫一個坐標叫準點
        void Draw_Big_Point(u8 x,u16 y); //畫一個大點
        void Touch_Adjust(void); //觸摸屏校準
        void Save_Adjdata(void); //保存校準參數
        u8 Get_Adjdata(void);//讀取校準參數
        void Pen_Int_Set(u8 en);//PEN中斷使能/關閉
        void Convert_Pos(void); //結果轉換函數

        本文引用地址:http://www.104case.com/article/201611/320451.htm

        以上是touch.c里面的主要函數:

        1.void Touch_Init(void); //初始化

        包含時鐘初始化、EXTI1中斷設置,開啟了line1上的中斷,設置了下降沿觸發

        2.u8 Read_ADS(u16 *x,u16 *y); //帶舍棄的雙方向讀取

        單次讀取坐標函數

        3.u8 Read_ADS2(u16 *x,u16 *y); //帶加強濾波的雙方向坐標讀取

        二次讀取坐標

        4.u16 ADS_Read_XY(u8 xy); //帶濾波的坐標讀取(單方向)

        連續讀取READ_TIMES次數據,對這些數據升序排列,然后去掉最低和最高LOST_VAL個數,取平均值

        5.u16 ADS_Read_AD(u8 CMD); //讀取AD轉換值

        6.void ADS_Write_Byte(u8 num); //向控制芯片寫入一個數據

        7.void Drow_Touch_Point(u8 x,u16 y);//畫一個坐標叫準點

        8.void Draw_Big_Point(u8 x,u16 y); //畫一個大點

        繪圖寫字函數

        9.void Touch_Adjust(void); //觸摸屏校準

        10.void Save_Adjdata(void); //保存校準參數

        校準出來的坐標參數保存在2401里面

        11.void Pen_Int_Set(u8 en);//PEN中斷使能/關閉

        觸摸屏被按下即觸發中斷,可以使用這個函數暫時關掉中斷,等待繪圖完畢再打開

        12.void Convert_Pos(void); //結果轉換函數

        觸摸屏讀出的坐標是物理坐標,程序中使用的坐標是LCD像素坐標,用這個函數作為轉換

        main函數中有一個問題,看了論壇里好多人問了這個問題:

        [cpp]view plaincopy
        1. while(1)
        2. {
        3. key=KEY_Scan();
        4. if(Pen_Point.Key_Sta==Key_Down)//觸摸屏被按下
        5. {
        6. Pen_Int_Set(0);//關閉中斷
        7. do
        8. {
        9. Convert_Pos();
        10. Pen_Point.Key_Sta=Key_Up;
        11. if(Pen_Point.X0>216&&Pen_Point.Y0<16)Load_Drow_Dialog();//RST區域,點擊這個區域將執行清屏
        12. else
        13. {
        14. Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//畫圖
        15. GPIOC->ODR|=1<<1;//PC1上拉
        16. }
        17. }while(PEN==0);//如果PEN一直有效,則一直執行
        18. Pen_Int_Set(1);//開啟中斷
        19. }elsedelay_ms(10);
        20. if(key==1)//KEY0按下,則執行校準程序
        21. {
        22. LCD_Clear(WHITE);//清屏
        23. Touch_Adjust();//屏幕校準
        24. Save_Adjdata();
        25. Load_Drow_Dialog();
        26. }
        27. i++;
        28. if(i==20)
        29. {
        30. i=0;
        31. LED0=!LED0;
        32. }
        33. }

        這個是論壇里的提問帖,相關帖子及解決辦法:http://www.openedv.com/posts/list/1813.htm用到了再研究。

        在正點原子的戰艦版例程里,沒有使用PEN作為判斷條件,規避了這個問題:

        [cpp]view plaincopy
        1. while(1)
        2. {
        3. key=KEY_Scan(0);
        4. tp_dev.scan(0);
        5. if(tp_dev.sta&TP_PRES_DOWN)//觸摸屏被按下
        6. {
        7. if(tp_dev.x
        8. {
        9. if(tp_dev.x>(lcddev.width-24)&&tp_dev.y<16)Load_Drow_Dialog();//清除
        10. elseTP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED);//畫圖
        11. }
        12. }elsedelay_ms(10);//沒有按鍵按下的時候
        13. if(key==KEY_RIGHT)//KEY_RIGHT按下,則執行校準程序
        14. {
        15. LCD_Clear(WHITE);//清屏
        16. TP_Adjust();//屏幕校準
        17. TP_Save_Adjdata();
        18. Load_Drow_Dialog();
        19. }
        20. i++;
        21. if(i==20)
        22. {
        23. i=0;
        24. LED0=!LED0;
        25. }
        26. }



        關鍵詞: STM32觸摸

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 五华县| 枣强县| 北京市| 尼木县| 鄯善县| 泽普县| 佛冈县| 抚远县| 苍山县| 绥德县| 临西县| 城市| 东辽县| 昆山市| 兴仁县| 湘西| 萨嘎县| 仲巴县| 河池市| 南川市| 罗源县| 耒阳市| 常州市| 满城县| 谢通门县| 大冶市| 开鲁县| 万盛区| 青岛市| 伽师县| 婺源县| 蒲江县| 曲周县| 长汀县| 遵义市| 泾川县| 永平县| 桃园县| 扎兰屯市| 南平市| 潍坊市|