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

📄 keybord.c~

📁 使用AVR单片机对模拟信号进行采集,分析频率响应特性,使用AD9850芯片.
💻 C~
字号:
/*********************************************
File name : demo_9_3.c
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/

#include <mega16.h>
#include <delay.h>
#include <stdlib.h> 
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 9
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
bit trans_over=0;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   if (data=='o') 
   {
     rx_wr_index=0;
     rx_counter=0;
   }
   rx_buffer[rx_wr_index]=data;
   if (rx_counter==1) trans_over=1;  
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

#define byte unsigned char
int freq_time_counter;
bit freq_time_ok,begin_scan,set_num;
byte freq_from[8],freq_to[8],freq_step[6],freq_point[8],i;
long int freq_from_num=1000,freq_to_num=10000,freq_step_num=1000,freq_point_num=10000;
long int freq_num;
int test_result_a[129]={0},test_result_p[128]={0};
byte result_num;
eeprom byte store_result[128];

void set_dds(long int freq);
void display_result();
void scan_frequens();

#include "head_12864.h"
#include "head_keyboard.h"
#include "head_menu.h"
#include "picture.h" 


interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
if (++key_stime_counter >=5)
{
key_stime_counter = 0;
key_stime_ok = 1; // 10ms 到
}
if (++freq_time_counter >=500)
{
  freq_time_counter=0;
  freq_time_ok=1;
}
}


void main(void)
{

KB_PORT = 0xFF; // 键盘接口初始化
KB_DDR = 0xF0; // PD2、PD1、PD0列线,输入方式,上拉有效
SFIOR =0x00;

lcd_init(16);
lcd_clear(); // clere the LCD

/*for (i=0;i<=50;i++)
{
  lcd_gotoxy_pic(0,50-i);
  disp_picture(picture);
  //delay_ms(1);
}//从下往上滚动 */

//disp_picture_disappear(picture);
lcd_clear(); // clere the LCD

last_key=0;
menu_state[0]=0;
set_menu();

// T/C0 初始化
TCCR0=0x0B; // 内部时钟,64 分频(4M/64=62.5KHz),CTC 模式
TCNT0=0x00;
OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02; // 允许T/C0 比较匹配中断

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, Odd Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0xB6;
UBRRH=0x00;
UBRRL=0x19;

#asm("SEI") // 开放全局中断

while (1)
{           
	//set_dds();
	if (key_stime_ok==1)
	{
	      key_stime_ok = 0; // 10ms 到
	      key_temp = read_keyboard(); // 调用键盘接口函数读键盘
	        
      
	        
	        
	        if ((menu_state[0]==1) & (menu_state[1]==11))
	              set_freq_from();
	        if ((menu_state[0]==1) & (menu_state[1]==12))
	              set_freq_to();
	        if ((menu_state[0]==1) & (menu_state[1]==13))
	              set_freq_step();
	        if ((menu_state[0]==2) & (menu_state[1]==21))
	              set_freq_point();
	        if ((menu_state[0]==2) & (menu_state[1]==22))
	        {
	          freq_point_num=0;
	          for (i=0;i<8;i++) freq_point_num=(freq_point_num*10+freq_point[i]);
	          set_dds(freq_point_num);
	          menu_state[1]=20;
	        }  
	              
	        if ((menu_state[0]==1) & (menu_state[1]==14)) 
     	           scan_frequens();
     	                     
	          
     	        if ((!set_num)&(!begin_scan)&(key_temp >=1)&(key_temp <=9))
     		{
     		   lcd_clear_pic();
     		   select_menu(0,(key_temp-1)*8,16,8);
     		   set_menu();
     		   
     		   if (menu_state[1]==22 & menu_state[0]==2)
     		    {
     		      lcd_gotoxy(0,6);
     		      lcd_putsf("The result is:");
     		    }  	        
     	        } 
     	            
	        if (key_temp!=No_key)
	        {
	          last_key=key_temp;
	          
	        }	  
	}//	end of [if (key_stime_ok==1)]
	
};

}


void set_dds(long int freq)
{
#asm("CLI")
freq=freq*34.359738368;
DDRC=0xff;
DDRD|=0b01110000;

PORTD.4=1;PORTD.4=0;
PORTD.5=0;PORTD.5=1;

PORTC=0x00;PORTD.6=1;PORTD.6=0;
PORTC=freq/0x1000000;PORTD.6=1;PORTD.6=0;
PORTC=freq/0x10000;PORTD.6=1;PORTD.6=0;
PORTD.5=0;
PORTC=freq/0x100;
PORTD.6=1;PORTD.6=0;
PORTC=freq;PORTD.6=1;PORTD.6=0;

PORTD.5=1;PORTD.5=0;
#asm("SEI")

}

