Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
lab5(4)
#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
You can’t perform that action at this time.