Содержание
Интернет-магазин
Применяемое оборудование:
Данные уроки – переработка ассемблерных уроков, предоставляемых компанией Microchip вместе с комплектом pickit2.
Уроки адаптированы под 3 типа демо-плат из разных комплектов поставки pickit2 для контроллеров PIC16F690, PIC16F876, PIC16F887.
Создание проекта практически ничем не отличается от создания проекта на ассемблере (см. п.4.5.3 - Создание нового проекта в MPLAB IDE), единственное, что в качестве инструмента нужно выбрать не Microchip MPASM Toolsuite, а HI TECH Toolsuite.
// *******************************************************************
// PICkit 2 Lesson 1 - "Hello World"
//
// This turns on LED 0 on the Demo Board.
//
// *******************************************************************
// * See Demo Board User's Guide for Lesson Information *
// *******************************************************************
#include <htc.h> // включаем заголовочный файл описания
//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if defined(_16F887)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED0 TRISD0
#define LED0 RD0
#elif (_16F886)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED0 TRISB0
#define LED0 RB0
#elif defined(_16F690)
__CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
#define TRIS_LED0 TRISC0
#define LED0 RC0
#endif
//*******************************************************************
void main(void) {
TRIS_LED0 = 0; // ; настраиваем вывод порта как выход
LED0 = 1; // ; зажигаем светодиод LED0
while(1); // ; бесконечный цикл
}
Для того чтобы выбрать для работы ту или иную демо-плату, нужно лишь выбрать в MPLAB IDE применяемый микроконтроллер PIC16F690, PIC16F876 или PIC16F887.
// *******************************************************************
// PICkit 2 Lesson 2 - "Blink"
//
// Первый урок показывал как зажечь светодиод LED,
// Сейчас мы посмотрим как заставить его мигать. Для этого необходимы циклы задержки
// для включения и выключения светодиода с частотой, заметной глазу.
//
// *******************************************************************
// * See Demo Board User's Guide for Lesson Information *
// *******************************************************************
#include <htc.h> // включаем заголовочный файл описания
//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if defined(_16F887)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED0 TRISD0
#define LED0 RD0
#elif (_16F886)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED0 TRISB0
#define LED0 RB0
#elif defined(_16F690)
__CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
#define TRIS_LED0 TRISC0
#define LED0 RC0
#endif
//*******************************************************************
unsigned char Delay1, Delay2 ; //Определение переменных для циклов задержки
void main(void) {
TRIS_LED0 = 0;
while(1) {
LED0=1; // Зажигаем светодиод
for(Delay2=0xFF; Delay2 != 0; Delay2--) {
for(Delay1=0xFF; Delay1 != 0; Delay1--);
}
LED0=0; // Гасим светодиод
for(Delay2=0xFF; Delay2 != 0; Delay2--) {
for(Delay1=0xFF; Delay1 != 0; Delay1--);
}
}
}
// *******************************************************************
// PICkit 2 Lesson 3 - "Rotate"
//
// Расширение урока 2 - последовательное зажигание светодиодов.
//
//
// *******************************************************************
// * See Demo Board User's Guide for Lesson Information *
// *******************************************************************
#include <htc.h> // включаем заголовочный файл описания
//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if defined(_16F887)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED TRISD
#define LED PORTD
#define DISPLAY 0x80
#elif (_16F886)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED TRISB
#define LED PORTB
#define DISPLAY 0x08
#elif defined(_16F690)
__CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
#define TRIS_LED TRISC
#define LED PORTC
#define DISPLAY 0x08
#endif
//*******************************************************************
unsigned char Delay1, Delay2, Display; //Определение переменных для циклов задержки и индикации
void main(void) {
TRIS_LED = 0;
Display = DISPLAY;
while(1) {
LED = Display; // Зажигаем светодиод
for(Delay2=0xFF; Delay2 != 0; Delay2--) { // Вложенный цикл задержки
for(Delay1=0xFF; Delay1 != 0; Delay1--);
}
Display = Display >> 1; // Сдвигаем светодиод
if (Display == 0) // Если досдвигались что Display = 0
Display = DISPLAY; // инициализируем в начальное состояние
}
}
// *******************************************************************
// PICkit 2 Lesson 4 - "АЦП"
//
// Этот урок показывает как считать значение с АЦП и показать
// значения старших разрядов на светодиодах.
// АЦП измеряет напряжение на потенциометре, подключенному к
// выводу A0.
//
// *******************************************************************
// * See Demo Board User's Guide for Lesson Information *
// *******************************************************************
#include <htc.h> // включаем заголовочный файл описания
//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if defined(_16F887)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED TRISD
#define LED PORTD
#elif (_16F886)
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
#define TRIS_LED TRISB
#define LED PORTB
#elif defined(_16F690)
__CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
#define TRIS_LED TRISC
#define LED PORTC
#endif
//*******************************************************************
void main(void) {
TRISA = 0xFF; // Делаем у PortA все входы
TRIS_LED = 0;
#if defined(_16F690)
ADCON0 = 0x01;
ADCON1 = 0x30; // Левое выравнивание, опорное напряжение для АЦП Vdd-Vss
#else
ADCON0 = 0x41; // configure A2D for Fosc/8, Channel 0 (RA0), and turn on the A2D module
ADCON1 = 0; // Левое выравнивание, опорное напряжение для АЦП Vdd-Vss
#endif
while(1) {
NOP();
NOP();
NOP();
NOP();
NOP();
GODONE = 1;
while(GODONE);
LED = ADRESH; // Зажигаем светодиоды в соответствии с положением потенциометра
}
}
Обсуждение
Здравствуйте. Я в этом деле ещё чайник, объясните,пожалуйста, как отследить нажатие кнопки?
Дмитрий, очень просто. Вешаем кнопку на цифровой порт, который назначен на вход, второй конец на VDD. И смотрим, что у нас на цифровом порту 1 или 0.