Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <util/delay.h>
- //makroi za kontrolu pinova preko kojih je kontroler povezan sa 74HC165:
- #define SCL_HI (PORTC |= (1<<5))
- #define SCL_LO (PORTC &= ~(1<<5))
- #define SDA (PINC & (1 << 4))
- #define SHLD_HI (PORTB |= (1<<5))
- #define SHLD_LO (PORTB &= ~(1<<5))
- unsigned char sekvenca = 0xff;
- unsigned char prekidaci = 0; //ocitaj_prekidace();
- unsigned char poslednjeStanje = 0;
- unsigned char ocitaj_prekidace()
- {
- unsigned char i, tmp = 0, mask = 0x80;
- //impuls za upis stanja prekidaca u registar
- SHLD_HI;
- SHLD_LO;
- SHLD_HI;
- for (i=0; i<8; i++)
- {
- SCL_LO;
- SCL_HI; //generisanje aktivne ivice takta
- if (SDA) //provera stanja ulaznog pina
- tmp |= mask;
- mask >>= 1;
- }
- return tmp;
- }
- void podesiSekvencu(){
- switch(prekidaci){
- case 0xff:
- if(poslednjeStanje != prekidaci) {
- sekvenca = ~0xfc;
- poslednjeStanje = 0xff;
- }
- break;
- case 0xfe:
- if(poslednjeStanje != prekidaci) {
- sekvenca = ~0xf0;
- poslednjeStanje = 0xfe;
- }
- break;
- case 0xfd:
- if(poslednjeStanje != prekidaci) {
- sekvenca = ~0xc0;
- poslednjeStanje = 0xfd;
- }
- break;
- case 0xfc:
- if(poslednjeStanje != prekidaci) {
- sekvenca = ~0x24;
- poslednjeStanje = 0xfc;
- }
- break;
- }
- }
- void rotiraj() {
- unsigned char MSB = sekvenca & 0x80; // ciljam skroz levi bit 0x80 = 1000 0000
- sekvenca = sekvenca << 1; // pomeram jedno mesto levo
- if(MSB & 0x80) {
- sekvenca |= 1; // OR sekvence sa 1, odnosno +1, LSB postaje 1
- }
- _delay_ms(500);
- }
- int main(void)
- {
- DDRD = 0xff; //port D -> izlaz
- DDRC = 0x20; //PC5 -> izlaz
- DDRB = 0x30; //PB5 i PB4 -> izlazi
- PORTB = ~0x10; //ukljucenje tranzistora Q0
- while (1) {
- prekidaci = ocitaj_prekidace();
- podesiSekvencu();
- PORTD = ~sekvenca;
- rotiraj();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement