5255|7

99

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求430按键中断扫描程序 [复制链接]

中断,4*4的!求教!

最新回复

#include "msp430f249.h" unsigned char keynum;//定义键号 void delay(void);//延时函数申明 void display(void);//显示函数申明 unsigned char scankey(void);//扫描函数申明 main( void ) {   WDTCTL = WDTPW + WDTHOLD;   P1SEL=0x00;P2SEL=0x00;//设功能   P1DIR=0xff;P2DIR=0xF0;//定方向,P2行线输入,列线输出   //行线有上拉电阻,列线扫描,无键则读行线必为1   //列线   P1OUT=0xFF;//初始灯灭   P2OUT=0x00;//列线初值为0,当有键按下时,行线会被拉低,便于产生下降沿中断   //注:虽然令P2OUT=0,但因为P2DIR的设定,只有高4位列线有输出,后面语句同   P2IE=0x0F;//行线开中断   P2IES=0x0F;//行线的中断属于下降沿   _BIS_SR(LPM3_bits + GIE); //最低功耗睡眠   while(1); } #pragma vector=PORT2_VECTOR  //中断服务对象申明 __interrupt void p2int(void) //中断函数定义 {    delay();                  //延迟10ms去抖    if((P2IN&0x0F)!=0x0F) //按键判断      {      keynum=scankey(); //获取键号      display();        //显示键号(静态)      }   P2IFG=0;             //清除中断标志 } unsigned char scankey(void)//扫描函数 {   unsigned char x=16;//定义键号返回值x   unsigned char i,n,m,j=0x10;//定义m列,n行,列扫描数据j,初值选中0列   for(i=0;i  详情 回复 发表于 2011-8-11 15:53
 
点赞 关注

回复
举报

55

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
又想拿来就算啦!不给!
 
 

回复

99

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
贴出来大家学习下嘛,高手!
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 楼主 水货老手 的帖子

只说说几个函数吧
首先把IO口初始化    设置好中断使能   是上升沿还是下降沿中断
一个按行扫描键值的函数     一个确定是否有按键按下的函数
然后中断里消抖    将键值保存在设置好的缓冲寄存器里   清除中断标志就行了
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

5
 
给分我就给你
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 Evil维 的帖子

怎么给分的?标个价,说个给分的方法,我给!
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 楼主 水货老手 的帖子

把我以前看过的给你一份了

/***********************************************
程序功能:扫描4X4键盘并将键值在数码管上显示
------------------------------------------------
跳线设置:将跳线座J3上的短路帽拔下
------------------------------------------------
测试说明:按动K1~K16按键,观察数码管显示,聆听
          按键时蜂鸣器是否发声
************************************************/
#include
#include "BoardConfig.h"
#include "Keypad.h"
#include "gdata.h"

/********************主函数********************/
void main(void)
{
   // uint i;
    BoardConfig(0x80);            //打开数码管、流水灯,关闭电平转换        
    WDTCTL = WDT_ADLY_1_9;        //设置内部看门狗工作在定时器模式,1.9ms中断一次
    IE1 |= WDTIE;                 //使能看门狗中断
  
    P2DIR = 0xff;
    P4DIR = 0xff;                 //设置P4,P5的IO方向为输出
    P5DIR = 0xff;  
    //P6DIR |= BIT7;
    P2OUT = 0xff;
    P4OUT = 0x00;                 //设置P4,P5的输出初值
    P5OUT = 0xff;
    P6OUT |= BIT7;
    _EINT();                      //打开全局中断
    Init_Keypad();
    while(1)
    {
        Key_Event();
   
        if(key_Flag == 1)
        {
            key_Flag = 0;
            Dispbuf[0] = key_val / 10;
            Dispbuf[1] = key_val % 10;
            P2OUT = ~(key_val);         //LED显示键值
            //P6OUT = 0;                  //蜂鸣器响一声
            //for(i = 2000; i > 0; i--);
            //P6OUT |= BIT7;
        }
    }
}
/*******************************************
函数名称:watchdog_timer
功    能:看门狗中断服务函数,在这里输出数码管的
          段选和位选信号
参    数:无
返回值  :无
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    P5OUT = 0xff;
    P4OUT = scandata[Dispbuf[cnt]];         //输出段选信号
    P5OUT &= ~(1 << (cnt));               //输出位选信号
  
    cnt++;                                  //位计数变量在0~1之间循环
    if(cnt == 2) cnt = 0;
}
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

8
 
#include "msp430f249.h"
unsigned char keynum;//定义键号
void delay(void);//延时函数申明
void display(void);//显示函数申明
unsigned char scankey(void);//扫描函数申明
main( void )
{
  WDTCTL = WDTPW + WDTHOLD;
  P1SEL=0x00;P2SEL=0x00;//设功能
  P1DIR=0xff;P2DIR=0xF0;//定方向,P2行线输入,列线输出
  //行线有上拉电阻,列线扫描,无键则读行线必为1
  //列线
  P1OUT=0xFF;//初始灯灭
  P2OUT=0x00;//列线初值为0,当有键按下时,行线会被拉低,便于产生下降沿中断
  //注:虽然令P2OUT=0,但因为P2DIR的设定,只有高4位列线有输出,后面语句同
  P2IE=0x0F;//行线开中断
  P2IES=0x0F;//行线的中断属于下降沿
  _BIS_SR(LPM3_bits + GIE); //最低功耗睡眠
  while(1);
}

#pragma vector=PORT2_VECTOR  //中断服务对象申明
__interrupt void p2int(void) //中断函数定义
{
   delay();                  //延迟10ms去抖
   if((P2IN&0x0F)!=0x0F) //按键判断
     {
     keynum=scankey(); //获取键号
     display();        //显示键号(静态)
     }
  P2IFG=0;             //清除中断标志
}

unsigned char scankey(void)//扫描函数
{
  unsigned char x=16;//定义键号返回值x
  unsigned char i,n,m,j=0x10;//定义m列,n行,列扫描数据j,初值选中0列
  for(i=0;i<4;i++)//有4列,需要扫4次
  {
    P2OUT=~j;//输出列扫描信号(行线不会输出)
    if((P2IN&0x0F)!=0x0F)//如果行有变低的
    {
      m=i;//顺手记下列号
      switch(P2IN&0x0F) //判断行号
      {
      case 0x0e:n=0;break;
      case 0x0d:n=1;break;
      case 0x0b:n=2;break;
      case 0x07:n=3;break;
      }
      x=n*4+m;//算键号
    }
    j=j<<1;//为下一列做准备
  }
  P2OUT=0x00;//扫描完成,列线重新为低,为下次中断做准备
  return(x);
}

void display(void)    //显示对应键号0~F,无键则显示H,一共17个数
{
unsigned char number[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0X89};
P1OUT=number[keynum]; //显示
}

void delay(void)//10ms延时
{
unsigned int a;
for(a=10000;a>0;a--);
}
算了,就给你吧,今天我程序也没写出来,深知写不出来的痛苦
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表