#include 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; } } }