求430的矩阵键盘程序
求帮助,谁写过430的矩阵键盘程序 这貌似不是很难吧?再讲矩阵键盘也有使用中断与不使用中断两种,你又不讲要哪一种…… unsigned char keyscan (void){
unsigned char ss;
unsigned char num; //按键号
P1DIR =0x0f; //行P1.0-P1.3输出 列P1.4-P1.7输入
//------------------------------------------------
P1OUT = 0xf7;
ss=P1IN;
if(ss!=0xf7) //第一行有键被按下
{
delay(200);
switch(ss)
{
case 0xe7:{num=4;break;}
case 0xd7:{num=3;break;}
case 0xb7:{num=2;break;}
case 0x77:{num=1;break;}
default:num=17;
}
while(P1IN!=0xf7);
}
delay(200);
//------------------------------------------------
P1OUT = 0xfb;
ss=P1IN;
if(ss!=0xfb) //第二行有键被按下
{
delay(200);
switch(ss)
{
case 0xeb:{num=8;break;}
case 0xdb:{num=7;break;}
case 0xbb:{num=6;break;}
case 0x7b:{num=5;break;}
default:num=17;
}
while(P1IN!=0xfb);
}
delay(200);
//-----------------------------------------------
P1OUT = 0xfd;
ss=P1IN;
if(ss!=0xfd) //第三行有键被按下
{
delay(200);
switch(ss)
{
case 0xed:{num=12;break;}
case 0xdd:{num=11;break;}
case 0xbd:{num=10;break;}
case 0x7d:{num=9;break;}
default:num=17;
}
while(P1IN!=0xfd);
}
delay(200);
//----------------------------------------------
return num;
}
不用中断,本人初学430,搞了好久没弄出来,希望给个实例参考参考。
青云LI 发表于 2012-7-9 10:19 static/image/common/back.gif
不用中断,本人初学430,搞了好久没弄出来,希望给个实例参考参考。
可以参考一下 呵呵呵
guo594188 发表于 2012-7-12 17:48 static/image/common/back.gif
可以参考一下 呵呵呵
谢谢指点,已解决 {:loveliness:} ------------楼上你笑什么-{:3_49:} 楼主 我写过一个用看门狗作用作间隔定时器定时器消抖的 比较高级的矩阵按键 扫描 你需不需要?~自认为 比三楼要好 爬爬 发表于 2012-7-17 16:53 static/image/common/back.gif
楼主 我写过一个用看门狗作用作间隔定时器定时器消抖的 比较高级的矩阵按键 扫描 你需不需要?~自认为 比 ...
嗯 ,谢了,给我学习学习吧,不过现在用的是买的矩阵键盘,不需要消抖,不过以后一定用的到 青云LI 发表于 2012-7-17 22:55 static/image/common/back.gif
嗯 ,谢了,给我学习学习吧,不过现在用的是买的矩阵键盘,不需要消抖,不过以后一定用的到 ...
?买的键盘为什么就不用消抖?
感觉你对基本原理并不清楚,还是多看看书,把基础打牢些吧 你没接上拉电阻,会检测不到按键
爬爬 发表于 2012-7-17 16:53 static/image/common/back.gif
楼主 我写过一个用看门狗作用作间隔定时器定时器消抖的 比较高级的矩阵按键 扫描 你需不需要?~自认为 比 ...
贴出来看看,我觉得多条思路对以后编程有益 yf88865 发表于 2012-7-23 17:05 static/image/common/back.gif
贴出来看看,我觉得多条思路对以后编程有益
这是按键的程序
#include<msp430x14x.h>
#include"UART.h"
#define OK 1
#define NO 0
typedef unsigned char uint8;
typedef unsigned int uint16;
void key_init()
{
#ifdef DEBUG
send_string("key board is initaled");
NEXT;
#endif
P1DIR|=(BIT7+BIT6+BIT5+BIT4);
}
unsigned char key_scan()
{
P1OUT&=~(BIT7+BIT6+BIT5+BIT4);
if((P1IN&0X0F)!=0X0F) return OK;//返回一个作为判断是否按下
else return NO;
}
unsigned char key_get()
{
uint8 temp1=0x80;
uint8 n=0;
for(n=0;n<4;n++)
{
P1OUT=0XF0;
P1OUT&=~temp1;//依次将输入給低 且只有一个为低
temp1>>=1;
if((P1IN&BIT0)==0) return (1+(n*4));
if((P1IN&BIT1)==0) return (2+(n*4));
if((P1IN&BIT2)==0) return (3+(n*4));
if((P1IN&BIT3)==0) return (4+(n*4));
}
return 0;
}
下面是在主函数关于按键 的程序
#pragma vector=WDT_VECTOR
__interrupt void WDT_int()
{
//static uint16 j=0;
//static uint8 j2=0;
static uint8 cnt=0;
static uint8 flag1=0;
static uint8 flag2=0;
#ifdef DEBUG
j++;
if(j==1000)
{
j=0;
j2++;
if(j2%2)LED_1;
else LED_0;//led的作用是作为一个指示灯 做一个LED小模块 作为指示灯
}
#endif
cnt++;
if(cnt==30)
{
cnt=0;
if(flag1=key_scan())
{
if(!flag2)
{
#ifdef DEBUG
send_string("key is pressed");
NEXT;
#endif
num=key_get();
#ifdef DEBUG
send_char(num+48);
NEXT;
#endif
}
flag2=flag1;
}
}
if((flag1==0)&&(flag2==1))
{
#ifdef DEBUG
send_string("key gets up");
NEXT;
#endif
flag2=0;
//LPM3_EXIT;
}
}
/*将按键的检测放入看门狗定时器中断中每隔一定时间进来检测 */
防抖不太好做
页:
[1]