注:本文的所有操作都是基于NXP公司的ARM7TDMI-S系列芯片LPC2103,关于寄存器的定义请见我上传的附件的“LPC2103.h”头文件
一、相关主要寄存器
1,PINSEL0和PINSEL1 (引脚功能选择寄存器)可读写
一个引脚大多数情况都是复用的,可以通过这个寄存器来设置相应引脚做的功能。默认初始值为“0”,即做为GPIO口使用,因此作为I/O口使用时大多数情况不用设置此寄存器;
2,IOPIN (I/O引脚状态值寄存器)可读写
保存引脚当前状态值的寄存器,无论引脚的方向如何设置,引脚的状态都是可以从这个寄存器读出的;
3,IODIR (I/O引脚方向控制寄存器)可读写
该寄存器用于控制每个I/O脚的方向(输入/输出);相应位写“0”则为输入,写“1”则为输出
4,IOSET (I/O引脚输出设置寄存器)可读写
该寄存器和IOCLR一起控制引脚的输出状态。给其写“1”,就输出一个高电平,写“0”则无效。该引脚若被设置为输入,则对其进行写操作无效;
5,IOCLR (I/O引脚输出清零寄存器)
该寄存器控制引脚的输出状态。给其写“1”就输出一个低电平,同时清零IOSET的相应位,写“0”则无效。该引脚若被设置为输入,则对其进行写操作无效;
二、操作示例
在这里我以操作GPIO口P0.22为例:
(注:关于寄存器的的赋值操作请见我C编程分类下寄存器操作一文)
1, 设置为输出使用,并读写P0.22
/* 前面我说过PINSEL1寄存器的默认初始设置为做GPIO,但是有时会对一个引脚的几个功能切换使用,故我习惯对一个引脚做I/O使用时先对其相应位清零操作 */
PINSEL1 &= ~(3 << 7);
/* 设置I/O口的方向,输出 */
IODIR |= (1 << 22);
/* 读P0.22状态值*/
temp = IOPIN;
/* 让P0.22输出“1”(高电平) */
IOSET |= (1 << 22);
/* 让P0.22输出“0” (低电平)*/
IOCLR |= (1 << 22);
/* 让P0.22输出上升沿 */
IOCLR |= (1 << 22);
IOSET |= (1 << 22);
/* 让P0.22输出下降沿 */
IOSET |= (1 << 22);
IOCLR |= (1 << 22);
2, 设置为输入使用,并读写P0.22
(注:LPC2103的引脚做I/O使用时由于其本身不带内部上拉功能,故在作为输入使用时,其状态只能通过接收外部输入来改变)
/* 功能选择 */
PINSEL1 &= ~(3 << 7);
/* 设置I/O口的方向,输入 */
IODIR |= (1 << 22);
/* 读P0.22状态值 */
temp = IOPIN;
关于LPC2103的寄存器定义的头文件:
这只是我学习过程中的记录和整理,由于本人才刚刚进入这个行业,在文中如有错误和不托之处还请大师留言指点,学生先在此谢过过!!!
用户377235 2014-3-11 15:55
用户377235 2013-4-11 15:23
用户1552690 2009-3-10 08:38