/////////////////////////////////////////////////////// //main.h////////////////////////////////////////////// ///////////////////////////////////////////////////// #include <16F886.h> #device ICD=TRUE #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz) #FUSES NOPUT //No Power Up Timer #FUSES BROWNOUT //Reset when brownout detected #FUSES BORV40 //Brownout reset at 4.0V #use delay(clock=20000000) #define data 59 #define clk 60 void initmouse(); void write(unsigned char adr, unsigned char daten); void writeByte(unsigned char daten); int32 read(); unsigned char readByte(unsigned char adr); unsigned char parity(unsigned char par); unsigned /////////////////////////////////////////////////////// //main.c////////////////////////////////////////////// ///////////////////////////////////////////////////// #include "main.h" int cnt=0; unsigned char ino,ytest; signed char x,y; int posx=0,posy=0; void main() { setup_adc_ports(NO_ANALOGS|VSS_VDD); setup_adc(ADC_OFF); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard //Setup_Oscillator parameter not selected from Intr Oscillator Config tab //GRUEN=DATA //BLAU=CLOCK initmouse(); while(1){ posx+=make8(read(),1); posy+=make8(read(),2); } } void initmouse(void){ writeByte(0x80); writeByte(0x01); // kein Sleep modus } void writeByte(unsigned char daten){ signed char i; SET_TRIS_C(0X00); //Port C als Output OUTPUT_LOW(clk); //Clock für 120us auf low delay_us(120); OUTPUT_LOW(data); //Data auf low SET_TRIS_C(0x08); //Clock als input for (i=7; i>=0; i--){ //senden der Datenbits while(INPUT(clk)==1){} //Warten bis Clock low wird delay_us(20); if(daten&(1<Mause kann Daten senden delay_us(60); SET_TRIS_C(0xFF); //Clock und Data als Input Definieren while (INPUT(clk)==0){} sb=INPUT(data); while (INPUT(clk)==1){} //empfangen des Startbits if (sb==0){ // wenn das Startbit empfangen wurde Daten empfangen ansonsten 0x00 zurückgeben for (i=7; i>-1; i--){ while (0==INPUT(clk)){} // SCK =0 Sensor bereitet Daten auf fallender Flanke vor ! delay_us(20); //Sensor kurz Zeit lassen if(INPUT(data)==1){ //BIT einlesen daten |= (1<>z)&0x01; w+=p; } p=w%2; // wenn w durch 2 teilbar ist wird eine 1 zurückgegeben sonst eine 0 if (p==0)return 1; else return 0; } unsigned char mirror(unsigned char lsb){ // Spiegelt ein Byte mit LSB vorran in ein Byte mit MSB vorran char out = 0, i; for(i=0;i<8;i++) { out >>= 1; out |= (lsb & 0x80); lsb <<= 1; } return out; }