📄 keybord.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 + -