?? main.c
字號:
/*****************************************************
程序功能:接收并解碼來自標準鍵盤的基本按鍵的掃描碼
然后控制蜂鳴器的鳴叫頻率和流水燈電路的顯示。
十六進制數字0~9對應10種頻率,按鍵S將停止蜂鳴器發聲
注:所謂基本按鍵就是當此鍵被按下時對應產生三個字節
的掃描碼的按鍵,詳見光盤中的《第二套掃描碼》
-----------------------------------------------------
跳線設置:將跳線座J4的1腳和2腳(右側的兩個)短接
*****************************************************/
#include <msp430x14x.h>
#include "BoardConfig.h"
#include "Keyboard.h"
#include "gdata.h"
#define SIDval P5IN & BIT6
/****************主函數****************/
void main(void)
{
uchar disptmp,i;
WDTCTL = WDTPW + WDTHOLD; //關閉看門狗
BoardConfig(0x70); // 打開4245,方向5-->3.3,數碼管和關閉流水燈
/*------選擇系統主時鐘為8MHz-------*/
BCSCTL1 &= ~XT2OFF; // 打開XT2高頻晶體振蕩器
do
{
IFG1 &= ~OFIFG; // 清除晶振失敗標志
for (i = 0xFF; i > 0; i--); // 等待8MHz晶體起振
}
while ((IFG1 & OFIFG)); // 晶振失效標志仍然存在?
BCSCTL2 |= SELM_2 + SELS; // MCLK和SMCLK選擇高頻晶振
TACCTL0 |= CCIE; //使能比較中斷
TACTL |= TASSEL_2 + ID_3 ; //計數時鐘選擇SMLK=8MHz,1/8分頻后為1MHz
P6DIR = BIT7; //蜂鳴器對應IO設置為輸出
P6OUT = BIT7;
P2DIR = 0xff;
Init_KB(); //初始化鍵盤端口
_EINT(); //打開全局中斷
while(1)
{
LPM1; //進入低功耗模式
disptmp = GetChar(); //讀取鍵值對應的ASCII碼
if((disptmp > 0x2f)&&(disptmp < 0x3a)) //如果接收到的字符是0~9
{
// uchar inputvalue;
// inputvalue = disptmp - 0x30;
switch(disptmp)
{
case '0':
TACCR0 = 5000;
TACTL |= MC0;
P2OUT = ~1;
break;
case '1':
TACCR0 = 2500;
TACTL |= MC0;
P2OUT = ~2;
break;
case '2':
TACCR0 = 1250;
TACTL |= MC0;
P2OUT = ~3;
break;
case '3':
TACCR0 = 625;
TACTL |= MC0;
P2OUT = ~4;
break;
case '4':
TACCR0 = 500;
TACTL |= MC0;
P2OUT = ~5;
break;
case '5':
TACCR0 = 250;
TACTL |= MC0;
P2OUT = ~6;
break;
case '6':
TACCR0 = 167;
TACTL |= MC0;
P2OUT = ~7;
break;
case '7':
TACCR0 = 125;
TACTL |= MC0;
P2OUT = ~8;
break;
case '8':
TACCR0 = 100;
TACTL |= MC0;
P2OUT = ~9;
break;
case '9':
TACCR0 = 83;
TACTL |= MC0;
P2OUT = ~10;
break;
default:
_NOP();
}
}
else if(disptmp == 's')
{
TACTL &= ~MC0; //停止發聲
P6OUT = BIT7;
P2OUT = 0xff;
}
}
}
/*******************************************
函數名稱:Timer_A
功 能:定時器A的中斷服務函數,在這里驅動
蜂鳴器發聲
參 數:無
返回值 :無
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P6OUT ^= BIT7; // Toggle P6.7
}
/*******************************************
函數名稱:PORT1_ISR
功 能:P1端口的中斷服務函數,在這里接收來
自鍵盤的字符
參 數:無
返回值 :無
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG & BIT7) //如果是clock的中斷
{
P1IFG &=~ BIT7; //清除中斷標志
if(bitcount == 11) //接收第1位
{
if(SIDval) //如果不是起始位
return;
else
bitcount--;
}
else if(bitcount == 2) //接收奇偶校驗位
{
if(SIDval) //如果校驗位等于1
pebit = 1;
else
pebit = 0;
bitcount--;
}
else if(bitcount == 1) //接收停止位
{
if(SIDval) //若停止位正確
{
bitcount = 11; //復位位計數變量
if( Decode(recdata) ) //解碼獲得此鍵值的ASCII值并保存
LPM3_EXIT; //退出低功耗模式
recdata = 0; //清除接收數據
}
else //如果出錯
{
bitcount = 11;
recdata = 0;
}
}
else //接收8個數據位
{
recdata >>= 1;
if(SIDval) recdata |= 0x80;
bitcount--;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -