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

📄 display.c

📁 电子开发网培训用的51单片机内部培训代码
💻 C
字号:
//****************************************************
//实现功能:把键盘输入的键盘码,用led显示出来
//目标板:至强51开发板
//开发商  :电子开发网www.dzkf.com (专业提供开发方案,
//          电子元器件网上订购,单片机培训服务)
//对开发板有什么疑问,请上我们的论坛bbs.dzkf.com探讨
//****************************************************

#include <reg51.h>

#define p_key P1
#define led_date P0
#define choose_p P2
unsigned char change(unsigned char i);
unsigned int display_num=0;
//******************时间延迟函数**********************
//描  述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//出口参数:无
//设计人:ycj
//最后修改:时间(2006.4.26)  修改人(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.4.26)修改人(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.4.26)修改人(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.4.26)修改人(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);//转换失败
	}
 }
//*********************主函数*************************
//描    述:把键盘输入的键盘码,用led显示出来
//入口参数:无
//返回参数:无
//设计人:ycj
//最后修改:时间(2006.4.26)修改人(ycj)
//****************************************************
int main(void)
{unsigned char i;
while(1)
	{
	 i=read_key();//扫描键盘
	 if(i<16)
 	  display((unsigned int)i);//有效的键盘值
	 else
      display(0xffff);//数据无效
	}

}

⌨️ 快捷键说明

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