📄 main.c
字号:
// 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中
// 此示例程序没有显示,
// 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列
// 在其他的中断服务程序中通过键值队列中的数据引导程序的流程
//头文件
#include<MSP430x14x.h>
//unsigned char keybuff[10];
unsigned char keypoint=0;
unsigned char x;//为了让软件去抖,定义一个全局变量,每次都记住一个键值,防止抖动
void delay(int v)//延时程序
{
while(v!=0)v--;
}
unsigned char key(void)
{
//unsigned char x;
P1DIR|=0X0F;//
P1OUT=0XFE;//扫描第一行
if((P1IN&0XF0)==0XE0)
x=0X01;
else
if((P1IN&0XF0)==0XD0)
x=0X02;
else
if((P1IN&0XF0)==0xB0)
x=0X03;
else
if((P1IN&0XF0)==0x70)
x=0X04;
else
{
P1OUT=0XFD; //扫描第二行
if((P1IN&0XF0)==0XE0)
x=0X05;
else
if((P1IN&0XF0)==0XD0)
x=0X06;
else
if((P1IN&0XF0)==0xB0)
x=0X07;
else
if((P1IN&0XF0)==0x70)
x=0X08;
else
{
P1OUT=0XFB; //扫描第三行
if((P1IN&0XF0)==0XE0)
x=0X09;
else
if((P1IN&0XF0)==0XD0)
x=0X0A;
else
if((P1IN&0XF0)==0xB0)
x=0X0B;
else
if((P1IN&0XF0)==0x70)
x=0X0C;
else
{
P1OUT=0XF7; //扫描第四行
if((P1IN&0XF0)==0XE0)
x=0X0D;
else
if((P1IN&0XF0)==0XD0)
x=0X0E;
else
if((P1IN&0XF0)==0xB0)
x=0X0F;
else
if((P1IN&0XF0)==0x70)
x=0X1F;
}
}
}
return(x);
}
unsigned char keyj(void)
{
unsigned char x;
P1DIR|=0X0F;//低四位设置为输出 高四位输入
P1OUT=0XF0;//低四位输出低电平,高四位上拉态 //键盘硬件:P10--P13为行线,最上面一根为P10
x=(P1IN&0XF0); //P14--P16为列线,最左边一根为P14,列线下拉
return(x); //无按键,返回 0?; 有按键返回 非0
}
#pragma vector=PORT1_VECTOR
__interrupt void p1int(void)
{
if(keyj()!=0X00)
{
delay(200) ; //消抖动
if(keyj()!=0X00)
{
P4OUT=key();//按键见键值保存到队列
// keypoint++;
// if(keypoint==10)
//keypoint=0;
}
}
P1OUT=0XF0;
P1IFG=0X00; //清除中断标志,中断结束后一定要对中断标志清零
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; /* // Stop WDT */
P4DIR=0XFF;//P4口设置为输出
P4OUT=0X00;
P1DIR=0X0F;//低四位设置为输出,高四位输入,高四位为中断入口
P1OUT=0XF0;//低四位输出高电平,高四位上拉态
P1IES|=0X0F;//下降沿触发中断
P1IE|=0XF0;//列线下降沿允许P1中断 高四位 一旦高四位导通则为低电平 触发中断
_EINT(); /*/ Enable interrupts */
while(1)
{
LPM0;
_NOP();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -