Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1840394
  • 博文数量: 134
  • 博客积分: 2488
  • 博客等级: 大尉
  • 技术积分: 7554
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-26 21:19
个人简介

1.每日自省; 2.享受人生; 3.尽力而为; 4.坚持不懈; 5.切莫急躁; 6.慎言敏行; 7.动心忍性; 8.上善若水。

文章分类

全部博文(134)

文章存档

2014年(38)

2013年(42)

2012年(15)

2011年(39)

分类: C/C++

2012-10-08 11:29:11

一、端口P1,P2

 

P1DIRP2DIR:P1、P2 端口方向寄存器

0: I/O 引脚被切换成输入模式

1: I/O 引脚被切换成输出模式

复位后默认为

         

P 1INP2IN:P1、P2 端口输入寄存器

 

P1OUTP2OUT:P1、P2 端口输出寄存器

 

?  P1IEP2IE:P1、P2 端口引脚中断允许寄存器

其中:P1IE、P2IE 的各位定义如下:

 

0:禁止该位中断

1:允许该位中断

 

? P1IESP2IES:P1、P2 端口引脚中断触发沿选择寄存器

如果允许P0 口的某个引脚中断,还须定义该引脚的中断触发沿,该寄存器的8位分别定义了P0 口的8 条引脚的中断触发沿

0:对应引脚由低到高的电平跳变(上升沿)使相应标志置位

1:对应引脚由高到低的电平跳变(下降沿)使相应标志置位

 

?  P1IFGP2IFG:P1、P2 端口中断标志寄存器 

 

?  P1SELP2SEL: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) //等待按键松开

; //做对应键盘的事务

}

}

}

阅读(5002) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~