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

📄 intkey._c

📁 protues_atmeg8学习之:中断篇源代码
💻 _C
字号:
/******************************************/
//文件名:IntKey.c
//功能: 中断触发键盘扫描的应用
//作者:  young
//时间: 2006.11.6
//目标MCU:ATmega8   
//晶振:  8MHZ
/******************************************/
#include <iom8v.h>
#include <macros.h>
#include "Delay.h"

unsigned char KeyDown;

//按键扫描函数,返回按键的值
unsigned char ScanKey(void)
{
    unsigned char temp,temp1,key;
    temp=PINC;
    temp&=0x38;
    switch(temp) //判断行中哪条线有低电平
    {
	case 0x30:  
        DDRC=0X38;
        PORTC=0X07;
	    delay_us(1);
        temp1=PINC;
		temp1&=0x07;
        switch(temp1) //判断列中哪条线有低电平
		{
		    case 0x06: key=0x01;  //得到键值
		        break;
		    case 0x05: key=0x04; 
		        break;
			case 0x03: key=0x07; 
		        break;							
			default:   key=0;
		        break;
		}
		DDRC=0X07;
		PORTC=0X38;
        break;
			   
    case 0x28:
	    DDRC=0X38;
        PORTC=0X07;
	    delay_us(1);
        temp1=PINC;
		temp1&=0x07;
		switch(temp1)
		{
	    case 0x06: key=0x02; 
		    break;
		case 0x05: key=0x05; 
		    break;
		case 0x03: key=0x08; 
		    break;
		default:   key=0;
		    break;
		}
		DDRC=0X07;
		PORTC=0X38;
        break;
		
    case 0x18:  
	    DDRC=0X38;
        PORTC=0X07;
	    delay_us(1);
        temp1=PINC;
		temp1&=0x07;
        switch(temp1)
		{
		case 0x06: key=0x03; 
            break;
	    case 0x05: key=0x06; 
		    break;
		case 0x03: key=0x09; 
		    break;
		default:   key=0;
		    break;
	    }
		DDRC=0X07;
		PORTC=0X38;
        break;
    default:
        key=0;
        break;   
    }
    return (key);
}

#pragma interrupt_handler int_fun:2
void int_fun(void)
{
    KeyDown=1;		//在中断中仅设置一个标志
}

//主函数,扫描按键显示数据
void main()
{
    unsigned char temp, keynum;
	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
	//初始化端口
	DDRB=0xFF;	  //设置B口为输出模式
	PORTB=0xFF;	  //置高电平	
    DDRC=0X07;
    PORTC=0X38; 
    DDRD&=0x0F;
	PORTD|=0xFC;
	
    MCUCR=0x03;   //INT0上升沿触发,INT1低电平有效
	GICR|=0x40;   //打开INT0中断
    GIFR=0xC0;    //清除INT0、INT1中断标志位
	
	KeyDown=0;    //初始化全局变量
	SEI();        //打开全局中断	
    while(1)
    { 
	   PORTB=0x40;
       if(KeyDown==1)        //检测是否有按键按下 
	   {
	       GIFR&=0xCF;       //关闭INT0中断
	       KeyDown=0;
	       delay_ms(5);		 
	       temp=PINC;
           temp&=0x38;
           if(temp==0x38)     //确认是否有按键按下
		   {
		       GICR|=0x40;   //打开INT0中断
	           continue;
		   }
           keynum=ScanKey();
           PORTB=num[keynum];
	       while(temp!=0x38) 
	       {
	          temp=PINC;
              temp&=0x38;
	       }		   	
		   GICR|=0x40;       //打开INT0中断
		   DDRC=0X07;
           PORTC=0X38; 
	   }
    }
}

⌨️ 快捷键说明

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