📄 portszeregowy.c
字号:
/******************************************************************************/
/* PortSzeregowy.c */
/******************************************************************************/
#include <LPC2103.H> //Definicje dla procesora LPC2103.
#include <STRING.H> //Zawiera funkcje operujace na lancuchach znakow.
#ifndef __PortSzeregowy_c //Zabezpieczenie przed wielokrotnym wczytaniem pliku.
#define __PortSzeregowy_c
#define CR 0x0D //Znak przejscia do nowej linii.
extern char informacja[40];
extern char pomiarCisnienia_hPa[10]; //Zdefiniowane w pliku ProgramGlowy.c
extern char pomiarCisnienia_mmHg[10]; //Zdefiniowane w pliku ProgramGlowy.c
char wyslijZnak(char znak) //Wysyla znak (char) portem szeregowym.
{
if(znak == '\n')
{
while(!(U1LSR & 0x20));
U1THR = CR;
}
while(!(U1LSR & 0x20)); //Wysylaj dopoki w buforze nadajnika sa dane.
return(U1THR = znak);
}
void wyslijWyraz(char *p) //Wysyla ciag znakow (string) portem szeregowym.
{
while(*p)
wyslijZnak(*p++);
}
char czytajZnak (void)
{
while (!(U1LSR & 0x01));
return (U1RBR);
}
__irq void IRQodUART1(void) //Procedura obslugi przerwania od UART1.
{
switch(czytajZnak())
{
case '1':
{
strcpy(informacja,"Cisnienie wynosi: ");
strcat(informacja,pomiarCisnienia_hPa);
strcat(informacja,".\n");
wyslijWyraz(informacja);
};break;
case '2':
{
strcpy(informacja,"Cisnienie wynosi: ");
strcat(informacja,pomiarCisnienia_mmHg);
strcat(informacja,".\n");
wyslijWyraz(informacja);
};break;
case '3':
{
strcpy(informacja,"Cisnienie wynosi: ");
strcat(informacja,pomiarCisnienia_hPa);
strcat(informacja," (");
strcat(informacja,pomiarCisnienia_mmHg);
strcat(informacja,")\n");
wyslijWyraz(informacja);
};break;
default:
{
wyslijWyraz("\nZle polecenie!!!\n\n1 -> cisnienie w hPa.\n2 -> cisnienie w mmHg.\n3 -> pelna informacja.\n");
}
}
VICVectAddr = 0; //Zerowanie rejestru z wektorami przerwan.
}
void inicjalizujPortSzeregowy(void)
{
PINSEL0 = 0x00050000; //P0.8 -> TxD1, P0.9 -> RxD1.
U1LCR = 0x80; //DLAB = 1 (Umozliwia precyzyjne ustawienie predkosci transmisji).
U1LCR |= 0x0B; //8bitow danych,1 bit stopu, kontrola parzystosci typu "odd",
U1DLL = 38; //Predkosc 19200 bodow (przy PCLK = 15MHz).
U1FDR |=0x72; //DivAddVal=7, MulVal=2.
U1LCR = 0x0B; //DLAB = 0 (Divisor Latch Access Bit).
U1IER =0x01; //Jesli jakies dane znajda sie w buforze odbiornika, generowane jest przerwanie.
VICVectAddr5 = (unsigned long)IRQodUART1; //Adres procedury obslugi przerwania od UART1.
VICVectCntl5 = 0x27; //Przerwanie od UART1 jest przerwaniem wektorowanym.
VICIntEnable |= 0x80; //Uaktywnienie przerwania od UART1.
}
#endif // __PortSzeregowy_c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -