MSP430 矩阵键盘扫描

#include "msp430x44x.h"

void Delay(int m);
void clr_lcdmem(void);
void key_display (void);
void scan_key(void);
//=========================================================//
// 端口定义
// LCD显示型号:7位半48段 矩阵键盘4x3
// P1. 7 6 5 4 3 2 1
// in/out in/out in/out in/out out/in out/in out/in
// K 1 2 3 # # 0 *
// K 4 5 6 0 3 6 9
// K 7 8 9 * 2 5 8
// K 1 4 7
//
// S 0 1 2 ~ 14
// out out out out
// s0 s1 s2 ~ s14
//
//com 0 1 2 3
// out out out out
// com0 com1 com2 com3
//=========================================================//
//---------------------------------------------------------//
// 全局变量: flag,key_buff,buffer,buffer1,buffer2,kb1,kb2;
// 备 注:flag:0.2s标志 key_buff:显示键值 buffer:实际键值
// 备 注:buffer1:低四位键值 buffer2:高四位键值
// 备 注:kb1:按键按下标志1 kb2:按键按下标志2
//---------------------------------------------------------//
static unsigned char flag;
static unsigned char key_buff,buffer,buffer1,buffer2,kb1,kb2;
static unsigned int key_cnt[12]={0,0,0,0,0,0,0,0,0,0,0,0};
const unsigned char lcd_table[12]={
0x7B, // "0"
0x12, // "1"
0x4F, // "2"
0x1F, // "3"
0x36, // "4"
0x3D, // "5"
0x7D, // "6"
0x13, // "7"
0x7F, // "8"
0x3F, // "9"
0x6D, // "E"
0x65 // "F"
};
//---------------------------------------------------------//
// 功 能:主函数,寄存器初始化,LCD显示
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: MCLK=DCO倍频至1MHz SMCLK=XT2=4MHz TimerA连续模式
//---------------------------------------------------------//
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
LCDCTL= 0X5D;
P5SEL = 0XFD;
SCFI0 |= FN_2;
FLL_CTL0 = XCAP14PF;
SCFQCTL = 30;
FLL_CTL1 = SELS;
TACTL = TASSEL_2+TACLR;
CCTL0 = CCIE;
CCR0 = 8000;
TACTL |= MC_2;
BTCTL = 0x00; //不配置就总复位
clr_lcdmem();
_EINT();

while(1);
}

//---------------------------------------------------------//
// 功 能:TimerA溢出中断
// 入口参数: /
// 出口参数: /
// 全局变量: buffer、buffer1、buffer2、key_buff、key_cnt。
// 备 注: 调用了键盘扫描,键值翻译,键值显示子程序。
//---------------------------------------------------------//
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
flag++;

if (flag==100)
{
flag=0;
scan_key();
buffer=buffer1|buffer2;
switch (buffer)
{
case 0x76:key_buff=1; key_cnt[key_buff]++;break;
case 0xB6:key_buff=2; key_cnt[key_buff]++;break;
case 0xD6:key_buff=3; key_cnt[key_buff]++;break;
case 0xE6:key_buff=10;key_cnt[key_buff]++;break;
case 0x7A:key_buff=4; key_cnt[key_buff]++;break;
case 0xBA:key_buff=5; key_cnt[key_buff]++;break;
case 0xDA:key_buff=6; key_cnt[key_buff]++;break;
case 0xEA:key_buff=0; key_cnt[key_buff]++;break;
case 0x7C:key_buff=7; key_cnt[key_buff]++;break;
case 0xBC:key_buff=8; key_cnt[key_buff]++;break;
case 0xDC:key_buff=9; key_cnt[key_buff]++;break;
case 0xEC:key_buff=11;key_cnt[key_buff]++;break;
default:clr_lcdmem();break;
}
key_display();
}
CCR0 += 8000;
}
//---------------------------------------------------------//
// 功 能:延时函数
// 入口参数:延时长度:m。
// 出口参数:/
// 全局变量:/
// 备 注:/
//---------------------------------------------------------//
void Delay(int m)
{
while(m-->0);
}

//---------------------------------------------------------//
// 功 能:LCD清屏
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 初始化时使用。
//---------------------------------------------------------//
void clr_lcdmem(void)
{
int i;
for(i = 0;i<7;i++)
{
LCDMEM[i] = 0x00;
}
}

//---------------------------------------------------------//
// 功 能:键值、按键次数显示
// 入口参数: /
// 出口参数: /
// 全局变量: key_buff、key_cnt。
// 备 注:
//---------------------------------------------------------//
void key_display (void)
{
LCDMEM[7]=0x00;
LCDMEM[6]=lcd_table[key_buff];
LCDMEM[5]=0x04;
LCDMEM[0]=lcd_table[key_cnt[key_buff]%10];
LCDMEM[1]=lcd_table[(key_cnt[key_buff]-(key_cnt[key_buff]-(key_cnt[key_buff]%100)))/10];
LCDMEM[2]=lcd_table[(key_cnt[key_buff]-(key_cnt[key_buff]-(key_cnt[key_buff]%1000)))/100];
LCDMEM[3]=lcd_table[(key_cnt[key_buff]-(key_cnt[key_buff]-(key_cnt[key_buff]%10000)))/1000];
LCDMEM[4]=lcd_table[(key_cnt[key_buff]-(key_cnt[key_buff]-(key_cnt[key_buff]%100000)))/10000];
}

//---------------------------------------------------------//
// 功 能:翻线法获取键值
// 入口参数: /
// 出口参数: /
// 全局变量: kb1、kb2、buffer1、buffer2.
// 备 注: 矩阵键盘扫描
//---------------------------------------------------------//
void scan_key(void)
{
P1DIR = 0xF0;
P1OUT=0x00;
buffer1=0;
kb1=P1IN&0x0F;
if (kb1!=0x0F)
buffer1=P1IN&0x0F;

P1DIR = 0x0F;
P1OUT=0x00;
buffer2=0;
kb2=P1IN&0xF0;
if (kb2!=0xF0)
buffer2=P1IN&0xF0;
}


相关文档
最新文档