技术热线: 4007-888-234

QLdsPIC3]按键[C30+dsPIC30F6014A]

更新时间: 2019-03-23
阅读量:2847

   深圳市英锐恩科技有限公司:台湾麦肯单片机(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();                 //调用按键扫描和显示函数
    }
}