⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Use optical mouse sensor from Logitech Mouse with an Atmel AVR controller Documentation in german
💻 C
字号:
/*! \file main.c \brief Optical Mouse Test Program 1 */
//###########################################################
///	\par Uebersicht
//###################################################################################
//
// Liest die Bilddaten aus einem Optical Mouse Sensor ADNS-2610
// und zeigt ein 18x18 Pixel Bild auf einem KS108 GLCD
//
//#########################################################################
// Last change: 14.02.2008
//#########################################################################
// hk@holger-klabunde.de
// http://www.holger-klabunde.de/index.html
//#########################################################################
// Compiler: AVR-GCC 4.1.1
//#########################################################################
//@{
#include <avr/io.h>
#include <avr/interrupt.h>

#include "printf.h"
#include "serial.h"
#include "softspi.h"
#include "ks108.h"

//###################################################################################
// Berechnet einen Threshold Wert zwischen Min und Max Value aller Pixel
// und gibt dann einen Wert 0=drunter, 1=dr黚er aus.
//###################################################################################
unsigned char GetPixelValue(unsigned char grey, unsigned char minpix, unsigned char maxpix)
{
 unsigned char threshold;
 
 threshold = (maxpix-minpix)/2 + minpix;

 if(grey>threshold) return 1;
 else return 0;
}

//###################################################################################
/* Hauptprogramm */
int main(void)
//###################################################################################
{
 unsigned char temp,squal,minpix,maxpix,xpos,ypos,grey;
 unsigned int framecounter;

 ser_init();
 soft_spi_init();
 DisplayOn();
 ClearScreen();
 
 sei();              //enable interrupts
 
 puts("Optical Mouse\n");

 ADNSWrite(ADNS_CONFIG, 0x80); // soft reset
 Delay1ms(200);

 ADNSWrite(ADNS_CONFIG, 0x01); // always awake, sch鰊 nacheinander senden !
 Delay1ms(200);

 temp = ADNSRead(ADNS_STATUS);
 Delay1ms(200);
 
 printf("Status: 0x%02X\n",(unsigned int)temp);
 
 for(;;) // loop forever
  {

/*
   temp = ADNSRead(ADNS_DELTA_Y);
   printf("DY: 0x%02X ",(unsigned int)temp);

   temp = ADNSRead(ADNS_DELTA_X);
   printf("DX: 0x%02X\n",(unsigned int)temp);
*/

/*
   squal = ADNSRead(ADNS_SQUAL);
   printf("SQUAL: % 3d ",(unsigned int)squal);
*/

   maxpix = ADNSRead(ADNS_MAX_PIXEL);
//   printf("MAXPIX: % 3d ",(unsigned int)maxpix);

   minpix = ADNSRead(ADNS_MIN_PIXEL);
//   printf("MINPIX: % 3d\n",(unsigned int)minpix);


   temp = ADNSRead(ADNS_PIXEL_DATA);
   if((temp & START_OF_FRAME) && (temp & VALID_DATA))
    {
     temp &= ~0xC0; // Del upper 2 Bits

     framecounter = 0;
     xpos=0; ypos=0;
     
     grey=GetPixelValue(temp,minpix,maxpix);
     SetPixel(xpos,ypos,grey);
     xpos++;
     framecounter++;
     
     do
      {
       temp = ADNSRead(ADNS_PIXEL_DATA);
       if(((temp & START_OF_FRAME) == 0) && (temp & VALID_DATA))
        {
         grey = temp & ~0xC0; // Del upper 2 Bits

         grey=GetPixelValue(grey,minpix,maxpix);
         SetPixel(xpos,ypos,grey);
         xpos++;
         framecounter++;
         
         if(xpos==18)
          {
           xpos=0;
           ypos++;
          }
        } 
      }while(framecounter<324);

    }

  }// Ende Endlosschleife
}

//@}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -