rendered paste body#include <reg552.h>
void uart_setup() { /* nastaveni kanalu */
TMOD = 0x20;
TH1=0xFD; /* 9600 */
S0CON = 0x50;
TR1=1;
TI =1;
}
char backup, dat;
unsigned int delay, delaybackup, increase, time;
unsigned char sinusovka[] = {127, 152, 176, 198, 217, 233, 244, 252, 254, 252, 244
,233, 217, 198, 176, 152, 127, 102, 79, 57, 37, 22, 10, 2, 0, 2, 10, 21, 37, 56, 78, 102} ;
void serial_IT(void) interrupt 4 { /* obsluha seriovejch interuptu */
if (RI == 1) {
RI = 0;
dat = S0BUF;
}
else {
TI = 0;
}
}
void zpozdeni() {
while ( delay !=0 )
{delay--;
}
if ( delay == 0)
delay = delaybackup;
}
void obdelnik () {
P1 = ~P1;
zpozdeni();
backup = 'o';
}
void trojuhelnik() { /* trojuhelnik */
if (increase == 1) {
if (P1 >=254 ) {
increase = 0;
}
else {
zpozdeni();
P1++;
}
}
else {
if (P1 <= 1) {
increase = 1;
}
else {
zpozdeni();
P1--;
}
}
backup = 't';
}
void sinfce () { /* sinusovka tabulkou, math.h generuje strasne velkej kod */
time++;
if(time >= 32) {
time = 0; }
else {
zpozdeni();
P1 = *(sinusovka+time);
}
backup = 's';
}
void pila(){
zpozdeni();
P1++;
backup = 'p';
}
void incdel() {
delay++;
while ( delay >= 65534 ) {
delay --;
}
delaybackup=delay;
switch(backup) { /* navrat na minuly prubeh */
case 'o': obdelnik();
break;
case 't': trojuhelnik();
break;
case 's': sinfce();
break;
case 'p': pila();
break;
}
}
void decdel() {
delay--;
while (delay <= 1 )
{
delay++;
}
delaybackup = delay;
switch(backup) { /* navrat na minuly prubeh */
case 'o': obdelnik();
break;
case 't': trojuhelnik();
break;
case 's': sinfce();
break;
case 'p': pila();
break;
}
}
void main() {
EA=1; /* povolim interupty */
ES0=1; /* povolim seriovy interupty */
uart_setup();
while (1) {
switch(dat) {
case 'o': obdelnik();
break;
case 't': trojuhelnik();
break;
case 's': sinfce();
break;
case 'p': pila();
break;
case '+': incdel();
break;
case '-': decdel();
break;
}
}
}