Created
November 2, 2016 08:38
-
-
Save aminbenarieb/31da4d5e80f8e2c1c6a21e1fb4ad5c01 to your computer and use it in GitHub Desktop.
lab5(4)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LPC23xx.H> | |
#include <string.h> | |
#include <stdlib.H> | |
int interrupts_count = -2; | |
int i = 0; | |
static unsigned const kStrSize = 15; | |
char star_group = 'u'; | |
static char const circle = 'c'; | |
static char const square = 's'; | |
static char const triangle = 't'; | |
static char circle_stars[kStrSize][kStrSize] = { | |
" **** \n", | |
"* * \n", | |
"* * \n", | |
" **** \n" | |
}; | |
static char square_stars[kStrSize][kStrSize] = { | |
"******** \n", | |
"* * \n", | |
"* * \n", | |
"******** \n" | |
}; | |
static char trinagle_stars[kStrSize][kStrSize] = { | |
" * \n", | |
" * * \n", | |
" * * \n", | |
"******* \n" | |
}; | |
// --- I/O rountine -------------------- | |
void wait_transmitter() { | |
while (!(U0LSR & 0x20)); | |
} | |
void print(char * s, int cnt) { | |
int i; | |
for(i=0; i < cnt; i++) { | |
wait_transmitter(); | |
U0RBR = s[i]; | |
} | |
} | |
void scan(char * s, int cnt) { | |
int i = 0; | |
char c; | |
while (U0LSR & 0x01) { | |
//Прочитать байт и сбросить прерывание | |
c = U0RBR; | |
//Эхо | |
wait_transmitter(); | |
U0RBR=c; | |
//Сохранить в str | |
s[i++] = c; | |
if (c==0xD) { | |
wait_transmitter(); | |
U0RBR=0xA; | |
} | |
if (i >= cnt) | |
{ | |
break; | |
} | |
} | |
} | |
void ask_input() { | |
print((char *)"\nEnter constellation name:\n", 27); | |
} | |
void check_input() { | |
if (star_group == circle) { | |
for (i = 0; i < 4; i++) { | |
print((char*)circle_stars[i], kStrSize); | |
} | |
} | |
else if (star_group == square) { | |
for (i = 0; i < 4; i++) { | |
print((char*)square_stars[i], kStrSize); | |
} | |
} | |
else if (star_group == triangle) { | |
for (i = 0; i < 4; i++) { | |
print((char*)trinagle_stars[i], kStrSize); | |
}; | |
} | |
else { | |
print((char *)"\nUnknown\n", kStrSize); | |
} | |
} | |
// --- Timer routine ------------------- | |
void enable_timer() { | |
//VICIntEnable |= 0x00000010; | |
T0TCR = 1; | |
} | |
void disable_timer() { | |
//VICIntEnable = 0x00000000; | |
T0TCR = 0; | |
} | |
void Timer0_Int (void) __irq { | |
T0IR = 0x00000001; /* Сбросить флаг прерывания в Timer0 */ | |
ask_input(); | |
disable_timer(); | |
VICVectAddr = 0; /* Сбросить VIC*/ | |
} | |
void Timer0_Init(void) { | |
//Предделитель таймера = 12000 | |
T0PR = 1 * 40000; | |
//Сбросить счетчик и делитель | |
T0TCR = 0x00000002; | |
//При совпадении останавливаем, сбрасываем таймер | |
T0MCR = 0x00000003; | |
//Регистр совпадения = 1000 (1 Гц) | |
T0MR0 = 1000; | |
//Записать адрес обработчика прерывания в таблицу векторов | |
VICVectAddr4 = (unsigned)Timer0_Int; | |
//Настроить канал обработки | |
VICVectCntl4 = 0x00000024; | |
//Разрешить прерывания | |
VICIntEnable |= 0x00000010; | |
//Запустить таймер | |
T0TCR = 0x00000001; | |
} | |
//-------------------------------------- | |
//Обработчик прерываний UART0 RDA и CTI | |
void UART0_Int(void) __irq { | |
if (interrupts_count == -1) { | |
char choise; | |
scan(&choise, 1); | |
if (choise == 'n') | |
{ | |
exit(0); | |
} | |
//check_input(); | |
interrupts_count = 0; | |
enable_timer(); | |
return; | |
} | |
if (interrupts_count == -2) // starting the program | |
{ | |
interrupts_count = 0; | |
} | |
scan(&star_group, kStrSize); | |
check_input(); | |
print((char *)"Continue? (y/n)\n", 16); | |
interrupts_count = -1; | |
VICVectAddr = 0; /*Сбросить VIC*/ | |
} | |
void UART0_Init (void) { | |
//Разрешить альтернативные UART0 функции входов/выходов P0.2 (TxD) и P0.3 (RxD) | |
PINSEL0 = 0x00000050; // 01 01 00 00 | |
//Установить параметры передачи: 8 бит, без контроля четности, 1 стоповый бит | |
//+Разрешить запись делителя частоты CLK_UART0 | |
U0LCR = 0x00000083; | |
//Установить делитель частоты на скорость 115200 при частоте CLK_UART0 = 15MHz | |
U0DLL = 0x00000005; | |
//Дополнительный делитель частоты (DivAddVal/MulVal + 1) = 2/3 + 1 = 1.66 | |
U0FDR = 0x00000032; | |
//Фиксировать делитель частоты. | |
U0LCR = 0x00000003; | |
//Программировать FIFO буфер на прием 8-ми байт. | |
U0FCR = 0x00000081; | |
//Разрешить прерывание по приему | |
U0IER = 0x00000001; | |
//Записать адрес обработчика прерывания в таблицу векторов | |
VICVectAddr6 = (unsigned)UART0_Int; | |
//Настроить канал обработки | |
VICVectCntl6 = 0x00000026; | |
//Для FIQ | |
VICIntSelect = 0x40; | |
//Разрешить прерывания | |
VICIntEnable |= 0x00000040; | |
} | |
int main(void) | |
{ | |
Timer0_Init(); | |
UART0_Init(); | |
for (;;) {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment