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

📄 keymax7219.c

📁 MAX7219AVR单片机的驱动 编译环境CAVR 用于MAX7219串行驱动8位数码管
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************
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 + -