2009年1月5日星期一

LPC系列学习之一(GPIO)

作者:Sam(甄峰) sam_code@hotmail.com

程序背景:
RFID项目中,Larry设计了一个Keyboard.他是这样设想的:因为我们的手持机只需要18个key.
所以做了一个4x5的线路交叉列表。每个键就是一个开关,当按下时则可以通过线路电平变化得到按下哪个键。
4x5的线路交叉列表,则至少需要9(4+5)个引脚---S0,S1,S2,S3,K0,K1,K2,K3,K4. 这9个引脚则连接到LPC2138(共64个引脚)的引脚上。
具体是这样的:
S0:引脚17.(P0.31)
S1: 引脚39 (P0.13)
S2: 引脚38 (P0.12)
S3: 引脚36 (P1.23 //)
K0: 引脚31 (P0.9//)
K1: 引脚28 (P1.25//)
K2: 引脚22 (P0.2/SCL0/CAP0.0)
K3: 引脚20(P1.31/TRST)
K4: 引脚37 (P0.11//)

GPIO详解:
LPC2138上的GPIO特征:
1. 单独位的方向控制,即每一个I/O口线可单独设置为输入/输出模式。
2. 单独控制I/O口输出的置位或清零.
3. 所有I/O口在复位后默认为输入。

LPC2138上的GPIO用途:
1. 通用I/O 口。
2. 驱动LED或者其它指示器。
3. 控制片外器件。
4. 检测数字输入,如键盘或开关信号。


引脚描述:
P0和P1端口的GPIO引脚。
P0: P0.0-P0.31
P1:P1.16-P1.31
通用I/O口。


LPC2138拥有2个32位的通用I/O口---P0,P1.
P0口使用了30个引脚(P0.0-P0.25, P0.27-P0.30)
P1 口有16个引脚 (P1.16-p1.31)可以用作GPIO功能。

GPIO控制寄存器:
P0口和P1口由2组(每组4个)寄存器控制。

IOPIN:引脚值寄存器(IO0PIN-0xE0028000,IO1PIN-0xE0028010)
它提供GPIO引脚的值。读取可以读出相应GPIO引脚的值,写入无意义。
其中:IO0PIN的0位对应P0.0。位31对应P0.31

IOSET:输出置位寄存器(IO0SET-0xE0028004, IO1SET-oxE0028014)
当引脚配置为GPIO输出模式时,可使用该寄存器从引脚输出高电平。对应位写入1,则对应Px.x输出高电平。则此时IOPIN对应位读取时显示为1。写入0无效。当引脚被配置为输入或者其他功能,写IOSET 无效。

IOCLR:输出清零寄存器(IO0CLR-0xE002800C, IO1CLR-0xE002801C)
当引脚配置为GPIO输出模式时,可使用该寄存器从引脚输出低电平。对应位写入1,则对应Px.x输出低电平。则此时IOPIN对应位读取时显示为0。写入0无效。引脚被配置为输入或者其他功能,写IOCLR 无效。

IODIR:方向寄存器(IO0DIR-0xE0028008, IO1DIR-0xE0028018)
当引脚为GPIO模式时,可以使用该寄存器控制引脚的方向。(0=输入,1=输出)


现在讲解如何得到某个键被按下:
1.1:将S0,S1,S2,S3全部设为高电品。
1.1.1. IO0SET=0x80000000 将P0.31(S0)引脚设为高电平。
1.1.2. IO0SET=(1<<13) 将P0.13(S1)引脚设为高电平。
1.1.3. IO0SET=(1<<12) 将P0.12(S2)引脚设为高电平。
1.1.4 IO1SET=(1<<(23))将P1.23(S3)引脚设为高电平。

1.2:依次将S0,S1,S2,S3设为低电平,然后检查K0,K1,K2,K3,K4. 看谁为低电平。就证明Sx Kx处按键被按下(例如当S0为低电平,S1,S2,S3均为高电平时,监测到K1为低电平,则证明S0 K1处开关被连通,也就是说此按键被按下)。然后再恢复S位为高电平。
例1:
IO0CLR=0x80000000 //S0低电平
if((IO0PIN&(1<return 1;
IO0SET=0x80000000 //S0变为高电平

没有评论: