深圳市英锐恩科技有限公司:台湾麦肯单片机(Micon MDT单片机)亚太地区A级代理商
QLdsPIC3]按键[C30+dsPIC30F6014A]
//实验目的:熟悉按键的扫描方法
//软件思路:
// 1、PORTD口低8位的LED做显示
// 2、按键K1...K4-K5...K8对应LED1...LED4-LED5...LED8
// 3、若K1按下则LED1点亮;若K8按下则LED8点亮
//硬件规划:
// 1、拨码开关S1,S2全置ON,其他拨码开关OFF
// 2、跳线J1跳GND;J2跳UP(J1,J2都在按键模块内)
#include //dsPIC30F6014标准头文件
/*配置位*/
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍频晶振,Failsafe 时钟关闭
_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口初始化函数
void init(void)
{
TRISA= 0X0F000; //RA12-RA15输入,其他位输出
TRISC= 0X001F; //RC1-RC4输入,其他位输出
LATD = 0x0000; //关闭所有LED
TRISD = 0xFF00; //设定LED引脚为输出
}
//按键扫描和显示函数
void display(void)
{
temp1=PORTA; //读去PORTA口的状态
temp1|=0x0FFF; //防止与按键无关位干扰
temp1=~temp1; //结果去反(因为按下去状态为低,点亮LED使应为高)
temp1=temp1>>12; //结果右移12位(即temp1.3=temp1.15,temp1.0=temp1.12)
temp2=PORTC; //读去PORTC口的状态
temp2|=0x0FFE1; //防止与按键无关位干扰
temp2=~temp2; //结果去反(因为按下去状态为低,点亮LED使应为高)
temp2=temp2<<3; //结果左移12位(即temp2.4=temp2.7,temp2.1=temp2.4)
temp1=temp1|temp2; //temp1与temp2组合得到8个按键按下的状态
LATD=temp1; //送LED显示
}
//主函数
int main(void)
{
while(1)
{
init(); //调用初始化函数
display(); //调用按键扫描和显示函数
}
}