Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <REGX52.H> //biblioteka sa definicijama registara
- #define F_CLK 18432000
- #define F_INT 1000
- typedef unsigned char byte;
- unsigned char xdata CRV_PREK _at_ 0x8000;
- unsigned char xdata ZELENE _at_ 0x8001;
- unsigned char xdata ZUTE _at_ 0x8002;
- unsigned char xdata PLAVE _at_ 0x8003;
- unsigned long sys_time = 0;
- byte slika_ispisa = 0x7f; /* promenjiva koju funkcija ping pong manipulise.
- pocetno stanje je skroz desna diodica.
- */
- byte prek_smer;
- byte prek_vreme;
- byte koeficijent; /* ovim cu skalirati trajanje od 0.5 sekunde
- da dobijem sve ostale --> 1, 2, 4 sekunde.
- */
- byte smer = 0; // 1 - levo, 0 - desno
- byte nivo = 1;
- void timer0_ISR() interrupt 1
- {
- sys_time++;
- TR0 = 0; //tajmer 0 OFF
- TH0 = 0xFA; //ucitavanje pocetne vrednosti
- TL0 = 0x00;
- TR0 = 1; //tajmer 0 ON
- }
- unsigned long millis()
- {
- unsigned long tmp;
- EA = 0; //zabrana prekida
- tmp = sys_time; //ocitavanje vremena
- EA = 1; //dozvola prekida
- return tmp;
- }
- void delay_ms(unsigned long d)
- {
- unsigned long t0 = millis();
- while(millis() - t0 < d);
- }
- byte prek_old = 0;
- void podesi_smer(byte *smer, byte prekidaci) {
- switch(prekidaci){
- case 0:
- if(prek_old != prekidaci) {
- *smer = 1;
- prek_old = 0;
- }
- break;
- case 1:
- if(prek_old != prekidaci) {
- *smer = 0;
- prek_old = 1;
- }
- break;
- }
- }
- void podesi_ispis(byte nivo, byte slika_ispisa){
- switch(nivo){
- case 1:
- CRV_PREK = slika_ispisa;
- ZUTE = 0xff;
- ZELENE = 0xff;
- PLAVE = 0xff;
- break;
- case 2:
- CRV_PREK = 0xff;
- ZUTE = slika_ispisa;
- ZELENE = 0xff;
- PLAVE = 0xff;
- break;
- case 3:
- CRV_PREK = 0xff;
- ZUTE = 0xff;
- ZELENE = slika_ispisa;
- PLAVE = 0xff;
- break;
- case 4:
- CRV_PREK = 0xff;
- ZUTE = 0xff;
- ZELENE = 0xff;
- PLAVE = slika_ispisa;
- break;
- }
- }
- void podesi_trajanje(byte prekidaci, byte *koeficijent) {
- switch(prekidaci) {
- case 0x00:
- // najmanji interval je 50ms
- *koeficijent = 1;
- break;
- case 0x01:
- // onda u 100ms imam takva dva
- *koeficijent = 2;
- break;
- case 0x02:
- // u 200ms imam takva 4
- *koeficijent = 4;
- break;
- case 0x03:
- // u 500 mili sekunde imam 10 takvih
- *koeficijent = 10;
- break;
- }
- }
- void rotiraj(byte *nivo, byte *smer, byte koef_v, byte *slika_ispisa){
- switch(*smer) {
- case 0:
- *slika_ispisa = *slika_ispisa >> 1;
- *slika_ispisa |= 0x80;
- //*slika_ispisa = ~(*slika_ispisa);
- if(*slika_ispisa == 0xFF) {
- //*nivo++;
- if((*nivo) < 5) {
- (*nivo)++;
- *slika_ispisa = 0x7f;
- } else {
- *smer = 1;
- *slika_ispisa = 0x7f;
- }
- }
- break;
- case 1:
- *slika_ispisa = *slika_ispisa << 1;
- *slika_ispisa |= 0x01;
- if(*slika_ispisa == 0xff) {
- if((*nivo) > 0) {
- (*nivo)--;
- *slika_ispisa = 0xfe;
- } else {
- *smer = 0;
- *slika_ispisa = 0xfe;
- }
- }
- break;
- }
- delay_ms(koef_v * 50);
- }
- void main()
- {
- //inicijalizacija tajmera 0:
- TMOD = 0x01; //tajmer 2 -> 16-bitni mod
- ET0 = 1; //dozvola prekida tajmera 0
- TR0 = 1; //tajmer 0 ON
- EA = 1; //dozvola prekida
- while(1){
- prek_smer = (~CRV_PREK & 0x80) >> 7;
- // ovde je maska 0000 0011 pa ne moram nista da shiftujem
- prek_vreme = ~CRV_PREK & 0x03;
- //CRV_PREK = 0xAA;
- podesi_trajanje(prek_vreme, &koeficijent);
- podesi_smer(&smer, prek_smer);
- rotiraj(&nivo, &smer, koeficijent, &slika_ispisa);
- podesi_ispis(nivo, slika_ispisa);
- }
- }
- #include <REGX52.H> //biblioteka sa definicijama registara
- #define F_CLK 18432000
- #define F_INT 1000
- typedef unsigned char byte;
- unsigned char xdata CRV_PREK _at_ 0x8000;
- unsigned char xdata ZELENE _at_ 0x8001;
- unsigned char xdata ZUTE _at_ 0x8002;
- unsigned char xdata PLAVE _at_ 0x8003;
- unsigned long sys_time = 0;
- byte slika_ispisa = 0x7f; /* promenjiva koju funkcija ping pong manipulise.
- pocetno stanje je skroz desna diodica.
- */
- byte prek_smer;
- byte prek_vreme;
- byte koeficijent; /* ovim cu skalirati trajanje od 0.5 sekunde
- da dobijem sve ostale --> 1, 2, 4 sekunde.
- */
- byte smer = 0; // 1 - levo, 0 - desno
- byte nivo = 1;
- void timer0_ISR() interrupt 1
- {
- sys_time++;
- TR0 = 0; //tajmer 0 OFF
- TH0 = 0xFA; //ucitavanje pocetne vrednosti
- TL0 = 0x00;
- TR0 = 1; //tajmer 0 ON
- }
- unsigned long millis()
- {
- unsigned long tmp;
- EA = 0; //zabrana prekida
- tmp = sys_time; //ocitavanje vremena
- EA = 1; //dozvola prekida
- return tmp;
- }
- void delay_ms(unsigned long d)
- {
- unsigned long t0 = millis();
- while(millis() - t0 < d);
- }
- byte prek_old = 0;
- void podesi_smer(byte *smer, byte prekidaci) {
- switch(prekidaci){
- case 0:
- if(prek_old != prekidaci) {
- *smer = 1;
- prek_old = 0;
- }
- break;
- case 1:
- if(prek_old != prekidaci) {
- *smer = 0;
- prek_old = 1;
- }
- break;
- }
- }
- void podesi_ispis(byte nivo, byte slika_ispisa){
- switch(nivo){
- case 1:
- CRV_PREK = slika_ispisa;
- ZUTE = 0xff;
- ZELENE = 0xff;
- PLAVE = 0xff;
- break;
- case 2:
- CRV_PREK = 0xff;
- ZUTE = slika_ispisa;
- ZELENE = 0xff;
- PLAVE = 0xff;
- break;
- case 3:
- CRV_PREK = 0xff;
- ZUTE = 0xff;
- ZELENE = slika_ispisa;
- PLAVE = 0xff;
- break;
- case 4:
- CRV_PREK = 0xff;
- ZUTE = 0xff;
- ZELENE = 0xff;
- PLAVE = slika_ispisa;
- break;
- }
- }
- void podesi_trajanje(byte prekidaci, byte *koeficijent) {
- switch(prekidaci) {
- case 0x00:
- // najmanji interval je 50ms
- *koeficijent = 1;
- break;
- case 0x01:
- // onda u 100ms imam takva dva
- *koeficijent = 2;
- break;
- case 0x02:
- // u 200ms imam takva 4
- *koeficijent = 4;
- break;
- case 0x03:
- // u 500 mili sekunde imam 10 takvih
- *koeficijent = 10;
- break;
- }
- }
- void rotiraj(byte *nivo, byte *smer, byte koef_v, byte *slika_ispisa){
- switch(*smer) {
- case 0:
- //*slika_ispisa = ~(*slika_ispisa);
- //if(*slika_ispisa == 0xFF) {
- //*nivo++;
- if((*nivo) == 1) {
- *slika_ispisa = *slika_ispisa >> 1;
- *slika_ispisa |= 0x80;
- if((*slika_ispisa) == 0xff){
- (*nivo)++;
- *slika_ispisa = 0xfe;
- }
- } else if((*nivo) == 2) {
- (*nivo)++;
- *slika_ispisa = 0xfe;
- } else if((*nivo) == 3) {
- (*nivo)++;
- *slika_ispisa = 0xfe;
- } else if((*nivo) == 4) {
- *slika_ispisa = *slika_ispisa << 1;
- *slika_ispisa |= 0x01;
- if((*slika_ispisa) == 0x7f) {
- *smer = 1;
- }
- }
- //}
- break;
- case 1:
- if((*nivo) == 3) {
- (*nivo)--;
- *slika_ispisa = 0x7f;
- } else if((*nivo) == 2) {
- (*nivo)--;
- *slika_ispisa = 0x7f;
- } else if((*nivo) == 4) {
- /**slika_ispisa = *slika_ispisa << 1;
- *slika_ispisa |= 0x01;*/
- //if((*slika_ispisa) == 0x7f) {
- //*smer = 0;
- (*nivo)--;
- //}
- } else if((*nivo)==1){
- *smer = 0;
- }
- break;
- }
- delay_ms(koef_v * 50);
- }
- void main()
- {
- //inicijalizacija tajmera 0:
- TMOD = 0x01; //tajmer 2 -> 16-bitni mod
- ET0 = 1; //dozvola prekida tajmera 0
- TR0 = 1; //tajmer 0 ON
- EA = 1; //dozvola prekida
- while(1){
- prek_smer = (~CRV_PREK & 0x80) >> 7;
- // ovde je maska 0000 0011 pa ne moram nista da shiftujem
- prek_vreme = ~CRV_PREK & 0x03;
- //CRV_PREK = 0xAA;
- podesi_trajanje(prek_vreme, &koeficijent);
- podesi_smer(&smer, prek_smer);
- rotiraj(&nivo, &smer, koeficijent, &slika_ispisa);
- podesi_ispis(nivo, slika_ispisa);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement