📄 keymax7219.c
字号:
/******************************************************
Project : key_max7219
Date : 2005-11-11
Author : Linbrid
Company : TianJin University
Chip type : ATmega16L
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>
#define no_key 0x00
#define key_max 0xFF
#define k1 1
#define k2 2
#define k3 3
#define k4 4
#define k5 5
#define k6 6
#define k7 7
#define k8 8
#define key_state_0 0 //按键初始状态
#define key_state_1 1 //按键确认状态
#define key_state_2 2 //按键释放状态
#define ADC_VREF_TYPE 0X40
char time_1ms,time_100ms,time_1s;
char sreg,pwm_temp1,pwm_temp2,pwm_temp3,pwm_temp4,freq_new,freq_old,key_disbuff;
char pwm_new1=0x89,pwm_new2=0x98,pwm_new3=0x98,pwm_new4=0x89;
char time_temp,N_temp,freq_temp,sys_temp;
int freq,pwm,pn_temp;
char data_temp1,data_temp2,data_temp3; //加1,减1计数缓冲器
bit time_1ms_ok,time_20ms_ok;
bit flag_time,flag_N,flag_freq,flag_sys,flag_option,flag_save;
bit flag_time_add;
bit flag_N_add;
bit flag_freq_add;
bit flag_add,flag_sub;
bit flag_time_sub;
bit flag_N_sub;
bit flag_freq_sub;
//char key_temp[8];
//写max7219函数
void led_write(unsigned char address,unsigned char data)
{
unsigned char i;
PORTB&=0XBF; //LOAD=0,PB6=0
delay_ms(1);
for(i=0;i<8;i++) //写地址
{
PORTB&=0X7F; //CLK=0,PB7=0
delay_ms(1);
if((address&0x80)==0x80)
{
PORTB|=0x20; //DIN=1,PB5=1
}
else
{
PORTB&=0XDF; //DIN=0,PB5=0
}
PORTB|=0X80; //CLK=1,PB7=1
address=address<<1;
delay_ms(1);
}
for(i=0;i<8;i++) //写数据
{
PORTB&=0X7F; //CLK=0,PB7=0
delay_ms(1);
if((data&0x80)==0x80)
{
PORTB|=0x20; //DIN=1,PB5=1
}
else
{
PORTB&=0XDF; //DIN=0,PB5=0
}
PORTB|=0X80; //CLK=1,PB7=1
data=data<<1;
delay_ms(1);
}
PORTB|=0X40; //LOAD=1,PB6=1
delay_ms(1);
}
//按键扫描函数
char key_read(void)
{
static char key_state,key_disbuff;
char key_input,i;
char key_return;
key_input=(PINC&key_max);
switch(key_state)
{
case key_state_0:
if(key_input!=key_max) key_state=key_state_1; //按键初始状态
break;
case key_state_1: //按键确认状态
if(key_input!=key_max)
{
key_state=key_state_2;
key_disbuff=1;
}
else key_state=key_state_0;
break;
case key_state_2: //按键释放状态
if(key_input==key_max) key_state=key_state_0;
break;
}
if(key_disbuff) //有键按下
{
for(i=0;i<8;i++)
if((key_input&(1<<i))==0) key_return=i+1;
else key_state=key_state_0;
}
return key_return;
}
void key_1(void) //k1
{
flag_sys=1;
++sys_temp;
if(flag_sys==1)
{
flag_save=0;
flag_option=0;
flag_time=0;
flag_N=0;
flag_freq=0; //系统启动,开始测频率
TIMSK=0x98;
//开启ADC转换
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xED;
}
else if(sys_temp==2)
{
TIMSK=0x00; //屏蔽任何定时器中断
#asm("cli"); //关系统中断
led_write(0x0c,0); //关显示器
sys_temp=0;
}
}
void key_2 (void) //k2
{
flag_save=1;
if(flag_time_add && flag_save) time_temp=data_temp1;
if(flag_N_add && flag_save) N_temp=data_temp2;
if(flag_freq_add && flag_save) freq_temp=data_temp3;
if(flag_time_sub && flag_save) time_temp=data_temp1;
if(flag_N_sub && flag_save) N_temp=data_temp2;
if(flag_freq_sub && flag_save) freq_temp=data_temp3;
}
void key_5(void) //k5
{
flag_option=1;
led_write(0x0c,1); //开显示器
}
void key_6(void)
{
unsigned char i;
flag_N=1;
flag_time=0;
flag_freq=0;
if(flag_option==1)
{
for(i=0;i<10;i++)
{
PORTB.1=~PORTB.1;
delay_ms(500);
}
}
}
void key_7(void)
{
unsigned char i;
flag_time=1;
flag_N=0;
flag_freq=0;
if(flag_option==1)
{
for(i=0;i<10;i++)
{
PORTB.2=~PORTB.2;
delay_ms(500);
}
}
}
void key_8(void)
{
unsigned char i;
flag_freq=1;
flag_time=0;
flag_N=0;
if(flag_option==1)
{
for(i=0;i<10;i++)
{
PORTA.7=~PORTA.7;
delay_ms(500);
}
}
}
void key_3(void) //k3
{
flag_time_add=flag_option & flag_time & flag_add;
flag_N_add=flag_option & flag_N & flag_add;
flag_freq_add=flag_option & flag_freq & flag_add;
if(flag_option==1 && flag_time==1)
{
if(++data_temp1>=20)
{
data_temp1=20;
}
//delay_ms(25);
led_write(0x07,data_temp1%10);
led_write(0x08,data_temp1/10);
}
if(flag_option==1 && flag_N==1)
{
if(++data_temp2>=20)
{
data_temp2=20;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -