Читаем Микроконтроллеры AVR: от простого к сложному полностью

#asm

.equ __lcd_port=0x15

#endasm

#include

#include

#include

#include <90sB515.h>

// Частота кварцевого резонатора [Гц]

#define F_XTAL 4000000L

// Линии PINDO…3 будут входами строк

#define KEYIN PIND

// Линии PORTD4..7 будут выходами столбцов

#define KEYOUT P0RTD

// Инициализация использованного таймера TIMER0

#define INIT_TIMER0 TCNT0=0x100L-F_XTAL/64L/500L

#define FIRST_COLUMN 0x80

#define LAST_COLUMN 0x10

typedef unsigned char byte;

// Здесь в виде бита сохраняется состояние каждой нажатой клавиши,

// бит 0 будет KEY0, бит 1 KEY1….

unsigned keys;

// Буфер ЖКИ-индикатора

char buf[33];

// Прерывание по таймеру TIMER 0 каждые 2 мс

interrupt [TIM0_OVF] void timer0_int(void)

{

static byte key_pressed_counter=20;

static byte key_released_counter,column=FIRST_COLUMN;

static unsigned row_data,crt_key;

// Перезагрузить таймер TIMERO

INIT_TIMER0;

row_data<<=4;

// Получить группу из 4 клавиш в переменной row_data

row_data|=¯KEYIN&0xf;

column>>=1;

if (column==(LAST_C0LUHN>>1))

   {

   column=FIRST_COLUHN;

   if (row_data==0) goto new_key;

   if (key_released_counter) — key_released_counter;

   else

     {

     if (-key_pressed_counter==9) crt_key=row_data;

     else

        {

        if (row_data!=crt_key)

          {

          new_key:

          key_pressed_counter=10;

          key_released_counter=0;

          goto end_key;

          };

        if (!key_pressed_counter)

          {

          keys=row_data;

          key_released_counter =20;

          };

        };

     };

   end_key:;

   row_data=0;

   };

// Выбрать следующий столбец, входы будут притянуты к 5 В

KEY0UT=¯column;

}

// Проверить, были ли нажаты клавиши

unsigned inkey(void)

{

unsigned k;

if (k=keys) keys=0;

return k;

}

void init_keypad(void)

{

DDRD=0xf0;

INIT_TIHERO;

TCCR0=3;

TIMSK=2;

#asm("sei")

}

main() {

unsigned k;

init_keypad();

lcd_init(16);

lcd_putsf("CVAVR Keypad");

// Читать состояние клавиш и индицировать код клавиши

while (1)

     {

     lcd_gotoxy(0,1);

     if (k=inkey())

        {

        sprintf(buf,“Key code=%Xh“,k);

        lcd_puts(buf);

        }

     else lcd_putsf("NO KEY ");

     delay_ms(500);

  }

}

Работа с алфавитно-цифровым ЖК-индикатором 2x16

Материал взят из демонстрационной версии компилятора CodeVisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.

Использован ЖК-индикатор со встроенным контроллером, подсоединенный к порту PORTC следующим образом:

Текст программы:

// ЖК-индикатор подсоединен к выходам порта P0RTC

// смотри файл lcd.h в директории..\inc

#asm

.equ __lcd_port=0x15;PORTC

#endasm

// Включить в состав программы описания и процедуры для работы с ЖК-индикатором

#include

void main(void)

{

// Инициализировать ЖК-индикатор для работы

// с 2 строками по 16 символов

lcd_init(16);

// Перейти на 2-ю строку ЖК-индикатора

lcd_gotoxy(0,1);

// Отобразить сообщение

lcd_putsf("Hello world'');

// Остановиться (бесконечный цикл)

while (1);

}

Перейти на страницу:

Все книги серии Библиотека инженера

Похожие книги

Электроника для начинающих (2-е издание)
Электроника для начинающих (2-е издание)

В ходе практических экспериментов рассмотрены основы электроники и показано, как проектировать, отлаживать и изготавливать электронные устройства в домашних условиях. Материал излагается последовательно от простого к сложному, начиная с простых опытов с электрическим током и заканчивая созданием сложных устройств с использованием транзисторов и микроконтроллеров. Описаны основные законы электроники, а также принципы функционирования различных электронных компонентов. Показано, как изготовить охранную сигнализацию, елочные огни, электронные украшения, устройство преобразования звука, кодовый замок и др. Приведены пошаговые инструкции и более 500 наглядных рисунков и фотографий. Во втором издании существенно переработан текст книги, в экспериментах используются более доступные электронные компоненты, добавлены новые проекты, в том числе с контроллером Arduino.

Чарльз Платт

Радиоэлектроника / Технические науки
Электроника для начинающих
Электроника для начинающих

В ходе практических экспериментов рассмотрены основы электроники и показано, как проектировать, отлаживать и изготавливать электронные устройства в домашних условиях. Материал излагается последовательно от простого к сложному, начиная с простых опытов с электрическим током и заканчивая созданием сложных устройств с использованием транзисторов и микроконтроллеров. Описаны основные законы электроники, а также принципы функционирования различных электронных компонентов. Показано, как изготовить охранную сигнализацию для защиты от проникновения в дом, елочные огни, электронные украшения для одежды, устройство преобразования звука, кодовый замок, автономную роботизированную тележку и др. Приведены пошаговые инструкции и более 500 наглядных рисунков и фотографий.Для начинающих радиолюбителей

Паоло Аливерти , Чарльз Платт

Радиоэлектроника / Технические науки
Искусство схемотехники. Том 3 (Изд.4-е)
Искусство схемотехники. Том 3 (Изд.4-е)

Широко известная читателю по предыдущим изданиям монография известных американских специалистов посвящена быстро развивающимся областям электроники. В ней приведены наиболее интересные технические решения, а также анализируются ошибки разработчиков аппаратуры: внимание читателя сосредотачивается на тонких аспектах проектирования и применения электронных схем. На русском языке издается в трех томах. Том 3 содержит сведения о микропроцессорах, радиотехнических схемах, методах измерения и обработки сигналов, принципах конструирования аппаратуры и проектирования маломощных устройств, а также обширные приложения. Для специалистов в области электроники, автоматики, вычислительной техники, а также студентов соответствующих специальностей вузов и техникумов.

Пауль Хоровиц , Уинфилд Хилл

Техника / Радиоэлектроника