📄 p296_s1.c
字号:
//矩阵式键盘 P296
//示例程序如下:
//本例修改为采用中断方式处理,
//书上代码留给用户自己研究
/*
将16个按键的电路板接到P1口上
将8路的发光二极管电路板接到P2口上观看运行效果
*/
#include <msp430x14x.h>
#define uint unsigned int
#define uchar unsigned char
//键值编码表
const uchar KeyCode[16]=
{
//0->key17
0xE7,
//1->key18
0xD7,
//2->key19
0xB7,
//3->key20
0x77,
//4->key21
0xEB,
//5->key22
0xED,
//6->key23
0xDB,
//7->key24
0xDD,
//8->key25
0xBB,
//9->key26
0xBD,
//10->key27
0x7B,
//11->key28
0x7D,
//12->key29
0xEE,
//13->key30
0xDE,
//14->key31
0xBE,
//15->key32
0x7E
};
uchar KeyValue=0xFF;
//ms粗略延时
delayms(uint delaytimes)
{
uint i,j;
for(i=0;i<delaytimes;i++)
{
for(j=0;j<1000;j++);
}
}
//端口1中断处理程序
#pragma vector=PORT1_VECTOR
__interrupt void Port1INT(void)
{
uchar i;
uchar colpos=0x70; //列位置
uchar keytemp=0xff;
for(i=255;i>0;i--); //延时,消除抖动
for(i=0;i<4;i++) //扫描4列
{
colpos &= 0xf0; //保持P1.4~P1.7为输出,屏蔽P1.0~P1.3
P1OUT=colpos; //输出列
_NOP();//延时
_NOP();
keytemp=P1IN & 0x0f; //获取值,屏蔽P1.4~P1.7
keytemp |= colpos;//得到行列值,P1.0~1.3为行值,P1.4~P1.7为列值
if((keytemp&0x0f)!=0x0f) KeyValue=keytemp; //判断是否有按键按下
colpos>>=1; //右移一位,进行下一列扫描
colpos|=0x80;//高位补1,因为是低输出有效,右移时高位是补0的
}
P1OUT=0x00;//恢复原来的值,使下次按键按下时能产生中断
P1IFG=0x00;//清除中断标志位
}
void main()
{
uint i;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
//初始化端口
P1DIR=0xF0;//P1.4 P1.5 P1.6 P1.7设置为输出
P1OUT=0x00;//使按键按下时能产生中断
P1IE=0x0F;//P1.0 P1.1 P1.2 P1.3中断允许
P1IES=0x0F;//P1.0 P1.1 P1.2 P1.3下降沿触发中断
P2DIR=0xFF;//P2口所有引脚设置为输出方向
P2OUT=0xFF;//熄灭所有LED
//初始化时钟
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do
{
IFG1&=~OFIFG;//清除振荡器失效标志
for(i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
_EINT();//打开中断
while(1)
{
for(i=0;i<16;i++)
{
if(KeyValue==KeyCode[i])
{
KeyValue = 0xff;
P2OUT=KeyCode[i];
delayms(1000);
}
}
P2OUT=0XFF;
delayms(10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -