|
| |||||||
|
Опубликовано 2010-02-27 09:55:03 автором MRS Підключення до мікроконтролера семисегментний індикатораУ попередньому уроці ми навчилися блимати світлодіод. Цей урок не набагато складніше, тут ми навчимося блимати 7 світлодіодами. Але не просто сім світлодіодів, а семисегментний індикатор .Семисегментные індикатори - це світлодіоди, розміщені в певному порядку, так що запалюючи одночасно декілька світлодіодів, можна формувати на індикаторі символи і цифри. Індикатори бувають з загальним катодом (мінусом) з загальним анодом (плюсом). Це означає, що всі сім світлодіодів з'єднані плюсом або мінусом. Наприклад, візьмемо індикатор з загальним катодом і спробуємо на нього що-небудь вивести, наприклад цифру 1. Для цього нам потрібно включити світлодіоди B і С. Беремо наш atmega8 та підключаємо до семисегментнику за схемою
#include <mega8.h>
void main(void)
{
PORTB=0x00;
DDRB=0b00000001; //робимо ніжку PB0 виходом
PORTD=0b00000110; // виводимо на ніжки PB1, PB2 лог одиницю, щоб запалити цифру 1
DDRD=0b01111111; //Робимо ніжки PB0-PB6 виходами
while (1) {}
} Дивимося на результат і радіємо! А як на рахунок того, щоб вивести будь-яку цифру від 0 до 9? Для цього нам доведеться трошки ускладнити нашу програму. Напишемо процедуру out для виведення цифр від 0 до 9.
#include <mega8.h>
#include <delay.h>
unsigned char numder[]= //визначаємо масив, у якому індекс буде відповідати виведеної цифрі
{
0b00111111, //цифра 0
0b00000110, //цифра 1
0b01011011, //цифра 2
0b01001111, //цифра 3
0b01100110, //цифра 4
0b01101101, //цифра 5
0b01111101, //цифра 6
0b00000111, //цифра 7
0b01111111, //цифра 8
0b01101111, //цифра 9
};
void out(unsigned char num)
{
PORTD=numder[num];
}
void main(void)
{ unsigned char i=0;
PORTB=0x00;
DDRB=0b00000001; //робимо ніжку PB0 виходом
PORTD=0b0000000;
DDRD=0b01111111; //Робимо ніжки PB0-PB6 виходами
while (1)
{
out(i++);
delay_ms(1000);//затримка в 1 секунду
}
} Результат
#include <mega8.h>
#include <delay.h>
unsigned char numder[]= //визначаємо масив, в якому індексом будуть відповідати біті на порту D
{
0b00111111, //цифра 0
0b00000110, //цифра 1
0b01011011, //цифра 2
0b01001111, //цифра 3
0b01100110, //цифра 4
0b01101101, //цифра 5
0b01111101, //цифра 6
0b00000111, //цифра 7
0b01111111, //цифра 8
0b01101111, //цифра 9
};
void out(unsigned char num)
{
PORTD=numder[num];
}
void main(void)
{ unsigned char z=0;
PORTB=0x00;
DDRB=0b00000011; //робимо ніжку PB0 і PB1 виходом
PORTD=0b0000000;
DDRD=0b01111111; //Робимо ніжки PB0-PB6 виходами
while (1)
{
if (z==0) //якщо z=0, то виводимо першу цифру
{
out(1); //виводимо 1
PORTB=0b00000001; // включаємо семисегментник, який висить катодом на ніжці PB0
}
if (z==1) //якщо z=1 виводимо другу цифру
{
out(7); // виводимо цифру 7
PORTB=0b00000010; // Включаємо семисегментник на ніжці PB1
}
if (++z>1) z=0; // збільшуємо z на одиницю і перевіряємо, не більше 1. Якщо більше, то z записуємо 0
delay_ms(40); //Робимо затримку в 40 мілісекунд, це 25 висновків за секунду
}
} Давайте все це приаккуратим:
#include <mega8.h>
#include <delay.h>
unsigned char chislo[2]; //визначаємо масив з двох елементів типу char беззнаковий(unsigned)
unsigned char numder[]= //визначаємо масив, в якому індексом будуть відповідати біті на порту D
{
0b00111111, //цифра 0
0b00000110, //цифра 1
0b01011011, //цифра 2
0b01001111, //цифра 3
0b01100110, //цифра 4
0b01101101, //цифра 5
0b01111101, //цифра 6
0b00000111, //цифра 7
0b01111111, //цифра 8
0b01101111, //цифра 9
};
unsigned char i=0; // змінна для визначення, на який розряд семисегментника виводити число
// переривання по переповнюванню timer0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTD=numder[ chislo[i] ];
PORTB=i+1; //включаємо певний розряд семисегментника
if (++i>1) i=0;
}
void out(unsigned char num)
{
/*спочатку нам потрібно визначити, скільки десятків і одиниць складається виведене число.
Наприклад, ми передали "45", нам треба його розкласти на 4 і 5, щоб на перший розряд семисегментника
вивести цифру 4, а на другий - 5 */
chislo[0]=num%10; //оператор % дає залишок від цілочисельного ділення, наприклад 34%10 4
chislo[1]=num/10; // дізнаємося, скільки десятків в числі
}
void main(void)
{
unsigned char z=0; // змінна, яка буде виводитися на дисплей
PORTB=0x00;
DDRB=0b00000011; //робимо ніжку PB0 і PB1 виходом
PORTD=0b0000000;
DDRD=0b01111111; //Робимо ніжки PB0-PB6 виходами
TCCR0=0x03; //встановлюємо переддільник таймера
TCNT0=0x64; // число, з якого таймер починає рахувати до 255
TIMSK=0x01; // переривання по переповненню таймера 0
#asm("sei") //дозволяємо переривання
while (1)
{
out(z++); // виводимо значення змінної z і збільшуємо її на 1
delay_ms(1000); //Робимо затримку в 40 мілісекунд, це 25 висновків за секунду
}
} У наступній статті я розповім, як до мікроконтролера підключити lcd дисплей. Комментарии - (4)
Добавить комментарийДля отправки комментария вы должны авторизоваться. |
|||||||