联系方式
  • 企业QQ:800058492
  • 电话:186 8156 8492(练先生)
  • 邮箱:1046280889@qq.com
  • 办公地址:广东省深圳市福田区商报路2号奥林匹克大厦27楼
  • 下单网址:http://www.sz-jlc.com/k

dsPIC33F系列入门(4)--转自嘉立创社区

用户评价: 0 / 5

减星减星减星减星减星
 

dsPIC33F系列入门(4)--转自嘉立创社区

  第二个程序为独立按键程序,主要通过主程序扫描实现

#include <p33FJ128MC804.h>
//内部振荡器7.3728MHz
//FCY=FOSC/2
//FOSC=FIN*(M/(N1*N2))
//FIN=7.3728M,M=32,N1=4,N2=8
//FOSC=7.3728M,FCY=3.68M
_FOSCSEL(FNOSC_FRCPLL & IESO_OFF)
_FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_NONE)

typedef unsigned int  uint;//长度为0-65535
typedef unsigned char uchar;//长度为0-255
typedef unsigned long ulong;

#define ui_key_jitter_time1 20//按键1消抖延时
#define key_input0 PORTBbits.RB7
#define led0 PORTCbits.RC6
#define led1 PORTCbits.RC7 

//后缀带step,表示该变量属于switch循环  
//后缀带cnt,表示该变量为计数量
//key_scan()函数按键扫描函数
uchar uc_key_trigger_number=0;//触发按键编号
//按键1相关变量定义
uint ui_key_jitter_cnt1=0;//按键1消抖时长
uchar uc_key_lock_flag1=0;//按键1触发自锁标志

void initial_mcu_memory();//主存初始化
void initial_peripheral();//常规外设初始化
void key_scan();//按键扫描函数
void key_action();//按键动作函数
void delay_short(uint ui_delay_short);//短延时
void delay_long(uint ui_delay_long);//长延时

int main()
{
initial_mcu_memory();//主存初始化
delay_long(10);//延时,等待常规外设供电稳定
initial_peripheral();//常规外设初始化

while(1)
{

key_scan();//按键扫描函数
key_action();//按键动作函数
}
}

void initial_mcu_memory()//主存初始化
{
OSCCONbits.COSC=1;//带PLL的快速RC振荡器
OSCCONbits.LPOSCEN=0;//禁止辅助振荡器

CLKDIVbits.PLLPRE=2;//N1=4,PLL相位检测器输入分频比
CLKDIVbits.PLLPOST=3;//N2=8,PLL后分频比
CLKDIVbits.FRCDIV=0;//内部快速RC振荡器后分频比,1分频
CLKDIVbits.DOZE=3;//FCY分频比,8分频

//PLLFBDbits.PLLDIV=8;//M=8,PLL倍频比,8倍频
PLLFBDbits.PLLDIV=32;//M=32,PLL倍频比,32倍频
//PLLFBDbits.PLLDIV=64;//M=64,PLL倍频比,64倍频
//PLLFBDbits.PLLDIV=128;//M=128,PLL倍频比,128倍频
//PLLFBDbits.PLLDIV=256;//M=256,PLL倍频比,256倍频
//PLLFBDbits.PLLDIV=512;//M=512,PLL倍频比,512倍频
OSCTUNbits.TUN=0;//FRC振荡器调节位,标称值7.37M

TRISBbits.TRISB7 = 1;//RB7配置输入
CNPU2bits.CN23PUE = 1;//RB7使能弱上拉

TRISCbits.TRISC6=0;//RC6配置输出
    TRISCbits.TRISC7=0;//RC7配置输出
}

void initial_peripheral()//常规外设初始化,暂时无
{
;
}

void key_scan()//按键扫描函数
{  
if(key_input0==1)//IO高电平,按键未按下,及时清零标志位
{
uc_key_lock_flag1=0;//按键自锁标志清零
ui_key_jitter_cnt1=0;//按键消抖计数器清零    
}
else if(uc_key_lock_flag1==0)//按键按下,且第一次被按下
{
ui_key_jitter_cnt1++;//按键消抖延时计数器累加
if(ui_key_jitter_cnt1>ui_key_jitter_time1)
{
ui_key_jitter_cnt1=0; 
uc_key_lock_flag1=1;//自锁按键置位,避免一直触发
uc_key_trigger_number=1;//触发1号键
}
}
}

void key_action()////按键动作函数
{
switch(uc_key_trigger_number)//按键触发切换
{
case 1://1号键,S0
{
led0=~led0;
        led1=~led1;
uc_key_trigger_number=0;//按键触发编号清零,避免一直触发
}
break;                    
}                
}

void delay_short(uint ui_delay_short)
{
uint i;
for(i=0;i<ui_delay_short;i++)
{
;
}
}

void delay_long(uint ui_delay_long)//长延时
{
uint i;
uint j;
for(i=0;i<ui_delay_long;i++)
{
for(j=0;j<500;j++)
{
;
}
}
}

点击返回嘉立创网站!  www.sz-jlc.tv