//filename: lcd_final.h //definitions for different items #define begin { #define end } #define xmin7 12 //starting x position of ball on table (allowable) #define xmax7 284 //ending x position of ball on table (allowable) //midpoint is 136 #define ymin7 17 //starting y position of ball on table (allowable) #define ymax7 149 //ending y position of ball on table (allowable) //midpoint is 66 #define xtablemin 0 #define ytablemin 0 #define xtablemax xmax7-xmin7 #define ytablemax ymax7-ymin7 #define cueLength 70 //how long cue is #define rotaryMax 460 //trial and error value for rotary potentiometer to give full round on screen //Referenced from http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2002/jq13/webpage/476monopoly.html // LCD control codes #define LCDreset 0x00 // 00000000 Reset the Display #define LCDnop 0x47 // 01000111 No operation -ok #define CmdSetup 0x47 // 01000111 Set A0 high #define CmdWrite 0x43 // 01000011 Set WR low #define DataSetup 0x07 // 00000111 Set A0 low #define DataWrite 0x03 // 00000011 Set WR low #define StatusRead 0x05 // 00000101 Set RD low, A0 low #define DataRead 0x45 // 01000101 Set RD low, A0 high // LCD Commands (PORTD) #define SystemSet 0x40 // Initialize system #define SleepIn 0x53 // Enter standby mode #define DispOFF 0x58 // Display Off #define DispON 0x59 // Display On #define Scroll 0x44 // Initialize Address & Regions #define CSRForm 0x5D // Set cursor type #define CharAddr 0x5C // Set address of character RAM #define CSRRight 0x4C // Cursor direction = right #define CSRLeft 0x4D // Cursor direction = left #define CSRUp 0x4E // Cursor direction = up #define CSRDown 0x4F // Cursor direction = down #define HorzScroll 0x5A // Set horz scroll position #define Overlay 0x5B // Set Display Format #define CSRW 0x46 // Set cursor address #define CSRR 0x47 // Read cursor address #define MWRITE 0x42 // Write to display memory #define MREAD 0x43 // Read from display memory //LCD definitions unsigned char strbuffer[30]; //used to hold strings unsigned char pixelbuffer; //for shifting pixels flash unsigned char ball7x7[16][7]={ //diagram of balls 0x38,0x64,0xda,0xde,0xda,0x64,0x38, //cue 0x38,0x74,0xf6,0xf6,0xf6,0x74,0x38, //ball 1 0x38,0x44,0xf6,0xc6,0xde,0x44,0x38, //ball 2 0x38,0x44,0xf6,0xc6,0xf6,0x44,0x38, //ball 3 0x38,0x54,0xd6,0xc6,0xf6,0x74,0x38, //ball 4 0x38,0x44,0xde,0xc6,0xf6,0x44,0x38, //ball 5 0x38,0x44,0xde,0xc6,0xd6,0x44,0x38, //ball 6 0x38,0x44,0xf6,0xe2,0xf6,0x74,0x38, //ball 7 0x38,0x44,0xd6,0xc6,0xd6,0x44,0x38, //ball 8 0x38,0x44,0xd6,0xc6,0xf6,0x74,0x38, //ball 9 0x38,0x7c,0xa2,0xaa,0xaa,0x64,0x38, //ball 10 0x38,0x54,0xd6,0xd6,0xd6,0x54,0x38, //ball 11 0x38,0x64,0xba,0xa2,0xae,0x63,0x38, //ball 12 0x38,0x64,0xba,0xa2,0xba,0x64,0x38, //ball 13 0x38,0x6c,0xaa,0xa2,0xba,0x7c,0x38, //ball 14 0x38,0x64,0xae,0xa2,0xba,0x64,0x38}; //ball 15 #define maxvalues 360 //360 degrees flash signed long cosTable[maxvalues]={0x00000100,0x000000FF,0x000000FF,0x000000FF,0x000000FF,0x000000FF,0x000000FE,0x000000FE,0x000000FD ,0x000000FC,0x000000FC,0x000000FB,0x000000FA,0x000000F9,0x000000F8,0x000000F7,0x000000F6,0x000000F4 ,0x000000F3,0x000000F2,0x000000F0,0x000000EE,0x000000ED,0x000000EB,0x000000E9,0x000000E8,0x000000E6 ,0x000000E4,0x000000E2,0x000000DF,0x000000DD,0x000000DB,0x000000D9,0x000000D6,0x000000D4,0x000000D1 ,0x000000CF,0x000000CC,0x000000C9,0x000000C6,0x000000C4,0x000000C1,0x000000BE,0x000000BB,0x000000B8 ,0x000000B5,0x000000B1,0x000000AE,0x000000AB,0x000000A7,0x000000A4,0x000000A1,0x0000009D,0x0000009A ,0x00000096,0x00000092,0x0000008F,0x0000008B,0x00000087,0x00000083,0x00000080,0x0000007C,0x00000078 ,0x00000074,0x00000070,0x0000006C,0x00000068,0x00000064,0x0000005F,0x0000005B,0x00000057,0x00000053 ,0x0000004F,0x0000004A,0x00000046,0x00000042,0x0000003D,0x00000039,0x00000035,0x00000030,0x0000002C ,0x00000028,0x00000023,0x0000001F,0x0000001A,0x00000016,0x00000011,0x0000000D,0x00000008,0x00000004 ,0x00000000,0xFFFFFFFFFC,0xFFFFFFFFF8,0xFFFFFFFFF3,0xFFFFFFFFEF,0xFFFFFFFFEA,0xFFFFFFFFE6,0xFFFFFFFFE1 ,0xFFFFFFFFDD,0xFFFFFFFFD8,0xFFFFFFFFD4,0xFFFFFFFFD0,0xFFFFFFFFCB,0xFFFFFFFFC7,0xFFFFFFFFC3,0xFFFFFFFFBE ,0xFFFFFFFFBA,0xFFFFFFFFB6,0xFFFFFFFFB1,0xFFFFFFFFAD,0xFFFFFFFFA9,0xFFFFFFFFA5,0xFFFFFFFFA1,0xFFFFFFFF9C ,0xFFFFFFFF98,0xFFFFFFFF94,0xFFFFFFFF90,0xFFFFFFFF8C,0xFFFFFFFF88,0xFFFFFFFF84,0xFFFFFFFF81,0xFFFFFFFF7D ,0xFFFFFFFF79,0xFFFFFFFF75,0xFFFFFFFF71,0xFFFFFFFF6E,0xFFFFFFFF6A,0xFFFFFFFF66,0xFFFFFFFF63,0xFFFFFFFF5F ,0xFFFFFFFF5C,0xFFFFFFFF59,0xFFFFFFFF55,0xFFFFFFFF52,0xFFFFFFFF4F,0xFFFFFFFF4B,0xFFFFFFFF48,0xFFFFFFFF45 ,0xFFFFFFFF42,0xFFFFFFFF3F,0xFFFFFFFF3C,0xFFFFFFFF3A,0xFFFFFFFF37,0xFFFFFFFF34,0xFFFFFFFF31,0xFFFFFFFF2F ,0xFFFFFFFF2C,0xFFFFFFFF2A,0xFFFFFFFF27,0xFFFFFFFF25,0xFFFFFFFF23,0xFFFFFFFF21,0xFFFFFFFF1E,0xFFFFFFFF1C ,0xFFFFFFFF1A,0xFFFFFFFF18,0xFFFFFFFF17,0xFFFFFFFF15,0xFFFFFFFF13,0xFFFFFFFF12,0xFFFFFFFF10,0xFFFFFFFF0E ,0xFFFFFFFF0D,0xFFFFFFFF0C,0xFFFFFFFF0A,0xFFFFFFFF09,0xFFFFFFFF08,0xFFFFFFFF07,0xFFFFFFFF06,0xFFFFFFFF05 ,0xFFFFFFFF04,0xFFFFFFFF04,0xFFFFFFFF03,0xFFFFFFFF02,0xFFFFFFFF02,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01 ,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF00,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01 ,0xFFFFFFFF02,0xFFFFFFFF02,0xFFFFFFFF03,0xFFFFFFFF04,0xFFFFFFFF04,0xFFFFFFFF05,0xFFFFFFFF06,0xFFFFFFFF07 ,0xFFFFFFFF08,0xFFFFFFFF09,0xFFFFFFFF0A,0xFFFFFFFF0C,0xFFFFFFFF0D,0xFFFFFFFF0E,0xFFFFFFFF10,0xFFFFFFFF12 ,0xFFFFFFFF13,0xFFFFFFFF15,0xFFFFFFFF17,0xFFFFFFFF18,0xFFFFFFFF1A,0xFFFFFFFF1C,0xFFFFFFFF1E,0xFFFFFFFF21 ,0xFFFFFFFF23,0xFFFFFFFF25,0xFFFFFFFF27,0xFFFFFFFF2A,0xFFFFFFFF2C,0xFFFFFFFF2F,0xFFFFFFFF31,0xFFFFFFFF34 ,0xFFFFFFFF37,0xFFFFFFFF3A,0xFFFFFFFF3C,0xFFFFFFFF3F,0xFFFFFFFF42,0xFFFFFFFF45,0xFFFFFFFF48,0xFFFFFFFF4B ,0xFFFFFFFF4F,0xFFFFFFFF52,0xFFFFFFFF55,0xFFFFFFFF59,0xFFFFFFFF5C,0xFFFFFFFF5F,0xFFFFFFFF63,0xFFFFFFFF66 ,0xFFFFFFFF6A,0xFFFFFFFF6E,0xFFFFFFFF71,0xFFFFFFFF75,0xFFFFFFFF79,0xFFFFFFFF7D,0xFFFFFFFF80,0xFFFFFFFF84 ,0xFFFFFFFF88,0xFFFFFFFF8C,0xFFFFFFFF90,0xFFFFFFFF94,0xFFFFFFFF98,0xFFFFFFFF9C,0xFFFFFFFFA1,0xFFFFFFFFA5 ,0xFFFFFFFFA9,0xFFFFFFFFAD,0xFFFFFFFFB1,0xFFFFFFFFB6,0xFFFFFFFFBA,0xFFFFFFFFBE,0xFFFFFFFFC3,0xFFFFFFFFC7 ,0xFFFFFFFFCB,0xFFFFFFFFD0,0xFFFFFFFFD4,0xFFFFFFFFD8,0xFFFFFFFFDD,0xFFFFFFFFE1,0xFFFFFFFFE6,0xFFFFFFFFEA ,0xFFFFFFFFEF,0xFFFFFFFFF3,0xFFFFFFFFF8,0xFFFFFFFFFC,0x00000000,0x00000004,0x00000008,0x0000000D ,0x00000011,0x00000016,0x0000001A,0x0000001F,0x00000023,0x00000028,0x0000002C,0x00000030 ,0x00000035,0x00000039,0x0000003D,0x00000042,0x00000046,0x0000004A,0x0000004F,0x00000053,0x00000057 ,0x0000005B,0x0000005F,0x00000064,0x00000068,0x0000006C,0x00000070,0x00000074,0x00000078,0x0000007C ,0x00000080,0x00000083,0x00000087,0x0000008B,0x0000008F,0x00000092,0x00000096,0x0000009A,0x0000009D ,0x000000A1,0x000000A4,0x000000A7,0x000000AB,0x000000AE,0x000000B1,0x000000B5,0x000000B8,0x000000BB ,0x000000BE,0x000000C1,0x000000C4,0x000000C6,0x000000C9,0x000000CC,0x000000CF,0x000000D1,0x000000D4 ,0x000000D6,0x000000D9,0x000000DB,0x000000DD,0x000000DF,0x000000E2,0x000000E4,0x000000E6,0x000000E8 ,0x000000E9,0x000000EB,0x000000ED,0x000000EE,0x000000F0,0x000000F2,0x000000F3,0x000000F4,0x000000F6 ,0x000000F7,0x000000F8,0x000000F9,0x000000FA,0x000000FB,0x000000FC,0x000000FC,0x000000FD,0x000000FE ,0x000000FE,0x000000FF,0x000000FF,0x000000FF,0x000000FF,0x000000FF} ; //sinetable is not implemented as the function is not symmetrical unlike cosine flash signed long sinTable[maxvalues]={0x00000100,0x000000FF,0x000000FF,0x000000FF,0x000000FF,0x000000FF,0x000000FE,0x000000FE ,0x000000FD,0x000000FC,0x000000FC,0x000000FB,0x000000FA,0x000000F9,0x000000F8,0x000000F7 ,0x000000F6,0x000000F4,0x000000F3,0x000000F2,0x000000F0,0x000000EE,0x000000ED,0x000000EB ,0x000000E9,0x000000E8,0x000000E6,0x000000E4,0x000000E2,0x000000DF,0x000000DD,0x000000DB ,0x000000D9,0x000000D6,0x000000D4,0x000000D1,0x000000CF,0x000000CC,0x000000C9,0x000000C6 ,0x000000C4,0x000000C1,0x000000BE,0x000000BB,0x000000B8,0x000000B5,0x000000B1,0x000000AE ,0x000000AB,0x000000A7,0x000000A4,0x000000A1,0x0000009D,0x0000009A,0x00000096,0x00000092 ,0x0000008F,0x0000008B,0x00000087,0x00000083,0x00000080,0x0000007C,0x00000078,0x00000074 ,0x00000070,0x0000006C,0x00000068,0x00000064,0x0000005F,0x0000005B,0x00000057,0x00000053 ,0x0000004F,0x0000004A,0x00000046,0x00000042,0x0000003D,0x00000039,0x00000035,0x00000030 ,0x0000002C,0x00000028,0x00000023,0x0000001F,0x0000001A,0x00000016,0x00000011,0x0000000D ,0x00000008,0x00000004,0x00000000,0xFFFFFFFFFC,0xFFFFFFFFF8,0xFFFFFFFFF3,0xFFFFFFFFEF,0xFFFFFFFFEA ,0xFFFFFFFFE6,0xFFFFFFFFE1,0xFFFFFFFFDD,0xFFFFFFFFD8,0xFFFFFFFFD4,0xFFFFFFFFD0,0xFFFFFFFFCB,0xFFFFFFFFC7 ,0xFFFFFFFFC3,0xFFFFFFFFBE,0xFFFFFFFFBA,0xFFFFFFFFB6,0xFFFFFFFFB1,0xFFFFFFFFAD,0xFFFFFFFFA9,0xFFFFFFFFA5 ,0xFFFFFFFFA1,0xFFFFFFFF9C,0xFFFFFFFF98,0xFFFFFFFF94,0xFFFFFFFF90,0xFFFFFFFF8C,0xFFFFFFFF88,0xFFFFFFFF84 ,0xFFFFFFFF81,0xFFFFFFFF7D,0xFFFFFFFF79,0xFFFFFFFF75,0xFFFFFFFF71,0xFFFFFFFF6E,0xFFFFFFFF6A,0xFFFFFFFF66 ,0xFFFFFFFF63,0xFFFFFFFF5F,0xFFFFFFFF5C,0xFFFFFFFF59,0xFFFFFFFF55,0xFFFFFFFF52,0xFFFFFFFF4F,0xFFFFFFFF4B ,0xFFFFFFFF48,0xFFFFFFFF45,0xFFFFFFFF42,0xFFFFFFFF3F,0xFFFFFFFF3C,0xFFFFFFFF3A,0xFFFFFFFF37,0xFFFFFFFF34 ,0xFFFFFFFF31,0xFFFFFFFF2F,0xFFFFFFFF2C,0xFFFFFFFF2A,0xFFFFFFFF27,0xFFFFFFFF25,0xFFFFFFFF23,0xFFFFFFFF21 ,0xFFFFFFFF1E,0xFFFFFFFF1C,0xFFFFFFFF1A,0xFFFFFFFF18,0xFFFFFFFF17,0xFFFFFFFF15,0xFFFFFFFF13,0xFFFFFFFF12 ,0xFFFFFFFF10,0xFFFFFFFF0E,0xFFFFFFFF0D,0xFFFFFFFF0C,0xFFFFFFFF0A,0xFFFFFFFF09,0xFFFFFFFF08,0xFFFFFFFF07 ,0xFFFFFFFF06,0xFFFFFFFF05,0xFFFFFFFF04,0xFFFFFFFF04,0xFFFFFFFF03,0xFFFFFFFF02,0xFFFFFFFF02,0xFFFFFFFF01 ,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF00,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF01 ,0xFFFFFFFF01,0xFFFFFFFF01,0xFFFFFFFF02,0xFFFFFFFF02,0xFFFFFFFF03,0xFFFFFFFF04,0xFFFFFFFF04,0xFFFFFFFF05 ,0xFFFFFFFF06,0xFFFFFFFF07,0xFFFFFFFF08,0xFFFFFFFF09,0xFFFFFFFF0A,0xFFFFFFFF0C,0xFFFFFFFF0D,0xFFFFFFFF0E ,0xFFFFFFFF10,0xFFFFFFFF12,0xFFFFFFFF13,0xFFFFFFFF15,0xFFFFFFFF17,0xFFFFFFFF18,0xFFFFFFFF1A,0xFFFFFFFF1C ,0xFFFFFFFF1E,0xFFFFFFFF21,0xFFFFFFFF23,0xFFFFFFFF25,0xFFFFFFFF27,0xFFFFFFFF2A,0xFFFFFFFF2C,0xFFFFFFFF2F ,0xFFFFFFFF31,0xFFFFFFFF34,0xFFFFFFFF37,0xFFFFFFFF3A,0xFFFFFFFF3C,0xFFFFFFFF3F,0xFFFFFFFF42,0xFFFFFFFF45 ,0xFFFFFFFF48,0xFFFFFFFF4B,0xFFFFFFFF4F,0xFFFFFFFF52,0xFFFFFFFF55,0xFFFFFFFF59,0xFFFFFFFF5C,0xFFFFFFFF5F ,0xFFFFFFFF63,0xFFFFFFFF66,0xFFFFFFFF6A,0xFFFFFFFF6E,0xFFFFFFFF71,0xFFFFFFFF75,0xFFFFFFFF79,0xFFFFFFFF7D ,0xFFFFFFFF80,0xFFFFFFFF84,0xFFFFFFFF88,0xFFFFFFFF8C,0xFFFFFFFF90,0xFFFFFFFF94,0xFFFFFFFF98,0xFFFFFFFF9C ,0xFFFFFFFFA1,0xFFFFFFFFA5,0xFFFFFFFFA9,0xFFFFFFFFAD,0xFFFFFFFFB1,0xFFFFFFFFB6,0xFFFFFFFFBA,0xFFFFFFFFBE ,0xFFFFFFFFC3,0xFFFFFFFFC7,0xFFFFFFFFCB,0xFFFFFFFFD0,0xFFFFFFFFD4,0xFFFFFFFFD8,0xFFFFFFFFDD,0xFFFFFFFFE1 ,0xFFFFFFFFE6,0xFFFFFFFFEA,0xFFFFFFFFEF,0xFFFFFFFFF3,0xFFFFFFFFF8,0xFFFFFFFFFC,0x00000000,0x00000004 ,0x00000008,0x0000000D,0x00000011,0x00000016,0x0000001A,0x0000001F,0x00000023,0x00000028 ,0x0000002C,0x00000030,0x00000035,0x00000039,0x0000003D,0x00000042,0x00000046,0x0000004A ,0x0000004F,0x00000053,0x00000057,0x0000005B,0x0000005F,0x00000064,0x00000068,0x0000006C ,0x00000070,0x00000074,0x00000078,0x0000007C,0x00000080,0x00000083,0x00000087,0x0000008B ,0x0000008F,0x00000092,0x00000096,0x0000009A,0x0000009D,0x000000A1,0x000000A4,0x000000A7 ,0x000000AB,0x000000AE,0x000000B1,0x000000B5,0x000000B8,0x000000BB,0x000000BE,0x000000C1 ,0x000000C4,0x000000C6,0x000000C9,0x000000CC,0x000000CF,0x000000D1,0x000000D4,0x000000D6 ,0x000000D9,0x000000DB,0x000000DD,0x000000DF,0x000000E2,0x000000E4,0x000000E6,0x000000E8 ,0x000000E9,0x000000EB,0x000000ED,0x000000EE,0x000000F0,0x000000F2,0x000000F3,0x000000F4 ,0x000000F6,0x000000F7,0x000000F8,0x000000F9,0x000000FA,0x000000FB,0x000000FC,0x000000FC ,0x000000FD,0x000000FE,0x000000FE,0x000000FF,0x000000FF,0x000000FF,0x000000FF,0x000000FF}; //different pockets for the table, drawed in bytes flash unsigned char topLpocket1[19]={0x1f,0x10,0x10,0x10,0x10,0x11,0x12,0x12,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x12,0x12,0x11}; flash unsigned char topLpocket2[3]={0x1f,0x60,0x80}; flash unsigned char topLpocket3[4]={0xe0,0x18,0x04,0x03}; flash unsigned char bottomLpocket1[19]={0x11,0x12,0x12,0x12,0x14,0x14,0x14,0x14,0x14,0x14,0x12,0x12,0x11,0x10,0x10,0x10,0x10,0x10,0x1f}; flash unsigned char bottomLpocket2[4]={0x80,0x40,0x30,0x0f}; flash unsigned char bottomLpocket3[4]={0x03,0x04,0x18,0xe0}; flash unsigned char topCpocket1[4]={0x01,0x06,0x08,0xf8}; flash unsigned char topCpocket2[2]={0x7f,0x80}; flash unsigned char topCpocket3[4]={0xc0,0x30,0x08,0x0f}; flash unsigned char topRpocket1[4]={0x03,0x0c,0x10,0xe0}; flash unsigned char topRpocket2[2]={0xfc,0x03}; flash unsigned char topRpocket3[20]={0xfc,0x04,0x04,0x04,0x84,0x44,0x24,0x24,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x24,0x24,0x44,0x84}; //***************************************************** //LCD drivers referenced from http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2002/jq13/webpage/476monopoly.html void WriteData(unsigned char CommandCode); void WriteCommand(unsigned char CommandCode); void WriteString(char *input); void lcdinit(void); void clearLCD(void); void DrawXY(int x, int y,char draw); void MoveCursor(int addr); void drawLine(int x1, int y1, int x2, int y2,char draw); //***************************************************** // Ball functions specific to our game void drawHoleBall(char ballNo); void DrawTable(void); void drawScreen(void); void GameInit(void); //************************************************************* // LCD routines, from previous project Graphic Calculator //************************************************************* // WriteCommand() : Sends Command to LCD controller void WriteCommand(unsigned char CommandCode) { PORTD = CommandCode; PORTC = CmdSetup; PORTC = CmdWrite; PORTC = CmdSetup; } // end WriteCommand //************************************************************* // WriteData() : Sends parameters or data to LCD controller void WriteData(unsigned char CommandCode) { PORTD = CommandCode; PORTC = DataSetup; PORTC = DataWrite; PORTC = DataSetup; } // end WriteData //************************************************************* // Writestring(s) //write string whereever cursor was at void WriteString(char *input){ char i=0; WriteCommand(MWRITE); while (input[i]!=0) { WriteData(input[i]); i++; } } // end WriteString //************************************************************* // lcdinit() initializes LCD void lcdinit(void) { // set I/O port directions DDRD = 0xff; //set PORTD to outputs PORTC = LCDnop; //issues nothing to the LCD for about 6 ms. delay_ms(2); PORTC = LCDreset; delay_ms(2); PORTC = LCDnop; delay_ms(2); WriteCommand(SystemSet); //Set LCD system WriteData(0x30); WriteData(0x87); WriteData(0x07); WriteData(0x27); WriteData(0x2F); WriteData(0xC7); WriteData(0x28); WriteData(0x00); WriteCommand(Overlay); WriteData(0x00); WriteCommand(Scroll); WriteData(0x00); WriteData(0x00); WriteData(0xC8); WriteData(0xE8); WriteData(0x03); WriteData(0xC8); WriteCommand(CSRForm); WriteData(0x04); WriteData(0x86); WriteCommand(CSRRight); WriteCommand(HorzScroll); WriteData(0x00); WriteCommand(DispON); WriteData(0x16); clearLCD(); //completely clears LCD } // end lcdinit //************************************************************* // clearLCD() clears both layers of LCD void clearLCD(void) { unsigned short i; MoveCursor(0); //set cursor to the beginning of the character layer WriteCommand(MWRITE); for (i=0; i<1000; i++) { WriteData(0x20); // write " " to character memory } MoveCursor(1000); //set cursor to the beginning of the grpahics layer WriteCommand(MWRITE); for (i=0; i<8000; i++) { WriteData(0x00); // erase graphics memory } } // end clearLCD //************************************************************* // DrawXY(x,y) turn on pixel at (x,y) in graphic layer void DrawXY(int x,int y,char draw) { int address; address = 1000 + y*40 + (int)(x>>3); //graphics starting address is 1000 if(address<=1000) address=1000; //make sure it doesn't go into the character layer MoveCursor(address); //since each horizontal lines takes up 40 bytes, //we should add y*40 to the base address //then we add x/8 to the address to do the horizontal offset WriteCommand(MREAD); //Set LCD to be ready to be read DDRD = 0x00; //set PORTD to be inputs PORTD=0x00; //turn off all pull ups PORTC = DataRead; //send to LCD to do a data read delay_us(30); //wait some time for everything to set(if this delay is too short, flickering increases) pixelbuffer = PIND; //read in the old data PORTC = LCDnop; //signal the LCD to stop reading delay_us(10); //wait for LCD to stop and set PORTD back to outputs DDRD = 0xFF; if(draw==1) pixelbuffer |= (0x80>>(x%8)); //OR pixelbuffer with the byte you want to write, 0x80>>(x%8) is where we want to illuminate in that byte else pixelbuffer &= ~(0x80>>(x%8)); //AND with 0b01111111 shifted to erase old dot MoveCursor(address); //set the cursor back to where we were going to write to WriteCommand(MWRITE); WriteData(pixelbuffer); //write the pixel buffer which contained old and new pixel information } //************************************************************* // MoveCursor(addr) moves cursor to specified address void MoveCursor(int addr) { WriteCommand(CSRW); WriteData(addr); WriteData(addr>>8); } //************************************************************* // Graph a line on the LCD //Breshenham's algorithm void drawLine(int x1, int y1, int x2, int y2,char draw) begin int mn, md; int x_move, y_move; int x_position, y_position; int balance; md = x2 - x1; // Find md. if (md < 0) // If it is negative, begin md = -md; // Make md positive. x_move = -1; // Make x move in a negative direction. end else // else x_move = 1; // Make x move in a positive direction. mn = y2 - y1; // Find mn. if (mn < 0) // If it is negative, begin mn = -mn; // Make mn positive. y_move = -1; // Make y move in a negative direction. end else y_move = 1; // Make y move in a positive direction. x_position = x1; // Set the starting x position. y_position = y1; // Set the starting y position. if (mn < md) // If the x grows faster than y. balance = md; // Set the balance as positive md. else // Else balance = -(mn); // Set the balance as negative mn. mn = 2 * mn; // Double mn and md which is the equivalent md = 2 * md; // of halving balance. // While not at the last x and y position, go... while ((x_position != x2) || (y_position != y2)) { DrawXY(x_position, y_position,draw); // Draw the point. //printf("x=%d,y=%d",x_position, y_position); if (balance < 0) // If the balance leans toward x... { balance = balance + md; // Balance x with y. y_position = y_position + y_move; // Move y in the correct direction. } else // Putting this here insures x gets a chance to move each time. //if (balance >= 0) // If the balance leans toward y... { balance = balance - mn; // Balance y with x. x_position = x_position + x_move; // Move x in the correct direction. } } DrawXY(x_position, y_position,draw); // Draw the last point. end //************************************************************* // DrawTable() draws the entire table void DrawTable(void) begin unsigned char i; int address; // Draw Pool Table (Graphics) address = 1000+40*27+0; // draw vertical line for (i=0; i<113; i++) begin MoveCursor(address); //left1 side of the table WriteCommand(MWRITE); WriteData(0x10); MoveCursor(address+1); //left2 side of the table WriteCommand(MWRITE); WriteData(0x80); MoveCursor(address+36); //right side of the table WriteCommand(MWRITE); WriteData(0x84); address = address+40; end address = 1000+40*8+1; // draw outer horizontal line for (i=0; i<35; i++) begin MoveCursor(address); //top outer line WriteCommand(MWRITE); WriteData(0xff); MoveCursor(address+40*150); //bottom outer line WriteCommand(MWRITE); WriteData(0xff); address = address+1; end address = 1000+40*13+3; // draw inner left horizontal line for (i=0; i<15; i++) begin MoveCursor(address); //left top inner side of the table WriteCommand(MWRITE); WriteData(0xff); MoveCursor(address+40*140); //left bottom inner side of the table WriteCommand(MWRITE); WriteData(0xff); address = address+1; end address = 1000+40*13+20; // draw inner right horizontal line for (i=0; i<15; i++) begin MoveCursor(address); //right top inner side of the table WriteCommand(MWRITE); WriteData(0xff); MoveCursor(address+40*140); //right bottom inner side of the table WriteCommand(MWRITE); WriteData(0xff); address = address+1; end address=1000+40*8+0; //draw top left pocket batch1 for(i=0; i<19;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topLpocket1[i]); address = address+40; end address=1000+40*10+1; //draw top left pocket batch2 for(i=0; i<3;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topLpocket2[i]); address = address+40; end address=1000+40*10+2; //draw top left pocket batch3 for(i=0; i<4;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topLpocket3[i]); address = address+40; end address=1000+40*140+0; //draw bottom left pocket batch1 for(i=0; i<19;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(bottomLpocket1[i]); address = address+40; end address=1000+40*153+1; //draw bottom left pocket batch2 and 3 for(i=0; i<4;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(bottomLpocket2[i]); MoveCursor(address+1); WriteCommand(MWRITE); WriteData(bottomLpocket3[i]); address = address+40; end address=1000+40*9+18; //draw top center pocket batch2 for(i=0; i<2;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topCpocket2[i]); address = address+40; end address=1000+40*10+17; //draw top center pocket batch1 and 3 for(i=0; i<4;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topCpocket1[i]); MoveCursor(address+2); WriteCommand(MWRITE); WriteData(topCpocket3[i]); address = address+40; end address=1000+40*156+18; //draw bottom center pocket batch2 for(i=0; i<2;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topCpocket2[1-i]); //direct inverse, so write backwards address = address+40; end address=1000+40*153+17; //draw bottom center pocket batch1 and 3 for(i=0; i<4;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topCpocket1[3-i]); MoveCursor(address+2); WriteCommand(MWRITE); WriteData(topCpocket3[3-i]); address = address+40; end address=1000+40*10+34; //draw top right pocket batch1 for(i=0; i<4;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topRpocket1[i]); address = address+40; end address=1000+40*10+35; //draw top left pocket batch2 for(i=0; i<2;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topRpocket2[i]); address = address+40; end address=1000+40*8+36; //draw top left pocket batch3 for(i=0; i<20;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topRpocket3[i]); address = address+40; end address=1000+40*153+34; //draw top right pocket batch1 for(i=0; i<4;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topRpocket1[3-i]); address = address+40; end address=1000+40*154+35; //draw top left pocket batch2 for(i=0; i<2;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topRpocket2[1-i]); address = address+40; end address=1000+40*139+36; //draw top left pocket batch3 for(i=0; i<20;i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(topRpocket3[19-i]); address = address+40; end end //************************************************************* // drawBall() draw on side menu depending on player number void drawHoleBall(char ballNo) begin int address,i; if(ballNo<8) address=1000+(40*50)+38+(40*8*ballNo); else if(ballNo>8) address=1000+(40*50)+39+(40*8*(ballNo-8)); else //ballNo==8 address=1000+(40*45)+38; for (i=0; i<7; i++) begin MoveCursor(address); WriteCommand(MWRITE); WriteData(ball7x7[ballNo][i]); address = address+40; end //end for loop end //end function