📄 main.c
字号:
#include <msp430x14x.h>
//#include <msp430x14x.h>
unsigned char keybuff[10];
unsigned char keypoint=0;
void delay(int v)
{
while(v!=0)v--;
}
void InitBcs(void)
{
unsigned int i;
WDTCTL=WDTPW+WDTHOLD; //关闭关门狗
_BIS_SR(OSCOFF);
BCSCTL1&=~XT2OFF; //XT2开启 //启动XT2振荡器,
BCSCTL1 |= RSEL0+RSEL1+RSEL2; // 选择最高不标称频率
DCOCTL = 0xE0; //DCOCLK频率最高,不利用MOD进行调整
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for(i=0xFF;i>0;i--); // Time for flag to set
}
while((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
_NOP();
BCSCTL2 |= SELS+DIVS_2; //SMCLK SOURCE XT2/4=460.8KHz
}
void InitUART1(void)
{
P3SEL |= BIT6+BIT7; // P3.6,7 = USART1 TXD/RXD
U1CTL |= SWRST;
U1CTL |= CHAR; // 8-bit character
U1TCTL |= SSEL1; // UCLK = ACLK
U1BR0 = 0x30; // 32k/9600 - 3.41
U1BR1= 0x00; //
U1MCTL = 0x00; // Modulation
U1CTL &= ~SWRST; // Initialize USART state machine
ME2 |= UTXE1 + URXE1; // Enable USART0 TXD/RXD
IE2 |= URXIE1; // Enable USART0 RX interrupt
//IFG2 &= ~UTXIFG1;
}
void InitKey(void)
{
P2DIR=0X0F;
P2OUT=0X0F;
P2IES=0X0;
P2IE=0Xf0; //列线上升沿允许P1中断
}
unsigned char key(void)
{
unsigned char x=0xff;
P2DIR=0X0F;
P2OUT=0X01; //扫描第一行
if((P2IN&0Xf0)==0X10) x=0;
else if((P2IN&0Xf0)==0X20) x=4;
else if((P2IN&0Xf0)==0x40) x=8;
else if((P2IN&0Xf0)==0x80) x=12;
else
{
P2OUT=0X2; //扫描第二行
if((P2IN&0Xf0)==0X10) x=1;
else if((P2IN&0Xf0)==0X20) x=5;
else if((P2IN&0Xf0)==0x40) x=9;
else if((P2IN&0Xf0)==0x80) x=13;
else
{
P2OUT=0X4; //扫描第三行
if((P2IN&0Xf0)==0X10) x=2;
else if((P2IN&0Xf0)==0X20) x=6;
else if((P2IN&0Xf0)==0x40) x=10;
else if((P2IN&0Xf0)==0x80) x=14;
else
{
P2OUT=8; //扫描第四行
if((P2IN&0Xf0)==0X10 ) x=3;
else if((P2IN&0Xf0)==0X20) x=7;
else if((P2IN&0Xf0)==0x40) x=11;
else if((P2IN&0Xf0)==0x80) x=15;
}
}
}
return(x);
}
unsigned char keyjudge(void)
{
unsigned char x;
P2DIR=0xff;
P2OUT=0x0;
P2DIR=0x0f;
P2OUT=0x0f; //键盘硬件:P10--P13为行线,最上面一根为P10
x=(P2IN&0Xf0); // P14--P16为列线,最左边一根为P14,列线下拉
return(x); // 无按键,返回 0?; 有按键返回 非0
}
#pragma vector = PORT2_VECTOR
__interrupt void P2_Interrupt(void)
{
unsigned char ReleaseKey;
if(keyjudge()!=0X00)
{
delay(1000) ; //消抖动
if(keyjudge()!=0X0)
{
keybuff[keypoint]=key(); //按键见键值保存到队列
TXBUF1=key();
while (!(IFG2 & UTXIFG1));
keypoint++; //
if(keypoint==10) keypoint=0;
}
}
ReleaseKey= keyjudge();
while(ReleaseKey!=0X00) ReleaseKey= keyjudge(); //等待键释放
P2OUT=0X0F;
P2IFG=0X0; //清除中断标志
}
void main(void)
{
//WDTCTL = WDTPW + WDTHOLD; /* // Stop WDT */
InitBcs();
InitUART1();
InitKey();
_EINT(); /*/ Enable interrupts */
while(1)
{
LPM0;
_NOP();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -