- •Лабораторная робота №2. Система прерываний. Опрос дискретных датчиков.
- •Теоретические сведения
- •Сигнал контактной пары
- •Система прерываний микроконтроллера AtMega8515
- •Структура прерываний
- •Доступ к клавишам клавиатуры
- •Порядок выполнения лабораторной работы.
- •Контрольные вопросы:
- •Варианты индивидуальных заданий
Доступ к клавишам клавиатуры
Столбец (кнопки) |
Адрес |
1 (SW3,SW6,SW9,SW12) |
9006h |
2 (SW4,SW7,SW10,SW13) |
9005h |
3 (SW5,SW8,SW11,SW14) |
9003h |
Пример программного опроса клавиатуры
#include <interrupt.h>
#include <delay.h>
#include "mega8515.h"
#define kb1 1
#define kb2 2
#define kb3 3
#define kb4 4
#define kb5 5
#define kb6 6
#define kb7 7
#define kb8 8
#define kb9 9
#define kb0 0
#define kbStar 11
#define kbSharp 12
char keyboardSymbols[12] = { kb1, kb4, kb7, kbStar, kb2, kb5, kb8, kb0, kb3, kb6, kb9, kbSharp };
#define NOT_PRESSED 0xff
unsigned char *kbc0 = (unsigned char *)0x9006;
unsigned char *kbc1 = (unsigned char *)0x9005;
unsigned char *kbc2 = (unsigned char *)0x9003;
unsigned char *LED_REG = (unsigned char *)0xA006;
unsigned char *IND_REGL = (unsigned char *)0xA000;
unsigned char *IND_REGH = (unsigned char *)0xB000;
unsigned char *DC_REG = (unsigned char *)0xA004;
int val;
int time=0;
char parseKeyboard()
{
unsigned char keycounter;
unsigned int kbdstate;
kbdstate = (~(*kbc0) & 0b00001111);
kbdstate |= (~(*kbc1) & 0b00001111) << 4;
kbdstate |= (~(*kbc2) & 0b00001111) << 8;
if (kbdstate == 0x00)
return NOT_PRESSED;
for(keycounter = 0; keycounter < 12; keycounter++)
{
if (kbdstate & 1) break;
kbdstate = kbdstate >> 1;
}
return keyboardSymbols[keycounter];
}
void main()
{
MCUCR = 0x85;//C0;
*LED_REG = 0xf0;
*IND_REGL = 0x00;
*DC_REG = 0x03;
while(1)
{
val=parseKeyboard();
*IND_REGH = val;
delay_ms(100);
}
}
Пример опроса нажатий клавиш SW15 и SW 16, работа со статическим индикатором и светодиодной линейкой.
#include <interrupt.h>
#include "mega8515.h"
unsigned char *LED_REG = (unsigned char *)0xA006;
unsigned char *IND_REGL = (unsigned char *)0xA000;
unsigned char *IND_REGH = (unsigned char *)0xB000;
unsigned char *DC_REG = (unsigned char *)0xA004;
char IND_valL=0, IND_valH=0;
char flagL=0, flagH=0;
interrupt [EXT_INT0] void external_interrupt0 (void)
{
if(flagL==0) IND_valL++;
flagL=1;
}
interrupt [EXT_INT1] void external_interrupt1 (void)
{
if(flagH==0) IND_valH++;
flagH=1;
}
interrupt [TIM0_OVF] void timer_overflow0 (void)
{
*IND_REGL=IND_valL;
*IND_REGH=IND_valH;
}
void main()
{
MCUCR = 0x85;//C0;
TIMSK |= (1 << TOIE0);
TCCR0 = 0b00000011;
GICR = 0b11000000;
*LED_REG = 0xf0;
*IND_REGL = 0x00;
*IND_REGH = 0x00;
*DC_REG = 0x05;
sei();
while(1)
{
}
}
Пример работы с динамическим индикатором
#include <interrupt.h>
#include "mega8515.h"
unsigned char *DIN_REG = (unsigned char *)0x8001;
unsigned char *DIN_ADR = (unsigned char *)0x8002;
int i = 0;
unsigned char mas[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};
unsigned char buf[4]={0,0,0,0};
interrupt [TIM0_OVF] void timer_overflow0 (void)
{
i++;
if(i>=4)
{i=0;}
*DIN_ADR = i;
*DIN_REG = buf[i];
}
void main()
{
MCUCR = 0x85;//C0;
TIMSK |= (1 << TOIE0);
TCCR0 = 0b00000011;
buf[0]=mas[1];
buf[1]=mas[2];
buf[2]=mas[3];
buf[3]=mas[0];
sei();
while(1)
{
}
}
Пример работы со знакосинтезирующим индикатором
#include <interrupt.h>
#include "mega8515.h"
unsigned char *ZSI_REG = (unsigned char *)0x8000;
unsigned char *ZSI_ADR = (unsigned char *)0x8002;
int i = 0;
int timer = 4;
unsigned char buf[7]={0x1F,0x08,0x04,0x02,0x01,0x11,0x0E};
interrupt [TIM0_OVF] void timer_overflow0 (void)
{ timer--;
if(timer==0)
{
i++;
if(i>=7)
{i=0;}
*ZSI_ADR = 0x7F-(1<<i);
*ZSI_REG = buf[i];
timer=4;
}
}
void main()
{
MCUCR = 0x85;//C0;
TIMSK |= (1 << TOIE0);
TCCR0 = 0b00000011;
sei();
while(1)
{
}
}
