C51 COMPILER V6.00 BUTTON 05/24/2000 16:52:50 PAGE 1 C51 COMPILER 6.00, COMPILATION OF MODULE BUTTON OBJECT MODULE PLACED IN .\button.OBJ COMPILER INVOKED BY: d:\keileval\C51\BIN\C51.EXE .\button.c OBJECTEXTEND DEBUG stmt level source 1 // Lab 2 part 1 2 // USE LEDREG.BIT 3 4 #include 5 #include 6 char xdata *ledaddress; 7 8 // constant 9 //unsigned long bits_32; 10 //unsigned int bits_16; 11 12 // send data 13 //unsigned long send1; 14 //unsigned int send2; 15 //int counter; 16 //int flag; 17 //int temp; 18 bit En; 19 bit Done; 20 //bit rise_edge; 21 int Diamond; 22 //sbit clk = P1 ^ 1; // pin 8 23 //sbit data_out = P1 ^ 2; // pin 9 24 //int i; 25 26 //Data before sign change 27 int PreXData; 28 int PreYData; 29 30 31 32 //Data to PS/2 33 char XData; 34 char YData; 35 char Sign; 36 37 //} 38 39 /* 40 void new_load(void) { 41 42 bit Yparity,Xparity; 43 unsigned long temp1 = 0; 44 Yparity = Xparity = 0; 45 /* 46 // put in one line doesn't work -- weird but true 47 Xparity = Ports0 ^ Ports1 ^ Ports2 ^ Ports3; 48 Xparity = Xparity ^ Ports4 ^ Ports5 ^ Ports6; 49 Xparity = ~(Xparity ^ Ports7); 50 51 // put in one line doesn't work -- weird but true 52 Yparity = Ports8 ^ Ports9 ^ Ports10 ^ Ports11; 53 Yparity = Yparity ^ Ports12 ^ Ports13 ^ Ports14; 54 Yparity = ~(Yparity ^ Ports15); 55 C51 COMPILER V6.00 BUTTON 05/24/2000 16:52:50 PAGE 2 56 57 temp1 = ((temp1 | Yparity) << 8) | P2; // take cares parity & y 58 temp1 = ((((temp1 << 3) | Xparity) << 8) | P0) << 12; // take cares parity & x 59 send1 = bits_32 | temp1; 60 send2 = bits_16; 61 62 */ 63 /* switch(flag) { 64 case 0: 65 send1 = 0x9AAD5410; // constant now 66 send2 = 0x0C01; // constant now 67 flag = 1; 68 break; 69 case 1: 70 send1 = 0x65B2B470; // complement of x or y if negative direction 71 send2 = 0x0C01; // constant now 72 flag = 0; 73 break; 74 } */ 75 //} 76 77 void init () { 78 1 /* 79 1 TMOD = 0x22; 80 1 TCON = 0x50; 81 1 TH0 = 169; 82 1 TH1 = 6; 83 1 data_out = 1; 84 1 rise_edge = 0; 85 1 clk = 1; 86 1 En = 1; 87 1 EA = 1; 88 1 counter = 0; 89 1 flag = 0; 90 1 i = 0; 91 1 temp = -1; 92 1 */ 93 1 94 1 Done = 1; 95 1 Sign = 0; 96 1 Diamond = 1; 97 1 En = 0; 98 1 99 1 100 1 } 101 102 char FindSign ( int X, int Y ) 103 { 104 1 105 1 char tempSign; 106 1 tempSign = 0; 107 1 108 1 if (X > 0 && Y > 0 ) // X > 0 and Y > 0 //abs(X) == X && abs(Y) == Y 109 1 { 110 2 tempSign = 1; // Quadrant 1 111 2 } 112 1 113 1 else if (X < 0 && Y > 0) // Quadrant 2 114 1 { 115 2 tempSign = 2; 116 2 } 117 1 C51 COMPILER V6.00 BUTTON 05/24/2000 16:52:50 PAGE 3 118 1 else if (X < 0 && Y < 0) // Quadrant 3 119 1 { 120 2 tempSign = 3; 121 2 } 122 1 123 1 else if (X > 0 && Y < 0) // Quadrant 4 124 1 { 125 2 tempSign = 4; 126 2 } 127 1 128 1 else // ERROR CONDITION!! 129 1 { 130 2 tempSign = 0; 131 2 } 132 1 133 1 return (tempSign); 134 1 135 1 } 136 137 void main() { 138 1 139 1 init(); 140 1 141 1 while (1) // All programs run forever 142 1 { 143 2 if (Done && !En) // I can put new data in the variables to send to the PS/2 port 144 2 { 145 3 switch(Diamond) 146 3 { 147 4 case 1: 148 4 Done = 0; // reset done 149 4 PreXData = 150; 150 4 PreYData = 150; 151 4 Diamond = 2; 152 4 break; 153 4 case 2: 154 4 Done = 0; // reset done 155 4 PreXData = 150; 156 4 PreYData = -150; 157 4 Diamond = 3; 158 4 break; 159 4 case 3: 160 4 Done = 0; // reset done 161 4 PreXData = -150; 162 4 PreYData = -150; 163 4 Diamond = 4; 164 4 break; 165 4 case 4: 166 4 Done = 0; // reset done 167 4 PreXData = -150; 168 4 PreYData = 150; 169 4 Diamond = 1; 170 4 break; 171 4 } 172 3 173 3 XData = abs(PreXData); 174 3 YData = abs(PreYData); 175 3 Sign = FindSign(PreXData, PreYData); 176 3 En = 1; // Set En high to let PS/2 port know that we have data in the variables 177 3 178 3 //*****TEMP FOR DEBUGGING PURPOSES ************** 179 3 Done = 1; C51 COMPILER V6.00 BUTTON 05/24/2000 16:52:50 PAGE 4 180 3 En = 0; 181 3 182 3 } 183 2 } 184 1 } 185 186 /* 187 while (1) { // all programs run foreve 188 if (En) { // if something to send 189 new_load(); 190 En = 0; // reset it 191 data_out = 0; // 1st bit - force to low to start transmitt data 192 send1 = send1 >> 1; 193 i++; 194 ET0 = 1; // make sure that the clock egde go down after data_out = first bit of sending data. 195 } 196 if (( i < 32) && rise_edge) { // 32 bit of data 197 data_out = send1 & 0x00000001; 198 rise_edge = 0; 199 send1 = send1 >> 1; 200 i++; 201 } 202 else if (( 31 < i) && (i < 43) && rise_edge) { // 12 bit of data - total is 44 bit of data 203 data_out = send2 & 0x00000001; 204 rise_edge = 0; 205 send2 = send2 >> 1; 206 i++; 207 } 208 else if ((temp == 0) && (i == 43)) { 209 ET0 = 0; 210 temp = -1; 211 data_out = 1; 212 rise_edge = 0; 213 i = 0; 214 clk = 1; 215 ET1 = 1; 216 } 217 218 } 219 */ 220 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 264 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 11 ---- IDATA SIZE = ---- ---- BIT SIZE = 2 ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)