新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 觸控屏的控制電路制作小記

        觸控屏的控制電路制作小記

        作者: 時間:2012-09-04 來源:網絡 收藏

        觸控屏已經不是什么新鮮的東西,現在的電子產品基本上都帶有一個大大的彩色液晶,加上一個輕觸式的觸控屏。使用起來非常方便,可以完全取代以往那種固定式的按鍵。

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

        下面就介紹一種觸控屏的驅動,我也是一個小時前才把這個小板子做出來,測試成功后馬上發表這篇日志,新鮮熱辣的哦!

        首先,介紹以下觸控屏幕的構造,它是由一塊觸控屏幕和一塊液晶顯示屏幕粘合在一起的。液晶顯示屏幕按色彩、材料、成像原理等多種方式分類,種類繁多,這里對液晶屏幕不做詳細介紹,本文圖片中所使用的是16Bit半透明反射式TFT液晶點陣顯示屏。而觸摸屏幕主要分為兩大類,分別是電容式和電阻式。

        電容式觸控屏利用人體的電流感應進行工作,優點是使用壽命長,觸摸時不需用力,面板堅硬耐磨;缺點是觸摸精度低,必須使用特定的介質觸控(如人體皮膚),受溫度濕度影響很大,外界有較強磁場電場時,觸控屏會失靈,簡單來說就是抗干擾性較差。

        電阻式觸控屏是利用按壓時縱軸和橫軸的電阻值來定位的,優點是抗干擾性好,觸摸精度高,可以用任何物體來觸摸,缺點是表面是塑料薄膜,易磨損,觸摸是需要稍加一點力度按壓。本文中使用的就是電阻式觸控屏。

        接下來介紹一些幾個觸控屏IC:ADS7846、ADS7843和TSC2046,它們是最常見的四線觸摸屏芯片,均為BURR-BROWN(已經被TI收購,找封裝庫的時候去TI那里找)公司的產品,三者引腳相互兼容,但片內的功能是有區別的,例如7846內集成溫度傳感、可檢測觸摸壓力等功能,具體請參考DataSheet。TSC2046是新出的芯片,由于其國產片價錢便宜(零售約1元/片),廣泛應用于國產的具有觸摸屏幕的MP3、手機等電子產品。

        我這次采用的是ADS7846。

        ADS7846引腳圖:

        觸控屏的控制電路制作小記

        引腳功能介紹:

        DCLK:時鐘輸入端口

        CS:片選信號

        DIN:串行數據輸入端,CS為低時數據在DCLK上升沿鎖存

        BUSY:忙時信號輸出,CS為高時其為高阻態

        DOUT:串行數據輸出端,CS為高時其為高阻態

        PENIRQ:筆中斷(當屏幕被觸壓時,產生中斷信號)

        Vref:參考電壓(一般直接接VCC)

        Vbat:電源檢測輸入端(一般不使用)

        AUX:備選輸入端(一般不使用)

        X+、Y+、X-、Y- :四線觸控屏位置輸入端

        程序思路是參考一位網友的,我把它移植過來了。

        工作原理:每次按下觸摸屏,ADS7846的PEN腳會拉低,觸發STM32中斷,然后在中斷服務程序里面處理要執行功能。畫圖的原理是通過在中斷里對X、Y坐標連續采樣十次,若不夠十次,不做任何操作。得到十次數據后,進行排序,最后取中間三次的數據計算均值,便得到需要的X、Y坐標。得到觸屏的點以后,接著就是在屏幕上對應的這個點上畫點。

        下面是的原理圖:

        觸控屏的控制電路制作小記

        用感光法做的板子(未裁剪):

        觸控屏的控制電路制作小記

        裁剪出中間那部分后和一元硬幣小一點,右側為硫酸紙打印出來的負片。

        寫了一個可選畫筆和背景顏色的畫板:

        觸控屏的控制電路制作小記

        最后貼上STM32的觸摸屏驅動程序(已添加畫板功能),用C語言寫的,很容易移植,有興趣的同學可以將它移到51或其他單片機上面跑一下。完整代碼從這里下載http://dl.21ic.com/download/chumo1-rar-ic-106798.html

        #includehx8347.h //自己編寫的液晶屏頭文件,此頭文件只定義了一些基本變量,

        不涉及驅動相關函數

        //定義引腳高低電平

        #define ADS_DCLK_H() GPIO_SetBits(GPIOB,GPIO_Pin_6)//ADS7846時鐘信號

        #define ADS_DCLK_L() GPIO_ResetBits(GPIOB,GPIO_Pin_6)

        #define ADS_CS_H() GPIO_SetBits(GPIOB,GPIO_Pin_7)//ADS7846片選信號

        #define ADS_CS_L() GPIO_ResetBits(GPIOB,GPIO_Pin_7)

        #define ADS_DIN_H() GPIO_SetBits(GPIOB,GPIO_Pin_8)

        #define ADS_DIN_L() GPIO_ResetBits(GPIOB,GPIO_Pin_8)

        #define ADS_DOUT GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)

        #define ADS_PEN GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)////ADS7846響應信號

        //初始化I/O口

        void ADS_GPIO_Config()

        {

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOB, GPIO_InitStructure);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOB, GPIO_InitStructure);

        }

        void ADS_Spi_Start()//初始信號

        {

        ADS_CS_H();

        ADS_DCLK_H();

        ADS_DIN_H();

        }

        void ADS_Write_Byte(u8 num)

        {

        u8 count=0;

        ADS_DCLK_L();

        for(count=0;count8;count++)

        {

        if(num0x80)

        ADS_DIN_H();

        else

        ADS_DIN_L();

        num=1;

        ADS_DCLK_L();

        ADS_DCLK_H(); //上升沿有效

        }

        }

        u16 ADS_Readdata()

        {

        u16 num;

        DIY機械鍵盤相關社區:機械鍵盤DIY



        上一頁 1 2 下一頁

        關鍵詞: 小記 制作 電路 控制

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 安国市| 滦南县| 宁阳县| 石屏县| 临朐县| 县级市| 百色市| 个旧市| 遵化市| 新民市| 密山市| 昌邑市| 宁海县| 东海县| 公主岭市| 逊克县| 吕梁市| 隆尧县| 卓尼县| 贺州市| 永吉县| 峨眉山市| 靖安县| 清原| 习水县| 庄河市| 都匀市| 法库县| 于都县| 和林格尔县| 庆城县| 灌阳县| 通渭县| 柘荣县| 秭归县| 乡城县| 贺兰县| 临猗县| 曲周县| 屏东县| 林口县|