#include "msp430x14x.h"
unsigned char LineScan[4]={0xef,0xdf,0xbf,0x7f}; //列值列举
void ADD()
{
P4OUT+=1;
}
void SUB()
{
P4OUT-=1;
}
unsigned int key_check(void) //检测是否有按键按下
{
unsigned char temp;
P1DIR=0xf0; //定义P1.4~P1.7为输出
temp=P1IN & 0x0f;
if(temp!=0x0f)
return 1;
else
return 0;
}
unsigned char scan_key(void) //扫描对应按键的键号
{
P1DIR=0xf0;
unsigned char count;
unsigned char i,temp,m,n; //m为列的值,n为行的值
unsigned int flag=0;
for(i=0;i<4;i++) //列扫描
{
P1OUT=LineScan[i]; //获取扫描的列
temp=P1IN&0x0f;
if(temp==0x07) //为第一行
{n=0; //记录按下按钮的行
flag=1; //标志检测出来
break;}
else if(temp==0x0b) //为第二行
{n=1;
flag=1;
break;}
else if(temp==0x0d) //为第三行
{n=2;
flag=1;
break;}
else if(temp==0x0e) //为第四行
{n=3;
flag=1;
break;}
}
if(flag==1)
{m=i;
flag=0;
count=n*4+m;
switch(count)
{
case 0: {;break;}
case 1: {;break;}
case 2: {;break;}
case 3: {;break;}
case 4: {;break;}
case 5: {;break;}
case 6: {;break;}
case 7: {;break;}
case 8: {;break;}
case 9: {;break;}
case 10:{;break;}
case 11:{SUB();break;}
case 12:{;break;}
case 13:{;break;}
case 14:{;break;}
case 15:{ADD();break;}
}
return;
}
else
return;
}
void Delay(char wDelay) //延时子程序
{
while(wDelay!=0)
wDelay--;
}
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P4DIR =0xff;
P4OUT=0X00;
while(1)
{
if(key_check())
{Delay(10000);
if(key_check())
{
scan_key();
while(key_check());
P1OUT=0x0f;
}
}
}
}
关键字:MSP430 矩阵式按钮 驱动程序
引用地址:
MSP430矩阵式按钮驱动程序
推荐阅读最新更新时间:2024-11-13 07:46
MSP430中断程序
#include msp430g2553.h void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR |= 0x01; // Set P1.0 to output direction P1IE |= 0x10; // P1.4 interrupt enabled P1IES |= 0x10; // P1.4 Hi/lo edge
[单片机]
MSP430F149的ADC12模块
1 概述 MSP430F149的ADC12为SAR型12位AD,共有16路输入通道,其中8路独立的外部输入通道,2路接外部Vref+,Vref-,3路内部通道可分别测内部温度传感器、AVCC、和外部参考源。 P6口第二功能为AD输入端。MSP430F149的10、11分别接外部电压参考源正负极,7脚可将内部电压参考源输出。 ADC12共有18个中断源,公用一个中断向量ADC12_VECTOR。 AD的参考源可选择内部电压参考源或外部电压参考源。内部电压参考源有1.5V,2.5V可选,使用时向ADC12CTL0写入REFON+ REF2_5V就打开了2.5V。外部电压参考源由REF+接入。上电时若不设置参考源,则参考源
[单片机]
MSP430 LaunchPad IO外部中断
#include msp430g2231.h int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= 0x01;//设置P1.0口为输出 P1IE |= 0x08;//使能P1.3中断 P1IES |= 0x08;//P1.3口下降沿触发中断 P1IFG &= ~0x08;//中断标志位清零 _EINT();//开总中断 //_BIS_SR(LPM4_bits + GIE); while(1) { } } /*中断服务程序*/ #pragma vector =
[单片机]
51单片机+MPU6050驱动程序,1602显示
想做滚球控制系统,先写了个MPU6050驱动看看 单片机源程序如下: #include REG52.H #include math.h //Keil library #include stdio.h //Keil library #include INTRINS.H typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; //**************************************** // 定义51单片机端口 //*******************************
[单片机]
单片机MSP430入门--理论④--时钟模块-BCSCTL2寄存器
上期大概给大家汇总介绍了,在MSP430环境下的时钟寄存器DOCCTL和BCSCTL1寄存器,每个位代表的意义以及他们的设置方法 本期将重点介绍下,在MSP430环境下的时钟寄存器BCSCTL2,他每个位的意义以及他们的设置方法 1.0 BCSCTL2(Basic Clock System Control2)寄存控制器(用来设置SMCLK子时钟,MCLK主时钟),地址为58H,初始值为00H SELM0-SELM1: 选择MCLK的时钟源,0和1为DCOCLK,2为XT2CLK,3为LFXT1CLK DIVM0-DIVM1: 选择MCLK的分频因子,DIVM=0,1,2,3,对应MCLK的分频因子1,2,4,8
[单片机]
基于MSP430单片机的智能自适应间断光控系统设计
为了克服现有补光系统补光时间、补光程度不能调节,全光谱不能被光合作用充分利用的缺点,系统基于MSP430单片机,利用光合作用光反应速率大于暗反应的原理,将持续补光改进为间断补光,避免浪费光反应产物,抑制暗反映;由光敏传感电路检测当前环境光强,以设定占空比进行间断补光至最适宜该植物生长的光强;采用红色:蓝色为5:1的高亮LED灯组代替普通补光灯,光谱吸收率高。该系统创新、高效、节能,适合温室、大棚、家庭等广泛应用。 传统的温室大棚光照系统,在光照强度不够的情况下就进行补光,补光的时间不能调节,是一直亮着的,而且补光的程度都一致,不能调节。这样在有些情况下,不仅会浪费多余的光照,浪费了宝贵的电能,不利于节能减排,而且如果外
[单片机]
OK6410按键驱动程序(改)亲测可以运行
#include linux/kernel.h #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/gpio.h #include linux/types.h #include linux/cdev.h #include linux/interrupt.h #include linux/sched.h #include linux/device.h #include linux/poll.h #include linux/semaphore.h #include linux/
[单片机]
MSP430F5529学习笔记(二)——按键|IO输入
学习了简单的IO口输出点灯实验,IO既有输出也有输入,在MSP430中输出由PxOUT寄存器进行操作,相对应的就有输入寄存器PxIN来进行输入的操作。 为体现按键效果我采用了按键控制LED灯的使用场景,这个也是单片机中按键的基础操作,通过对输入信号的检测来改变输出信号。首先我们是对LED的简单配置 WDTCTL = WDTPW +WDTHOLD;// stop watchdog timer P1DIR |=BIT0;//板载LED设置为输出 P1OUT|=BIT0; 以上操作即为关闭看门狗,设置对应IO口输出状态并给予IO口初始状态,如有疑问可参照我上一篇笔记。 按键外设的IO口配置 按键作为常用外设之一,
[单片机]