Содержание
Интернет-магазин
Применяемое оборудование:
Данные уроки – переработка ассемблерных уроков, предоставляемых компанией 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.