Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ioavr.h>
- #include <inavr.h>
- #include "hd44780.h"
- #define IN_DEBUG 0
- #define DV_480Hz 15
- #define KB_IN PINE
- #define KB_OUT PORTE
- #define KB_CTRL DDRE
- #define KEY_0 0x01
- #define KEY_1 0x02
- #define KEY_2 0x04
- #define KEY_3 0x08
- #define KEY_4 0x10
- #define KEY_5 0x20
- #define KEY_6 0x40
- #define KEY_7 0x80
- #define KB_DEB_TM 2
- #define KB_TPM_DY 200
- #define KB_REP_DY 50
- #define KB_IDLE 0
- #define KB_DEB 1
- #define KB_REP 2
- #define KB_REL 3
- #define KB_REL_DEB 4
- char c_reset[] = "reset";
- char c_newgame[] = "new-g";
- char c_stand[] = "stand";
- char c_hit[] = "-hit-";
- int UserCards[11];
- int playerSum;
- int ComputerSum;
- int ComputerCards[2];
- int playersScore;
- int lcdPosition;
- int newGameLock;
- typedef union TSystemEvent {
- unsigned char ev;
- struct {
- unsigned char time : 1;
- unsigned char kb : 1;
- unsigned char dummy : 6;
- };
- } TSystemEvent;
- void kbService();
- __no_init unsigned char kb_rep;
- __no_init unsigned char kb_reg;
- volatile TSystemEvent rq;
- unsigned char rnd_cnt;
- unsigned char rnd_rg = 9; // TODO 9, 12
- unsigned char rnd_val;
- void kbInit()
- {
- KB_CTRL = 0x00;
- KB_OUT = 0xFF; //Enable Pull-Up on port
- }
- void initDevices()
- {
- OCR0 = DV_480Hz - 1;
- TCCR0 = (1 << WGM01) | (1 << CS02) | (1 << CS01) | (1 << CS00);
- TIMSK = (1 << OCIE0);
- __enable_interrupt();
- kb_rep = 0;
- LCDInit();
- }
- int getCardVal()
- {
- return rnd_cnt;
- }
- void mypf(char c[], int pos)
- {
- if (IN_DEBUG)
- {
- LCDClear();
- int i = 0;
- while (i < 5)
- {
- LCDGoTo(lcdPosition);
- LCDPutChar(c[i]);
- ++lcdPosition;
- i++;
- }
- }
- }
- void newGame(){
- for (int i = 0; i < 11 ; ++i)
- {
- UserCards[i] = 0;
- }
- ComputerCards[0] = 0;
- ComputerCards[1] = 0;
- lcdPosition = 0;
- playerSum = 0;
- ComputerSum=0;
- newGameLock = 0;
- mypf(c_newgame, lcdPosition);
- UserCards[0] = getCardVal();
- UserCards[1] = getCardVal();
- playerSum += UserCards[0];
- playerSum += UserCards[1];
- ComputerCards[0] = getCardVal();
- ComputerCards[1] = getCardVal();
- ComputerSum += ComputerCards[0];
- ComputerSum += ComputerCards[1];
- LCDGoTo(lcdPosition);
- LCDPutChar('C');
- ++lcdPosition;
- LCDGoTo(lcdPosition);
- LCDPrintDgt(ComputerCards[0]);
- ++lcdPosition;
- ++lcdPosition;
- LCDGoTo(lcdPosition);
- LCDPrintSpace(1);
- ++lcdPosition;
- LCDGoTo(lcdPosition);
- LCDPutChar('P');
- ++lcdPosition;
- LCDGoTo(lcdPosition);
- LCDPrintDgt(playerSum);
- LCDPrintSpace(1);
- LCDPrintDgt(playersScore);
- if(playerSum > 21)
- {
- --playersScore;
- newGameLock = 1;
- }
- }
- void reset()
- {
- mypf(c_reset, lcdPosition);
- playersScore = 0;
- newGame();
- LCDClear();
- }
- void stand()
- {
- if (newGameLock == 0)
- {
- mypf(c_stand, lcdPosition);
- int UserResult = 21 - playerSum;
- int CompResult = 21 - ComputerSum;
- if (UserResult < CompResult)
- {
- ++playersScore;
- }
- else
- {
- --playersScore;
- }
- newGameLock = 1;
- LCDPrintDgt(playersScore);
- }
- }
- void hit()
- {
- if (newGameLock == 0)
- {
- mypf(c_hit, lcdPosition);
- playerSum += getCardVal();
- LCDGoTo(lcdPosition);
- LCDPrintDgt(playerSum);
- if(playerSum > 21)
- {
- --playersScore;
- newGameLock = 1;
- }
- }
- }
- void main()
- {
- initDevices();
- reset();
- for( ; ; )
- {
- if(rq.kb)
- {
- // “RESET”, “NEW GAME”, “STAND”, “HIT”
- if(kb_reg & 0x10) reset(); // kb_req - wartosc przycisku
- else if(kb_reg & 0x40) newGame();
- else if(kb_reg & 0x20) stand();
- else if(kb_reg & 0x80) hit();
- //Remove notifications
- kb_reg = KB_IDLE; // zerowanie zeby nie dzialo sie w nieskonczonosc
- }
- }
- }
- #pragma vector = TIMER0_COMP_vect
- __interrupt void T0_COMP_ISR()
- {
- if((++rnd_cnt) == rnd_rg)
- rnd_cnt = 2; // TODO 2
- kbService();
- }
- void kbService()
- {
- static char kb_st;
- static unsigned char kb_prev;
- static unsigned char kb_tmr;
- unsigned char kb;
- kb = ~KB_IN;
- switch(kb_st)
- {
- case KB_IDLE:
- if(kb == 0) return;
- kb_prev = kb;
- while(1)
- {
- if(kb_prev & 0x01) break;
- kb_prev = kb_prev >> 1;
- }
- kb_prev = kb_prev >> 1;
- if(kb_prev) return;
- kb_prev = kb;
- kb_st = KB_DEB;
- kb_tmr = KB_DEB_TM;
- break;
- case KB_DEB:
- if(kb != kb_prev) kb_st = KB_REL;
- if(--kb_tmr) return;
- kb_reg = kb;
- rq.kb = 1;
- rnd_val = rnd_cnt;
- if(kb & kb_rep)
- {
- kb_st = KB_REP;
- kb_tmr = KB_TPM_DY;
- }
- else
- kb_st = KB_REL;
- break;
- case KB_REP:
- if(kb != kb_prev)
- {
- kb_st = KB_REL;
- return;
- }
- if(--kb_tmr) return;
- kb_tmr = KB_REP_DY;
- kb_reg = kb;
- rq.kb = 1;
- break;
- case KB_REL:
- if(kb == 0)
- {
- kb_st = KB_REL_DEB;
- kb_tmr = KB_DEB_TM;
- }
- break;
- case KB_REL_DEB:
- if(kb)
- {
- kb_st = KB_REL;
- return;
- }
- if(--kb_tmr) return;
- kb_st = KB_IDLE;
- break;
- default:
- kb_st = KB_IDLE;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement