📄 11_2.c
字号:
#include "msp430x44x.h "
//-------------------------------------------------------------
//
//
//MSP-Test44x Demo ROW matrix key ,LCD dispaly the key value
//
// MSP430F449
// -----------------
// /|\| XIN|-
// | | | key
// LSD048 --|RST XOUT|-
// ---------- | | | |
// | COM0|<---|COM0 P1.1|------>|# 9 8 7 |
// | . | . | . . | . |0 6 5 4 |
// | COM3|<---|COM3 . | . |* 3 2 1 |
// | S0 |<---|S0 . | . | |
// | . | . | P1.7|------>| |
// | S14|<---|S14 |
//
// Lierda, Inc
// 调试 IAR Embedded Workbench Version: 3.41A
// ID: MSP430-TEST44X
// REV: V2.0B
// 程序功能:该程序是用F449的I/O的P1.1、P1.2、P1.3、P1.4、P1.5、P1.6、P1.7实现3X4距阵键盘的检测和控制程序,键值分别
// 是0、1、2、3、4、5、6、7、8、9、E、F,每按一键在LCD上显示键值,如同时按下多键,以第一个键值为主。
// 硬件连接:必须连接所有短接器,LCD显示不受拨动开关的影响;必须将拨动开关P_KEY的第P2、P3、P4、P5拨到数字一端。
//
//-------------------------------------------------------------
#define key_press 0x2
static unsigned char flag; //标志
static unsigned char key_buff; //键值缓存
static unsigned char sec; //秒缓存
static unsigned char min; //分钟缓存
static unsigned char hour; //小时缓存
const unsigned char lcd_table[12]={
0xb7, //*"0"*//
0x12, //*"1"*//
0x8f, //*"2"*//
0x1f, //*"3"*//
0x3a, //*"4"*//
0x3d, //*"5"*//
0xbd, //*"6"*//
0x13, //*"7"*//
0xbf, //*"8"*//
0x3f, //*"9"*//
0xaD, //*"no"*// E
0xa9, //*"no"*// F
};
const unsigned char key_table[12]={
0x0b, //*(key_vaule) 00(key_num)
0x09, //9 01
0x08, //8 02
0x07, //7 03
0x00, //0 04
0x06, //6 05 //键值表
0x05, //5 06
0x04, //4 07
0x0a, //# 08
0x03, //3 09
0x02, //2 0a
0x01, //1 0b
};
void rtc(void);
void display_rtc(void);
void display_dec(int i,int j);
void lcd_display (void);
void scan_key_deal(void);
//--------------------------------------------------
//-----------main PROGRAM-----------------------------
//--------------------------------------------------
void main(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD;
BTCTL=BTSSEL+BT_ADLY_250+BTFRFQ1; //BT 0.25 S 中断
IE2|=BTIE;
P5SEL=0xfc; //使能 lcd 显示
LCDCTL=LCDON+LCD4MUX+LCDP2;
for (i=0; i<8; ++i) //清除 lcd
LCDMEM[i] = 0x00;
_EINT();
PIDIR|=0x0001;
//*mainloop*//
for(;;)
{
_BIS_SR(LPM3_bits); //进入LPM3
_NOP();
if(key_buff==1)
{
PIOUT|=0x0001;
}
}
}
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer(void)
{
rtc(); //
scan_key_deal(); //扫描键值
if(flag) //如果有键按下,显示键值
{
flag=flag<0x6f?flag+1:0;
lcd_display();
}
else
display_rtc(); //
}
//--------------------------------------------------------
//---------RTC ------------------------------------
//--------------------------------------------------------
void rtc (void)
{
if (++sec < 240)
return;
sec = 0;
if (++min < 60)
return;
min = 0;
if (++hour < 24)
return;
hour = 0;
}
//---------------------------------------------------------
//---------RTC 显示-----------------------------
//---------------------------------------------------------
void display_rtc(void)
{ int i;
i=sec;
i=i>>2;
display_dec(0,i);
i=min;
display_dec(2,i);
i=hour;
display_dec(4,i);
LCDMEM[6]=0x00;
}
//---------------------------------------------------------
//-------- RTC LCD 显示-------------------------
//---------------------------------------------------------
void display_dec(int i,int j)
{
LCDMEM[i]=lcd_table[j%10]+0x40;
LCDMEM[i+1]=lcd_table[j/10];
}
//---------------------------------------------------------
//-------- 键值显示-----------------------------
//---------------------------------------------------------
void lcd_display (void)
{
int i;
for (i=0;i<7;i++)
LCDMEM[i]=lcd_table[key_buff&0x0f];
}
//---------------------------------------------------------
//------- 扫描按键---------------------------------
//---------------------------------------------------------
void scan_key_deal(void)
{
unsigned char counter;
unsigned char buffer;
unsigned char com_byte;
unsigned char key_num;
P1DIR=0x0f;
com_byte=0xff;
P1OUT&=~0x08;
P1OUT&=~0x04;
P1OUT&=~0x02;
buffer=P1IN;
if(0xf0!=(buffer&0xf0)) //判断是否有键按下
{
P1OUT|=0x08;
P1OUT|=0x04;
P1OUT|=0x02;
com_byte=0xff;
key_num=0x00;
com_byte=0x02;
for(counter=0x03;counter>0;counter--) //获取键值
{
P1OUT&=~com_byte; //扫描行
if(!(P1IN&BIT4))
break;
key_num++;
if(!(P1IN&BIT5))
break;
key_num++;
if(!(P1IN&BIT6))
break;
key_num++;
if(!(P1IN&BIT7))
break;
key_num++;
com_byte=com_byte<<1;
}
flag|=key_press;
buffer=P1IN;
buffer=P1IN;
key_buff=key_table[key_num]; //得到键值
return;
}
// flag&=~key_press;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -