深圳市英銳恩科技有限公司:臺灣麥肯單片機(Micon MDT單片機)亞太地區(qū)A級代理商
QLdsPIC3]按鍵[C30+dsPIC30F6014A]
//實驗目的:熟悉按鍵的掃描方法
//軟件思路:
// 1、PORTD口低8位的LED做顯示
// 2、按鍵K1...K4-K5...K8對應LED1...LED4-LED5...LED8
// 3、若K1按下則LED1點亮;若K8按下則LED8點亮
//硬件規(guī)劃:
// 1、撥碼開關S1,S2全置ON,其他撥碼開關OFF
// 2、跳線J1跳GND;J2跳UP(J1,J2都在按鍵模塊內(nèi))
#include //dsPIC30F6014標準頭文件
/*配置位*/
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍頻晶振,F(xiàn)ailsafe 時鐘關閉
_FWDT(WDT_OFF); //關閉看門狗定時器
_FBORPOR(PBOR_OFF & MCLR_EN); //掉電復位禁止,MCLR復位使能。
_FGS(CODE_PROT_OFF); //代碼保護禁止
unsigned int __attribute__((address(0x900)))temp1; //定義變量temp1并指定絕對位置
unsigned int __attribute__((address(0x902)))temp2; //定義變量temp2并指定絕對位置
//I/O口初始化函數(shù)
void init(void)
{
TRISA= 0X0F000; //RA12-RA15輸入,其他位輸出
TRISC= 0X001F; //RC1-RC4輸入,其他位輸出
LATD = 0x0000; //關閉所有LED
TRISD = 0xFF00; //設定LED引腳為輸出
}
//按鍵掃描和顯示函數(shù)
void display(void)
{
temp1=PORTA; //讀去PORTA口的狀態(tài)
temp1|=0x0FFF; //防止與按鍵無關位干擾
temp1=~temp1; //結(jié)果去反(因為按下去狀態(tài)為低,點亮LED使應為高)
temp1=temp1>>12; //結(jié)果右移12位(即temp1.3=temp1.15,temp1.0=temp1.12)
temp2=PORTC; //讀去PORTC口的狀態(tài)
temp2|=0x0FFE1; //防止與按鍵無關位干擾
temp2=~temp2; //結(jié)果去反(因為按下去狀態(tài)為低,點亮LED使應為高)
temp2=temp2<<3; //結(jié)果左移12位(即temp2.4=temp2.7,temp2.1=temp2.4)
temp1=temp1|temp2; //temp1與temp2組合得到8個按鍵按下的狀態(tài)
LATD=temp1; //送LED顯示
}
//主函數(shù)
int main(void)
{
while(1)
{
init(); //調(diào)用初始化函數(shù)
display(); //調(diào)用按鍵掃描和顯示函數(shù)
}
}