1.每日自省; 2.享受人生; 3.尽力而为; 4.坚持不懈; 5.切莫急躁; 6.慎言敏行; 7.动心忍性; 8.上善若水。
全部博文(134)
分类: C/C++
2012-10-08 11:29:11
一、端口P1,P2
? P1DIR、P2DIR:P1、P2 端口方向寄存器
0: I/O 引脚被切换成输入模式
1: I/O 引脚被切换成输出模式
复位后默认为
? P 1IN、P2IN:P1、P2 端口输入寄存器
? P1OUT、P2OUT:P1、P2 端口输出寄存器
? P1IE、P2IE:P1、P2 端口引脚中断允许寄存器
其中:P1IE、P2IE 的各位定义如下:
0:禁止该位中断
1:允许该位中断
? P1IES、P2IES:P1、P2 端口引脚中断触发沿选择寄存器
如果允许P0 口的某个引脚中断,还须定义该引脚的中断触发沿,该寄存器的8位分别定义了P0 口的8 条引脚的中断触发沿。
0:对应引脚由低到高的电平跳变(上升沿)使相应标志置位
1:对应引脚由高到低的电平跳变(下降沿)使相应标志置位
? P1IFG、P2IFG:P1、P2 端口中断标志寄存器
? P1SEL、P2SEL:P1、P2 功能选择寄存器
P1、P2 两端口还有其它片内外设功能,考虑减少引脚,将这些功能与芯片外的联系
通过复用P1、P2 引脚的方式以实现。P1SEL、P2SEL 用来选择引脚的I/O(输入/输
出)端口功能与外围模块功能。
0:选择引脚为I/O 端口
1:选择引脚为外围模块功能
二、端口P3、P4、P5、P6
这些端口没有中断能力,其余功能与 P1、P2 一样
三、外部中断写法
主程序语句如下:
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P5DIR |= 0x0F; // 设置 P5.0-P5.3 为输出方向
P1DIR = 0x0F; // 设置P1.4 -P1.7 为输入方向
P1IE = 0xf0; // 设置P1.4 -P1.7 可以中断
P1IES = 0xf0; // 设置P1.4 -P1.7 为下降沿中断
_BIS_SR(LPM3_bits + GIE); // 进入最低功耗睡眠,打开总中断开关
for (;;)
{
}
}
语句“#pragma vector=PORT1_VECTOR”指明中断函数是为什么中断服务的,即中断向量。本程序将为端口P1 服务,所以使用PORT1_VECTOR 中断向量,该PORT1_VECTOR 的含义在头文件中有明显表述,请仔细查阅。
语句“__interrupt void p1int(void)”为中断函数的函数声明。
需要注意的是:P1 的中断标志不能自动清除,需要人为清除,所以程序最后需要清除端口P1 的中断标志,否则会引起中断嵌套,引起死循环。
#pragma vector=PORT1_VECTOR
__interrupt void p1int(void)
{
if((P1IN&BIT5) == BIT5)
P5OUT &= ~BIT1 ;
else
P5OUT |= BIT1;
if((P1IN&BIT6) == BIT6)
P5OUT &= ~BIT2;
else
P5OUT |= BIT2;
if((P1IN&BIT7) == BIT7)
P5OUT &= ~BIT3;
else
P5OUT |= BIT3;
P1IFG = 0 ;
}
四、键盘检测写法
综合起来,一般的键盘程序有如下三个步骤:
A 消除按键抖动(如果使用硬件,则可略);
B 判断是哪个按键按下,识别键码;
C 等待按键松开。
? 主程序:(提供端口设置,使之能进入中断)
unsigned char keybuf; // 全局变量,键值缓存
……
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1DIR = 0x0F; // 设置P1.4 -P1.7 为输入方向
P1IE = 0xf0; // 设置P1.4 -P1.7 可以中断
P1IES = 0xf0; // 设置P1.4 -P1.7 为下降沿中断
_BIS_SR(LPM3_bits + GIE); // 进入最低功耗睡眠,打开总总断开关
……
? 判键子程序
unsigned char p1keyj(void) // 判键子程序
{
unsigned char x;
x=(P1IN&0Xf0); // P14--P17 接有按键
return(x); // 有按键返回非全 1
}
? 中断服务程序:
#pragma vector=PORT1_VECTOR
__interrupt void p1int(void)
{
//端口1 的中断服务程序
while(p1keyj()!=0xf0) //没有按键按下,返回全1――0xf0
{
delay(500); //延时消除抖动
while(p1keyj()!=0xf0)
{
keybuf = keycode();//确信有按键按下,找按键得键值,送到全局变量keybuf
while(p1keyj()= =0) //等待按键松开
; //做对应键盘的事务
}
}
}