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

📄 sign7.c

📁 国外大学生毕业设计
💻 C
📖 第 1 页 / 共 2 页
字号:
//  A to D test code
// NOTE -- You MUST MOUNT the Aref jumper  

#include <Mega32.h>
#include <stdio.h>  
#include <stdlib.h>
#include <delay.h>
#include <math.h>
#define LCDwidth 16 //characters
#define t1 10 //  
#define t2 1000
#define t3 10
#define t4 1000  //runs every second (1000ms)

//I like these definitions
#define begin {
#define end   }
#define NOTFOUND -1
#define RANGE 5 //accepted finger position interval

//State machine state names
#define NoPush 1 
#define MaybePush 2
#define Pushed 3
#define MaybeNoPush 4
#define LEARN 1 
#define TEACH 0
#define let_a 97
#define let_z 122
#define let_A 65
#define let_Z 90
#define sensitivity 3

#asm
    .equ __lcd_port=0x15
#endasm
#include <lcd.h> // LCD driver routines

char lcd_buffer[17], time1;    // LCD display buffer   

typedef enum hand {thumb, index, middle, ring, pinky} finger;
typedef enum boolean {FALSE, TRUE} bool;
typedef enum alphabet {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z, NONE} letter;
const char letters[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','--'};
char mode, dir[5]={'+','+','+','+','+'};
int percent[5]={0,0,0,0,0};   
int index_set[26], N=0;

//function declarations 
int match(int pos[]);
void task1(void);  		//test for button press
void task2(void);		//increment note to be played   
void task3(void);       //button debouncer 
void task4(void);       //delay 3seconds
void gets_int(void);	//starts getting a string from serial line
void puts_int(void);	//starts a send to serial line
void set_values(letter l, int arr[]);
void calc_percent(int my_letter, int pos[5]);
void plusminus(void);

//variable declarations
eeprom int alpha[26][5];
char Ain, PushFlag, PushState, let='-'; 		//raw A to D number
int index_found=1, my_index=-1;
          
unsigned int time2, time3, time4=0;	//task scheduling timeout counters
unsigned long time;
unsigned int v;
	
//RXC ISR variables								
unsigned char r_index;  //current string index
unsigned char r_buffer[16];	//input string 
unsigned char r_ready;  //flag for receive done
unsigned char r_char;  //current character  

//TX empth ISR variables								
unsigned char t_index;  //current string index
unsigned char t_buffer[16];	//output string 
unsigned char t_ready;  //flag for transmit done
unsigned char t_char;  //current character     
    
//**********************************************************
//timer 0 overflow ISR
interrupt [TIM0_COMP] void timer0_overflow(void)
begin   
   time++;
  //Decrement the three times if they are not already zero
  if (time1>0)	--time1;
  if (time2>0) 	--time2;
  if (time3>0)  --time3;
  if (time4>0)  --time4;
end  

//**********************************************************
//UART character-ready ISR
interrupt [USART_RXC] void uart_rec(void)
begin
	r_char=UDR;    //get a char
	UDR=r_char;    //then print it
	//build the input string
	if (r_char != '\r') r_buffer[r_index++]=r_char;
	else
	begin
		putchar('\n');  			//use putchar to avoid overwrite
		r_buffer[r_index]=0x00;    	//zero terminate
		r_ready=1;				   	//signal cmd processor
		UCSRB.7=0;   				//stop rec ISR
	end
end

/**********************************************************/
//UART xmit-empty ISR
interrupt [USART_DRE] void uart_send(void)
begin
	t_char = t_buffer[++t_index];
	if (t_char == 0) 	
	begin
		UCSRB.5=0; //kill isr 
		t_ready=1; //transmit done 
	end
	else	UDR = t_char ;     //send the char 
end
/**********************************************************/ 

  
//**********************************************************          
//Task 1   input a string and print it
void task1(void) 
begin
  
  char i,j, k=0;   
  int pos[6][5];
  int sumpos[5];    
  int avgpos[5];
  int pos1[5]; 
  char flag; 
  int diff=0;
  int per1, per2, per3, per4, per5;
  int move[7] = {0,0,0,0,0,0,0};
  
  int my_letter; 
  time1=t1;  				//reset the task timer 
  //print ad get another serial string     
  
  if (r_ready && ~PIND.7)
  begin
    mode = TEACH;
    sscanf(r_buffer,"%d",&v);
    gets_int();     
    
    let = r_buffer[0]; 
    lcd_gotoxy(0,3); 	    //position to upper left on display 
    //convert to upper case 
    if (let>=let_a && let<=let_z) let = let -32;
    else if (let>=let_A && let<=let_Z);
    else 
    begin
        lcd_gotoxy(0,3); 	    //position to upper left on display
        lcd_putsf("INVALID LETTER"); 	//string from flash
        printf("invalid\n\r");
        return; //exit if invalid
    end  
    
    printf("letter %c\n\r", let);

    lcd_clear();
    lcd_gotoxy(4,0);     //position to upper left on display
    sprintf(lcd_buffer,"PROGRAM %c", let); 
    lcd_puts(lcd_buffer);
    lcd_gotoxy(0,2);     //position to upper left on display
    lcd_putsf("SET HANDPOSITION"); //string from flash
        
    printf("Set up your hand position...\n\r");  
    printf("You have 3 seconds to prepare your hand...\n\r");            
    task4(); //delay 1 seconds
    task4(); //delay 1 seconds
    task4(); //delay 1 seconds
    
    printf("Begin calibrating...\n\r");         
    //parse ADC0-ACD4        
    for (j=0; j < 6; j++) begin
        for (i=0;i<5;i++)begin
	       ADMUX=0x60+i;
	       Ain = ADCH;  //get the sample  
 	       ADCSR.6=1;   //start another conversion
           while(ADCSR.6==1);
           pos[j][i]=Ain;   
        end
        task4();
    end                               
    printf("End Calibrating...\n\r");
    lcd_gotoxy(6,3);     //position to upper left on display
    lcd_putsf("DONE!"); //string from flash
          
    for (i = 0; i < 6; i++)
    begin
        sumpos[i] = 0;
    end            
    for (i = 1; i < 6; i++) begin
        sumpos[0] = sumpos[0] + pos[i][0]; 
        //printf("Average pos: %d  Thumb Pos: %d", sumpos[0], pos[i][0]);
        sumpos[1] = sumpos[1] + pos[i][1];
        sumpos[2] = sumpos[2] + pos[i][2];
        sumpos[3] = sumpos[3] + pos[i][3];
        sumpos[4] = sumpos[4] + pos[i][4];
    end     
    for (i = 0; i < 5; i++)begin
        avgpos[i] = floor(sumpos[i]/5);  
        //printf("Average pos T: %d", avgpos[0]);
    end        
 
/*    printf("Av T: %d\n\r",avgpos[0]);
    printf("Av I: %d\n\r",avgpos[1]); 
    printf("Av M: %d\n\r",avgpos[2]); 
    printf("Av R: %d\n\r",avgpos[3]); 
    printf("Av P: %d\n\r",avgpos[4]);  
 */   
    set_values(let-65,avgpos);
    printf("learned %c\n\r", letters[let-65]);    
    
    
  end //if (r_ready && PIND.7) 

  else if (PIND.7)  
  begin
    mode = LEARN;  
      
    
            
        //pick a random letter to test user
        //generate number between 0 and 25  
        //MAKE SURE TEACH before LEARN  

       if (index_found == 1 && N!=0)
       begin          
            if (N > 25)
            begin
                my_index = index_set[rand()/(int)(((unsigned)RAND_MAX + 1) / 26)]; 
                index_found=0;
            end
            else
            begin
                my_index = index_set[rand()/(int)(((unsigned)RAND_MAX + 1) / N)]; 
                index_found=0;
                //printf("index is %d\n\r", my_index); 
            end
        end   
        if ((~PIND.7) || (N==0)) 
        begin
                  my_index=26;
         end     

         //parse ADC0-ACD4
         for (j=0;j<7;j++)
         begin
            for (i=0;i<7;i++)
            begin    
         
        	    ADMUX=0x60+i;
        	    Ain = ADCH;  //get the sample  
         	    ADCSR.6=1;   //start another conversion
         	    while(ADCSR.6==1); 
                if (i > 0 && i < 5) begin  
                    pos1[i]=(int)Ain;
                end
                else if (i == 5) begin
                    pos1[0] = (int)Ain;
                end
                else if (i == 6) begin
                    //movement = Ain; 
                    move[k++] = (int)Ain;
                end
            end
        end
            diff =  abs(move[4]-move[0]);
                         
            my_letter = match(pos1);  
            calc_percent(my_index, pos1); 
          
            plusminus();
              
            lcd_gotoxy(0,0);                            //added!!
            lcd_putsf("                ");
            
            lcd_gotoxy(5,0); 	    //position to upper left on display    
            sprintf(lcd_buffer,"TRY %c       ", letters[my_index]); 
            lcd_puts(lcd_buffer); 

             
           if (my_letter != NOTFOUND)       
           begin 
            lcd_gotoxy(2,1); 	    //position to upper left on display
            sprintf(lcd_buffer,"%cT %cI %cM %cR %cP",dir[0],dir[1],dir[2],dir[3],dir[4]); 
            lcd_puts(lcd_buffer);  
            lcd_gotoxy(0,2); 	    //position to upper left on display 
            lcd_putsf("%:              "); 	//string from flash    
            lcd_gotoxy(0,3); 	    //position to upper left on display 
            lcd_putsf("                "); 	//string from flash                        
             
                     
            
                //display matching letter 
                if (my_letter == my_index)
                begin
                
                    //convert to percentage
                    lcd_gotoxy(2,1); 	    //position to upper left on display
                    //change to --
                    sprintf(lcd_buffer,"%cT %cI %cM %cR %cP",dir[0],dir[1],dir[2],dir[3],dir[4]); 
                    lcd_puts(lcd_buffer);  
                    lcd_gotoxy(2,2); 	    //position to upper left on display 
                    per1=abs(percent[0]);
                    per2=abs(percent[1]);
                    per3=abs(percent[2]);

⌨️ 快捷键说明

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