内容包括Mplab IDE与Mplab X IDE的使用,触摸功能实践,PIC单片机C与汇编混合编程等。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!

目录:

一、Mplab IDE的使用

1、Mplab IDE建立工程

1)简述

2)建立工程

3)调试

(1)源程序编译   (2)模拟仿真设置   (3)端口设置   (4)添加变量到Watch

(5)查看ROM、RAM使用情况   (6)查看软仿真时间

2、Mplab IDE硬件仿真

1)简述   2)接入PICkit3出现Target Device ID (00000000) does not match expected Device ID (00002460)

3)首次使用PICkit3出现PK3Err0040   4)接入PICkit3烧录时要设置电源   5)Maplab的输出窗口看不见

二、Mplab X IDE的使用

1、简述

2、接入PICkit3提示找不到工具,为驱动没有安装

3、microchip官网下载XC8编译器

三、实践(PIC单片机-PICC介绍)

1、端口控制

2、实现触摸功能

3、使用PIC公司的触摸库

4、触摸IC芯片

四、C与汇编混合编程

五、电源管脚分布

1、电源管脚分布

----------------------------------------------------------------------------------------------------------------

一、Mplab IDE的使用

1、Mplab IDE建立工程

1)简述

当前Maplab IDE与Hi-Tech均安装在D盘,软件搜索我的百度网盘

------------------------------

2)建立工程

通过工程向导是最为简洁的方法,如下图所示。

下面按提示做就行了。

------------------------------

3)调试

(1)源程序编译

----------------

(2)模拟仿真设置

注:软仿真前可设置断点

Debuggen/Setting…下面

接上图4处单步执行程序,状态如下。

----------------

(3)端口设置

Debugger-Stimulus,选择Asynch,增加PIN。比如PB0、PB1,在Action选择Hign或Low,务必点3处Fire才能生效。

----------------

(4)添加变量到Watch

通过端口的变化查看相关变量,变量必须要在程序中使用,才能添加到Watch。

查看位变量的状态:

Watch中的内容不能实时更新:

----------------

(5)查看ROM、RAM使用情况

View/Memory Usage Gauge

PIC单片机RAM的位定义:

通过其头文件,仿写。

u8   x  @  0x1C;

bit  JieJinFlag    @ ((unsigned)&x*8)+0;

bit  UnProFlag  @ ((unsigned)&x*8)+1;

bit  current       @ ((unsigned)&x*8)+2;

//bit JieJinFlag=0;

//bit UnProFlag;

----------------

(6)查看软仿真时间

Debuggen/Stopwatch

-----------------------------------------------------------

2、Mplab IDE硬件仿真

1)简述

看到PIC单片机就感到亲切,今天开始对PIC16F1936编程仿真,仿真器PICKIT3。

------------------------------

2)接入PICkit3出现Target Device ID (00000000) does not match expected Device ID (00002460)

这是仿真头与线路板连接不正确。

------------------------------

3)首次使用PICkit3出现PK3Err0040

PK3Err0040: The target device is not ready for debugging.Please check your configuration bit settings and program the device before proceeding.
解决办法:在这里勾 选:Debugger>Settings>Program Memory>Automatically 的 “Program after successful build”项即可在每次成功后自动下载代码到Flash并进入调试就绪模式。

------------------------------

4)接入PICkit3烧录时要设置电源

PK3Err0045: You must connect to a target device to use PICkit3.

Programmer>Settings>Power中设置

------------------------------

5)Maplab的输出窗口看不见

(1)在设置这个功能的时候,准备把output窗口移到下边缘,没想到移动过头,移动到电脑桌面的最下方(移到下方看不到的位置去了),然后output窗口就不见了,调不出来,在view里面勾选了output或者取消,编译文件,甚至重新启动电脑,output窗口都不出现了!

右击任务栏->解除锁定任务栏->拖动任务栏到右边就可以看到被隐藏的窗口了。

----------------

(2)隐藏在整个窗口的下方

右侧是有进度条的。

将output移上去,右侧就没有进度条了。

----------------------------------------------------------------------------------------------------------------

二、Mplab X IDE的使用

1、简述

www.microchip.com,找到“Tools and SoftWare”,如下图所示。

Microchihp工程师社区:http://microchip.com.cn/newcommunity/。

图1 驱动切换与安装

图2 批量烧录

-----------------------------------------------------------

2、接入PICkit3提示找不到工具,为驱动没有安装

打开如图1 MPLAB drive,如下图设置,点"Apply Changes"即可。

-----------------------------------------------------------

3、microchip官网下载XC8编译器

----------------------------------------------------------------------------------------------------------------

三、实践(PIC单片机-PICC介绍)

1、端口控制

完成三件事:1、仿真部分全部正常;2、配置字设置无误;3、内部晶振正常,端口操作正常

#include "pic.h"

void delay_long(unsigned int uiDelayLong);

void main()

{

OSCCON = 0xeb;   //禁止4X PLL,内部4MHz时钟源

TRISBbits.TRISB3 = 0;  //设置RB5端口为输出

TRISCbits.TRISC4 = 0;

ANSELBbits.ANSB3 = 0;  //RB5设置为数字端口

LATBbits.LATB3 = 0;    //RB3输出低电平

LATCbits.LATC4 = 0;

WPUBbits.WPUB5 = 1;

while (1)

{

LATBbits.LATB3 = 1;

LATCbits.LATC4 = 0;

delay_long(100);

LATBbits.LATB3 = 0;

LATCbits.LATC4 = 1;

delay_long(100);

}

}

void delay_long(unsigned int uiDelayLong)
{
   unsigned int i;
   unsigned int j;

for(i=0;i<</font>uiDelayLong;i++)  //
   {
      for(j=0;j<500;j++)  //内嵌循环的空指令数量
      {
          ;
      }
   }
}

/

-----------------------------------------------------------

2、实现触摸功能

#include "pic.h"

__CONFIG(0x09E4);
__CONFIG(0x0033);

#define BackLight LATCbits.LATC4
#define Light1 LATAbits.LATA7
#define Light2 LATBbits.LATB3
#define Light3 LATAbits.LATA4
#define Light4 LATBbits.LATB4
#define L2_C   LATCbits.LATC0
#define L1_C   LATCbits.LATC1
#define C_R    LATCbits.LATC2
#define C_L    LATCbits.LATC3
#define Cap_H_L LATAbits.LATA6
#define const_key_time2 8

#define const_timr0_value 100
#define trip_value 150   //(未触摸值-触摸值)*80%
#define Cap_Avg_value 1500

void key_service(void);
void delay_long(unsigned int uiDelayLong);
static void interrupt SystemISR(void);
void System_Init(void);
void Cap_Init(void);
void SetNextSensor(void);
void RestartTimers(void);
void Cap_ISR(void);

unsigned char Index = 1;  // 触摸键通道计数
unsigned char AvgIndex = 0;  //更新频率计数
unsigned int Cap_Value = 0;  //当前按键频率值
const unsigned int trip[4]={trip_value,trip_value,trip_value,trip_value}; //频率差值
unsigned int Cap_Avg[4]={Cap_Avg_value,Cap_Avg_value,Cap_Avg_value,Cap_Avg_value}; //频率平均值

unsigned int uiKeyTimeCnt1=0;
unsigned int uiKeyTimeCnt2=0;
unsigned int uiKeyTimeCnt3=0;
unsigned int uiKeyTimeCnt4=0;

unsigned char ucKeyLock1=0;
unsigned char ucKeyLock2=0;
unsigned char ucKeyLock3=0;
unsigned char ucKeyLock4=0;

unsigned char ucKey1TouchCnt=0;
unsigned char ucKey2TouchCnt=0;
unsigned char ucKey3TouchCnt=0;
unsigned char ucKey4TouchCnt=0;

unsigned char ucKeySec=0;

void main()
{
 System_Init();
 delay_long(10);
 Cap_Init();
 GIE = 1;
 while (1)
    {
  key_service();
    }
}

void key_service(void)
{
 switch(ucKeySec)
 {
  case 1:
  {

}
  break;
  case 2:
  {
   if(ucKey2TouchCnt == 1)
   {
    Light2 = 0;
    C_L = 1;
   }else
    {
     Light2 = 1;
     C_L = 0;
     ucKey2TouchCnt = 0;
    }
  }
  break;
  case 3:
  {

}
  break;
  case 4:
  {

}
  break;
  default:
  break;
 }
}

void delay_long(unsigned int uiDelayLong)
{
   unsigned int i,j;
   for(i=0;i<</font>uiDelayLong;i++)  //
   {
      for(j=0;j<500;j++)
      {
     asm("nop");
      }
   }
}

void System_Init(void)
{
 OSCCON = 0b01101000;            //内部4M晶振
 OSCTUNE= 0b00000000;            //晶振校准

TRISCbits.TRISC0 = 0;
 TRISCbits.TRISC1 = 0;
 TRISCbits.TRISC2 = 0;
 TRISCbits.TRISC3 = 0;
 L2_C = 0;
 L1_C = 0;
 C_R = 0;
 C_L = 0;

TRISAbits.TRISA6 = 0;
 LATAbits.LATA6 = 0;

TRISCbits.TRISC4 = 0;  //BackLight输出
 TRISAbits.TRISA7 = 0;  //Light1输出
 TRISBbits.TRISB3 = 0;  //Light2输出
 TRISAbits.TRISA4 = 0;  //Light3输出
 TRISBbits.TRISB4 = 0;  //Light4输出

TRISBbits.TRISB1 = 1;  //RB1触摸按键输入
 ANSELBbits.ANSB1 = 1;  //RB1设置为模拟端口

WPUB = 0x00; //PORTB口无上拉
 IOCBP = 0x00; //关PORTB口电平变化中断
 IOCBN = 0x00;

BackLight = 0; //背景灯打开
 Light1 = 1;  //其它灯关闭
 Light2 = 1;
 Light3 = 1;
 Light4 = 1;
}

void Cap_Init(void)
{
 CPSCON0 = 0b10001100; //打开电容模块,高频率振荡
 CPSCON1 = 0b00000001; //设置扫描通道0-3

OPTION_REG = 0b11010011; //TMR0 分频器1:16
 TMR0IF = 0;
 TMR0IE = 1;
 
 T1CON = 0b11000101; //计数,时钟来源电容模块1:1分频
 T1GCON = 0b00000000; //与门控位无关
 TMR1GIF = 0;
 TMR1GIE = 0;
 TMR1H = 0;
 TMR1L = 0;
 TMR0 = const_timr0_value;
}

void SetNextSensor(void)
{
 if(Index == 3)
 {
  Index = 0; //Key1-Key4
 }
 else
 {
  Index++;
 }
 CPSCON1 = Index;
}

void RestartTimers(void)
{
 TMR1ON = 0;
 TMR1H = 0;
 TMR1L = 0;
 TMR1ON = 1;
}

void Cap_ISR(void)   //触摸按键扫描
{
 if (Cap_Value < (Cap_Avg[Index] - trip[Index])) //有键按下,不更新频率平均值
 {
  
  switch(Index)
  {
   case 0: //KEY1 ON
   {
    
   }
   break;
   
   case 1: //KEY2 ON
   {
    if(ucKeyLock2==0)
    {
     uiKeyTimeCnt2++; //累加定时中断次数
        if(uiKeyTimeCnt2>const_key_time2)
        {
            uiKeyTimeCnt2 = 0;
            ucKeyLock2 = 1;  //自锁按键置位,避免一直触发
            ucKeySec = 2;    //触发2号键
      ucKey2TouchCnt++;
        }
    }
   }
   break;

case 2: //KEY3 ON
   {
    
   }
   break;

case 3: //KEY4 ON
   {
    
   }
   break;

default:
   break;
  }
 }
 else if (Cap_Value > (Cap_Avg[Index] - trip[Index] +64)) //无键按下,慢更新频率平均值64
 {
  switch(Index)
  {
   case 0: //KEY1 OFF
   {

}
   break;
   
   case 1: //KEY2 OFF
   {
    ucKeyLock2=0; //按键自锁标志清零
    uiKeyTimeCnt2=0;//按键去抖动延时计数器清零
   }
   break;

case 2: //KEY3 OFF
   {

}
   break;

case 3: //KEY4 OFF
   {

}
   break;

default:
   break;
  }
 
  if (AvgIndex < 4)
  {
   AvgIndex ++;   //更新频率
  }
  else
  {
   AvgIndex = 0;
  }

if (AvgIndex == 4)
  {
   if(Cap_Value >= Cap_Avg[Index])
   {
    Cap_Avg[Index] = Cap_Avg[Index]+(Cap_Value - Cap_Avg[Index])/16;
   }
   else
   {
    Cap_Avg[Index] = Cap_Avg[Index]-(Cap_Avg[Index] - Cap_Value)/16;
   }
  }
 }
}

