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

📄 interrupt.c

📁 电子开发网培训用的51单片机内部培训代码
💻 C
字号:
//****************************************************
//实现功能:把键盘的输入码型在七段数码管上显示出来
//目标板  :至强51开发板
//开发商  :电子开发网www.dzkf.com (专业提供开发方案,
//          电子元器件网上订购,单片机培训服务)
//对开发板有什么疑问,请上我们的论坛bbs.dzkf.com探讨
//****************************************************
#include <reg51.h>
//*****************宏定义*****************************
#define p_key P1//宏定义键盘接口是P1
#define extint_num 2//int1
#define reg_group 0//中断使用的是第0组寄存器
#define led_date P0//定义数码管的数据输出是P0
#define choose_p P2//定义数码管的位选信号输出是P2
//*****************全局变量***************************
unsigned int display_num;//数码管要显示的数据,定义为全局变量
unsigned char key_int=0;//中断键盘子程序扫描到的键值
//******************定义子函数************************
unsigned char change(unsigned char i);//数码管显示码转换子程序
void display(unsigned int num);//数码管显示子程序
void delay_time(int i);//时间延时子程序
unsigned char read_key(void);//键盘读键值子程序
void extint_init(unsigned char int_num,unsigned char mode);//外部中断初始化子程序

//*********************主函数*************************
//描    述:把键盘输入的键盘码,用led显示出来
//入口参数:无
//返回参数:无
//设计人:ycj
//最后修改:时间(2006.5.1)修改人(ycj)
//****************************************************
int main(void)
{
 extint_init(1,0);//外部中断1,方式0
 EA=1;			  //开中断
 while(1)
{
 display((unsigned int)key_int);    //显示
}
}
//**************************外部中断初始化函数*************************
//描    述:对外部中断初始化
//入口参数:unsigned char int_num(外部中断口,0=外部中断0,1=外部中断1)
//         ,unsigned char mode(中断触发方式,0=低电平触发,1=边沿触发)
//返回参数:无
//设计人:ycj
//最后修改:时间(2006.5.1)修改人(ycj)
//*********************************************************************
void extint_init(unsigned char int_num,unsigned char mode)
{
 if (int_num==0)
     {
      TCON&=~3;//清int0的IE0,IT0
      TCON|=mode;//设定中断触发的模式
	  EX0=1;
     }
 else if (int_num==1)
     {
	  TCON&=~12;//清int1的IE1,IT1
      TCON|=(mode<<3);//设定中断触发的模式
	  EX1=1;
	 }
}


//******************时间延迟函数**********************
//描  述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//出口参数:无
//设计人:ycj
//最后修改:时间(2006.5.1)  修改人(ycj)
//****************************************************
void delay_time(int i)
{
 while(i)
  i--;
}

//******************按键扫描函数**********************
//描    述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
//	        键盘占用一组完整的i/o口,在使用这个程序前
//	        要宏定义p_key为用户实际连接键盘的i/o口 
//	        #define p_key Pn;//(n=0、1、2、3)
//入口参数:无
//返回参数:若有检测到按键就返回按键的编号,否则返回0xff
//设计人:ycj
//最后修改:时间(2006.5.1)修改人(ycj)
//****************************************************
unsigned char read_key(void)
{
 unsigned char j,key,key_buf=0;
 p_key=0xff;
 //检测是否有建按下//
 p_key=0xf0;
 key=p_key;
 if(key==0xf0)
    {
	 return(0xff);//没按键按下,返回0xff
	}
 //有按下,延时去抖//
 delay_time(5000);
 //确认是否有建按下//
 p_key=0xf0;
 key=p_key;
 if(key==0xf0)
    {
	 return(0xff);//没按键按下,返回0xff
	}
 //真的有按键按下,扫描是哪一行有按键按下//
 for(j=0;j<4;j++)
 {key=p_key&(0x10<<j);
  if (key)
     {
	  key=p_key;
	 }
  else
     {
	  key_buf=j*4;
	  p_key=~(0x10<<j);//第j行的按键按下了,第j行输出0,其他的i/o口输出1
	  //扫描是第j行的哪个按键按下//
	  for(j=0;j<4;j++)
	  	{
		 key=p_key&(1<<j);
         if (key)
     		{
	  		 key=p_key;
	 		}
  		 else
     		{
			 key_buf+=j;
			 return(key_buf);//扫描到按键的确定位置,返回按键的编号
			}
		}
	 }
 }
//没扫描到按键,//
return(0xff);
}
//***************七段数码管显示函数*******************
//描    述:对四位的扫描型七段数码管进行扫描显示,在使用
//          前要定义一个全局变量display_num
//          unsigned int display_num;
//入口参数:unsigned int num,要显示的数字(0-9999)
//返回参数:无
//设计人:ycj
//最后修改:时间(2006.5.1)修改人(ycj)
//****************************************************
void display(unsigned int num)
{
 if(num<10000)
 	{
	 display_num=num;
    }
	 choose_p|=3;//先关显示
	 led_date=change(display_num/1000);//得到千位的数字,并转换成七段码型
	 choose_p&=0xfe;//选通千位
	 delay_time(50);//延时一段时间
     choose_p|=1;//关显示
     display_num=display_num%1000;
     led_date=change(display_num/100);//得到百位的数字,并转换成七段码型
	 choose_p&=0xfd;//选通百位
	 delay_time(50);//延时一段时间
	 choose_p|=2;//关显示
	 display_num=display_num%100;
     led_date=change(display_num/10);//得到十位的数字,并转换成七段码型
	 choose_p&=0xfb;//选通十位
	 delay_time(50);//延时一段时间
	 choose_p|=4;//关显示
	 led_date=change(display_num%10);//得到个位的数字,并转换成七段码型
	 choose_p&=0xf7;//选通十位
	 delay_time(50);//延时一段时间
	 choose_p|=8;//关显示
}
//****************数字-码型转换函数*******************
//描    述:把数字转换成七段码型,此程序仅配合共阳的七
//          段数码管使用
//入口参数:unsigned char i,要转换的数字(0-9),
//返回参数:转换后的七段码型,0xff表示转换失败
//设计人:ycj
//最后修改:时间(2006.5.1)修改人(ycj)
//****************************************************

unsigned char change(unsigned char i)
 {
  switch(i)
  	{
	 case 0:
	       return(0xc0);//0的七段码型
	 case 1:
	       return(0xf9);//1的七段码型
	 case 2:
	       return(0xa4);//2的七段码型
	 case 3:
	       return(0xb0);//3的七段码型
	 case 4:
	       return(0x99);//4的七段码型
	 case 5:
	       return(0x92);//5的七段码型
	 case 6:
	       return(0x82);//6的七段码型
	 case 7:
	       return(0xf8);//7的七段码型
	 case 8:
	       return(0x80);//8的七段码型
	 case 9:
	       return(0x90);//9的七段码型
     default:
	       return(0xff);//转换失败
	}
 }
//****************外部中断1处理函数*******************
//描    述:外部中断1处理子程序
//入口参数:无
//返回参数:无
//注意:无
//设计人:ycj
//最后修改:时间(2006.5.1)修改人(ycj)
//****************************************************
void int1_isr()  interrupt extint_num using reg_group
{unsigned char i;
i=read_key();
if(i<16)
key_int=i;
//等待中断0的输入脚恢复到高电平
while(1)
if (P3&8)
   break;
}

⌨️ 快捷键说明

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