Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laba_2_preryvania.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
162.82 Кб
Скачать
  1. Доступ к клавишам клавиатуры

Столбец (кнопки)

Адрес

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)

{

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]