void scan_frequens()
{
		if (menu_state[2]!=141)
     	             {
     	                begin_scan=1;
     	                lcd_gotoxy(0,3); lcd_putsf("4.Stop Sweep.   ");
     	                lcd_gotoxy(0,4); lcd_putsf("       ");
     	                freq_from_num=0; for (i=0;i<8;i++) freq_from_num=(freq_from_num*10+freq_from[i]);
     	                freq_to_num=0;   for (i=0;i<8;i++) freq_to_num=(freq_to_num*10+freq_to[i]);
	                freq_step_num=0; for (i=0;i<6;i++) freq_step_num=(freq_step_num*10+freq_step[i]);
	                result_num=0;
	                for (freq_num=freq_from_num;freq_num<=freq_to_num;freq_num+=freq_step_num)
	                  {
     	           		key_temp = read_keyboard(); // 调用键盘接口函数读键盘n
     	           		if (key_temp==4) break;
     	           		result_num++;
     	           		set_dds(freq_num);
     		           	delay_ms(100);putchar('B');
           		           	delay_ms(100);
           		           	lcd_gotoxy(0,5);lcd_putsf("Testing:");  lcd_gotoxy(8,5);lcd_putnum(freq_num,8);
           		           	lcd_gotoxy(0,6);lcd_putsf("A:");
    	          	            lcd_putchar(rx_buffer[1]+0x30);lcd_putchar('.');
     		           	lcd_putchar(rx_buffer[2]+0x30);
     		           	lcd_putchar(rx_buffer[3]+0x30);
     		           	lcd_putchar(rx_buffer[4]+0x30);
     		           	
     		           	test_result_a[result_num]=rx_buffer[1]*10+rx_buffer[2]*1+rx_buffer[3]*0.1+rx_buffer[4]*0.01;
     		           	test_result_p[result_num]=(rx_buffer[5]*10+rx_buffer[6]*1+rx_buffer[7]*0.1+rx_buffer[8]*0.01);
     		           	lcd_gotoxy(8,6);lcd_putsf("P:");
     		           	if (test_result_p[result_num]>=32)
     		           	{
     		           	  test_result_p[result_num]-=32;
     		           	}  
     		           	if (test_result_p[result_num]>16)
     		           	{
     		           	 lcd_putchar('+');	lcd_putnum((test_result_p[result_num]-16)*180/16,3);
     		           	}
     		           	if (test_result_p[result_num]<=16)
     		           	{
     		           	 lcd_putchar('-');	lcd_putnum(test_result_p[result_num]*180/16,3);
     		           	}
     		           	//lcd_putchar(rx_buffer[5]+0x30);//lcd_putchar(0x60);
     		           	//lcd_putchar(rx_buffer[6]+0x30);
     		           	//lcd_putchar(rx_buffer[7]+0x30);
     		           	//lcd_putchar(rx_buffer[8]+0x30);
     		               		           	
     	                   }
     	                 lcd_clear();
     	                 menu_state[2]=141;
     	              }
     	              
     	              if (menu_state[2]==141)
     	              {
     	                 display_result();
     	                 lcd_gotoxy(0,0);lcd_putsf("1.Store.");
     	                 lcd_gotoxy(0,1);lcd_putsf("2.To oscillo.");
     	                 lcd_gotoxy(0,2);lcd_putsf("3.Back.");
     	                 if (key_temp==K1_1)
     	                 {
     	                   select_menu(0,(key_temp-1)*8,16,8);
     	                   no_select_menu(0,(key_temp-1)*8,16,8);
     	                   #asm("CLI")
     	                   store_result[0]=result_num;
     	                   for (i=1;i<=result_num;i++)
     	                   {
     	                     store_result[i]=test_result_a[i];
     	                   }
     	                   #asm("SEI")
     	                 }
     	                   	  
     	                 if (key_temp==K1_3)
     	                 {
     	                   select_menu(0,(key_temp-1)*8,16,8);
     	                   key_temp=No_key;
     	                   show_menu();
     	                   begin_scan=0;
     	                   menu_state[2]=140;
     	                   menu_state[1]=10;
     	                 }
     	              }  
     	           
}


void display_result()
{
    int temp;
  #asm("CLI")

  for (i=24;i<64;i++)
  {
    lcd_putpoint(64,i);
  }  
  lcd_gotoxy(4,7);lcd_putchar('A');
  lcd_gotoxy(12,7);lcd_putchar('P');
  for (i=0;i<64;i++)
  {
    temp=(int)(i+1)*(int)result_num/64;
    lcd_putpoint(i,50-test_result_a[temp]);
    if (test_result_p[i]>16) lcd_putpoint(i+64,test_result_p[temp]-2);
    if (test_result_p[i]<=16) lcd_putpoint(i+64,test_result_p[temp]+30);
  }
  #asm("SEI")
} 

⌨️ 快捷键说明

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