static void interrupt SystemISR(void)      //Timer0中断2.5ms
{
 if(TMR0IE && TMR0IF)
 {
  TMR0IF = 0;
  TMR0 = const_timr0_value;
  TMR1ON = 0;  //停止触摸按键振荡频率计数
  
  Cap_Value = (unsigned int)(TMR1H <<8) + TMR1L; //读取振荡频率
  Cap_ISR();
  //SetNextSensor();  //设置通道
  RestartTimers();  //重启TMR1
 }

if (TMR0IE && TMR0IF)
 {
  TMR0IF = 0;
  RestartTimers();
 }
}

-----------------------------------------------------------

3、 使用PIC公司触摸库

采用PIC公司提供的库,到Microchip Libraries for Applications (MLA) | Microchip Technology下载,另外要注意MPLAB_IDE_8_76版本IDE,C编译器用picc-9_81-win.exe。

这就是PIC公司的触摸库,装好后得到的是一系列触摸MCU的demo,找到我们要的库(含有PIC16F1827),然后把它拷贝出来,进行配置和改造。Configure-->Select Device选择PIC16F1827,整个程序默认的速度是片内晶振16M,可搜索我的百度云盘“PIC16F1937_8 button”。

配置generic_processorConfigBits.h,实现对用内部晶振等等。

还需要修改的地方:mTouch_config.h中修改两个地方:

这个是修改通道。

修改触摸灵敏度,值越小灵敏度越大。

在主函数main.c中读出触摸值,这里的CAP_DATA值大概是1或2。 使用PIC公司的触摸库做触摸处理,得到的效果非常好。

---------------------------------------------------

4、触摸IC芯片

----------------------------------------------------------------------------------------------------------------

四、C与汇编混合编程

#include "pic.h"
unsigned char add_function(unsigned char augend,unsigned char addend);
volatile unsigned char tmp; //定义位于bank0 的字符型全局变量

void main(void)
{
    unsigned char temp1,temp2,temp3;
    temp3=add_function(2,3);
    asm("clrwdt"); //清看门狗

OSCCON = 0xEB; //禁止4X PLL,内部4MHz时钟源
    TRISBbits.TRISB3 = 0; //设置RB5端口为输出
    TRISCbits.TRISC4 = 0;
    ANSELBbits.ANSB3 = 0; //RB5设置为数字端口
    LATBbits.LATB3 = 0; //RB3输出低电平
    LATCbits.LATC4 = 0;
    WPUBbits.WPUB5 = 1;

_asm
    CLRF _STATUS //选择bank0
    MOVLW 0x10   //设定初值
    MOVWF _tmp   //tmp=0x10
 _endasm

if (tmp==0x10)
 {
    _nop();
 }
}

unsigned char add_function(unsigned char augend,unsigned char addend)
{
  return(augend+addend);
}

----------------------------------------------------------------------------------------------------------------

五、电源管脚分布与在线下载口

1、电源管脚分布

VDD PIN1,其对面的脚位GND。

-----------------------------------------------------------

2、在线下载口

----------------------------------------------------------------------------------------------------------------

PIC单片机-Mplab的使用与实践相关推荐

  1. 使用MPLAB X 对PIC单片机进行配置

    最近有与项目需要,要使用PIC单片机进行开发(之前从来没有使用过).遇到了许多不明白的问题,再此总结一下遇到的问题和相应的解决办法,希望有大神指导,也希望能帮到像我一样的朋友. 一.初入PIC单片机 ...

  2. PIC单片机应用开发实践教程(六): 代码配置器(MCC)

    源码基于  PIC16F15355开发板,想了解详情,请点 PIC16F15355开发板  1.简介 MPLAB 代码配置器(MPLAB Code Configurator,MCC)通过图形用户界面( ...

  3. PIC单片机入门教程(二)—— 安装集成开发环境(MPLAB X IDE)

    PIC单片机入门教程(二)-- 安装集成开发环境(MPLAB X IDE) 教程中使用的电脑运行Windows 10 专业版 64位系统 1.下载 MPLAB X IDE v4.05 历史版本:htt ...

  4. 《我和PIC单片机:基于PIC18》——第2章 PIC的开发环境 2.1 PIC开发的硬件资源...

    第2章 PIC的开发环境 前面我们学习了PIC的内部资源配置和I/O口的基本结构,这一章我们重点要实现对I/O口的控制.单片机是软硬件结合的统一体,因此本章先介绍如何用简单的材料搭建起供学习使用的最小 ...

  5. PIC单片机网址推荐

    1. EG3 关于嵌入式开发的站点,提供非常多关于嵌入式开发的资料.包括开发公司,技术文档,免费资源等等.版面包括busses & boards,embedded software,dsp,e ...

  6. pic单片机内部时钟校准c语言,实例讲解PIC单片机的时钟设置

    什么时钟? 首先我们先讲讲什么是时钟.时钟就是单片机的心脏.每跳动一下.整个单片机的各个电路就同步的动作一下.就好像我们做广播体操的时候 广播上喊的节拍1234 2234 3234....然后我们全部 ...

  7. 单片机汇编编程300例_pic单片机编程串烧,pic单片机汇编语言讲解下篇

    看到这篇文章的朋友,想必大家对pic单片机均具备一定兴趣,或对pic单片机具备一定使用需求.前文中,小编曾对pic单片机汇编语言进行过部分讲解.本文中,将对pic单片机的清零等指令加以讲解,以帮助大家 ...

  8. pic1路AD转换c语言,pic单片机的ad转换(实例解析)

    描述 AD转换就是模数转换.顾名思义,就是把模拟信号转换成数字信号.主要包括积分型.逐次逼近型.并行比较型/串并行型.Σ-Δ调制型.电容阵列逐次比较型及压频变换型.A/D转换器是用来通过一定的电路将模 ...

  9. PIC单片机开发工具

    MPLAB简介 MPLAB 集成开发环境(IDE)是一个综合的编辑器.项目管理器和设计平台, 提供以下功能:使用内置的编辑器创建和编辑源代码. 汇编.编译和链接源代码, 通过使用内置的软件模拟器观察程 ...

  10. pic c语言 位标志,PIC单片机状态寄存器中的C(进位/借位位标志)

    查阅PIC单片机芯片手册,关于进位/借位位的说明为: C:进位/借位位. 1 = 结果的最高位发生了进位 0 = 结果的最高位未发生进位 同时有一条标注:借位的极性是相反的. 通过以上说明,可以将C的 ...

最新文章

  1. MySQL之备份恢复
  2. mysql5.7 存储二进制_mysql5.7二进制部署
  3. python_L2_operator
  4. springmvc使用requestmapping无法访问控制类_研究人员称人类使用的新烟碱类杀虫剂让蜜蜂无法入睡...
  5. Codility:Titanium 2016 challenge:BracketsRotation
  6. Decorator(装饰器)
  7. 电脑连接示波器读取数据
  8. 解决IDEA创建多模块项目找不到创建class类的问题
  9. GeoTools——JTS空间操作
  10. Windows应用商店下载安装Ubuntu
  11. linux下淘宝支付宝安全控件安装
  12. 296.deepin下载安装、root改密、cpu不降频、修改快捷键、创建启动器快捷方式、win文件访问、直接进win无deepin启动项...
  13. msf-Msfvenonm生成后门木马
  14. 八皇后问题 (25分)
  15. 软件测试中单元测试,集成测试,系统测试,验收测试的区别
  16. 女神告诉你什么是互联网思维
  17. 4、Mac下的谷歌浏览器输入不安全网址点高级后没有继续前往链接解决办法
  18. 127.0.0.1 zxt.php_shmilyzxt/
  19. 【IOT】Thingsboard学习笔记(1):开源IOT平台thingsboard部署-windows平台
  20. 云服务器-异地部署集群服务-Kubernetes(K8S)-网络篇

热门文章

  1. c语言中malloc的作用,malloc函数-malloc函数,详解
  2. 融云即时通讯云助力多家直播平台构建社交升级
  3. 手机输入法,谁能笑到最后?
  4. 使用PYTHON采集船舶MMSI数据
  5. Oracle 锁表查询语句及解锁
  6. 企业微信好友和微信好友的区别
  7. Setycyas的自定义表情油猴插件
  8. 机器视觉培训教程-硬件选型
  9. Python 音频生成器
  10. 智能楼宇一卡通系统QY-LY04A