[国嵌攻略][063][电阻屏驱动程序设计]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/********************************************************************
*名称:touchscreen.c
*作者:D
*时间:2015.11.23
*功能:
*   触摸屏驱动,由于MINI2440采用一线触控,而非四线电阻触控所以触摸屏
*   驱动无法使用。
********************************************************************/
 
/********************************************************************
*宏定义
********************************************************************/
#define INTMSK ( (*(volatile unsigned long *)0X4A000008) )      //中断掩码寄存器
#define INTSUBMSK ( (*(volatile unsigned long *)0X4A00001C) )   //子中断掩码寄存器
 
#define ADCCON ( (*(volatile unsigned long *)0x58000000) )   //ADC控制寄存器
#define ADCTSC ( (*(volatile unsigned long *)0x58000004) )   //ADC触摸屏控制寄存器
 
#define ADCDAT0 ( (*(volatile unsigned long *)0x5800000C) )   //ADC0转换数据寄存器
#define ADCDAT1 ( (*(volatile unsigned long *)0x58000010) )   //ADC1转换数据寄存器
 
#define SUBSRCPND ( (*(volatile unsigned long *)0X4A000018) )   //子中断掩码寄存器
#define SRCPND ( (*(volatile unsigned long *)0X4A000000) )      //中断源请求寄存器
#define INTPND ( (*(volatile unsigned long *)0X4A000010) )      //中断请求寄存器
 
/********************************************************************
*名称:init_touchscreen
*参数:
*   none
*返回:
*   none
*功能:初始化触摸屏
*********************************************************************/
void init_touchscreen(){
    //设置ADC转换频率
    ADCCON = (1<<14)|(49<<6);   //PRSCEN[14]:1, PRSCVL[13:6]:49 ADC_Freqeuncy=PCLK/(PRSCVL+1) PCLK=50MHz ADC_Freqeuncy=1MHz
     
    //等待按下中断
    ADCTSC = (0<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0);   //UD_SEN[8]:0, YM_SEN[7]:1, YP_SEN[6]:1, XM_SEN[5]:0, XP_SEN[4]:1, PULL_UP[3]:0, AUTO_PST[2]:0, XY_PST[1:0]:0b11
     
    //设置子中断掩码
    INTSUBMSK &= ~(1<<9);   //INT_TC[9]:0
     
    //设置中断掩码
    INTMSK &= ~(1<<31);   //INT_ADC[31]:0
}
 
/********************************************************************
*名称:touchscreen_irq
*参数:
*   none
*返回:
*   none
*功能:触摸屏中断服务
*********************************************************************/
void touchscreen_irq(){
    int x, y;
 
    if( !(ADCTSC&(1<<8)) ){   //如果是触摸屏按下,UD_SEN[8]:0
        //设置触摸屏自动转换
        ADCTSC = (1<<2);   //AUTO_PST[2]:1
     
        //启动ADC转换
        ADCCON |= (1<<0);   //ENABLE_START[0]:1
         
        //等待ADC转换结束
        while( !(ADCCON&(1<<15)) );   //ECFLG[15]
         
        //获取坐标
        x = ADCDAT0&(0x3FF<<0);   //XPDATA[9:0]
        y = ADCDAT1&(0x3FF<<0);   //YPDATA[9:0]
         
        //清除子中断请求
        SUBSRCPND |= (1<<9);   //INT_TC[9]:0
         
        //清除中断源请求
        SRCPND |= (1<<31);   //INT_ADC[31]:0
         
        //清除中断请求
        INTPND |= (1<<31);   //INT_ADC[31]:0
         
        //等待弹起中断
        ADCTSC = (1<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0);   //UD_SEN[8]:1, XY_PST[1:0]:0b11
    }else{                    //如果是触摸屏弹起,UD_SEN[8]:1
        //清除子中断请求
        SUBSRCPND |= (1<<9);   //INT_TC[9]:0
         
        //清除中断源请求
        SRCPND |= (1<<31);   //INT_ADC[31]:0
         
        //清除中断请求
        INTPND |= (1<<31);   //INT_ADC[31]:0
         
        //等待按下中断
        ADCTSC = (0<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0);   //UD_SEN[8]:0, XY_PST[1:0]:0b11
    }
}

 

posted @   盛夏夜  阅读(260)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示