按键+数码管

发布时间:2024年01月21日

key.c

#include "key.h"	 //把led.h文件包含进来
#include "system.h"	   //把timer0.h文件包含进来
#include "smg.h"

extern  uint num;
char key_value;  //有按键按下
char key_shourtflag;//没有按键按下


uint KeyScan ()		//按键扫描函数
{
	static	uint timer=0;
  char key_temp=0;
	if(k1==0)
	{
		key_temp|=0x01;
	}
  if(k2==0)
	{
		key_temp|=0x02;
	}
	if(k3==0)
	{
		key_temp|=0x04;
	}
  if(k4==0)
	{
	  key_temp|=0x08;
	}
   if(key_temp!=0)
	{
	   timer++;	  
	   if(timer==20){key_value=key_temp;key_shourtflag=1;} 		 
	   else if(timer==1000){timer=500;key_value=key_temp;key_shourtflag=1;} //否则长按不停加1   
	  }
	

	else
	{
    key_shourtflag=0;
		timer=0;	   //定时清0
	}

}


void KEY_SHEZHI()  //按键设置
{ 	   
  if(key_shourtflag==0)   //没有按键按下直接退出,不执行以下内容
  {
     return;
  }
 
  switch(key_value)	 
	{
		case(0):break;
		case(0x01):
			num++;break;
		case(0x02):
			num++; break;
		case(0x04):
			num--;break;
    case(0x08):
			num--;break;
    case(0x03):    //双按键
			num=6666;break;
    case(0x5):     //双按键
			num=7777;break; 
    case(0x9):     //双按键
			num=8888;break;
    case(0x7):     //三按键
			num=9999;break;  
	}	

   key_value=0; 

}

key.h

#include "system.h"	   //把timer0.h文件包含进来
#include "smg.h"
sbit k1=P3^7;
sbit k2=P3^6;
sbit k3=P3^5;
sbit k4=P3^4;


uint KeyScan ();
void KEY_SHEZHI();

smg.c

#include "smg.h"
sbit WEI0 = P2^7;
sbit WEI1 = P2^6;
sbit WEI2 = P2^5;
sbit WEI3 = P2^4;
sbit aa = P0^0;
sbit bb = P0^1;
sbit cc = P0^2;
sbit dd = P0^3;
sbit ee = P0^4;
sbit ff = P0^5;
sbit gg = P0^6;
sbit dp = P0^7;
uint num=0;

uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
//uchar code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳

//uchar DisplayData[3];
		 
 void smg_DigDisplay()	 //数码管显示
{
	static	uchar i=0;

	P0=0x00;//消隐
  switch(i)	 //位选,选择点亮的数码管,
	{
		case(0):
			WEI0=0;WEI1=1;WEI2=1;WEI3=1;smg_scan(num % 10000/ 1000); break;//显示第0位
		case(1):
			WEI0=1;WEI1=0;WEI2=1;WEI3=1;smg_scan(num % 1000 / 100);break;//显示第1位
		case(2):
			WEI0=1;WEI1=1;WEI2=0;WEI3=1;smg_scan(num % 100/10);break;//显示第2位
		case(3):
			WEI0=1;WEI1=1;WEI2=1;WEI3=0;smg_scan(num%10);break;//显示第3位
	}	

	i++;	
	if(i>3){i=0;}

}

//数码管 驱动
void smg_scan(unsigned char n)
{
  uchar temp;
	temp = smgduan[n];
  
	aa = temp & (0x01<<0);
	bb = temp & (0x01<<1);
	cc = temp & (0x01<<2);
	dd = temp & (0x01<<3);
	ee = temp & (0x01<<4);
	ff = temp & (0x01<<5);
	gg = temp & (0x01<<6);
}

///******************
//数码管 驱动
//*********************/
//void smg_scan(unsigned char n)
//{	
//  uchar temp;
//  temp = smgduan[n];
// if(temp&0x01)aa=1;
//	else aa=0;
//	
//	if(temp&0x02)bb=1;
//	else bb=0;
//	
//	if(temp&0x04)cc=1;
//	else cc=0;
//	
//	if(temp&0x08)dd=1;
//	else dd=0;
//	
//	if(temp&0x10)ee=1;
//	else ee=0;
//	
//	if(temp&0x20)ff=1;
//	else ff=0;
//	
//	if(temp&0x40)gg=1;
//	else gg=0; 
//	
//	if(temp&0x80)dp=1;
//	else dp=0; 

//}

void	SMG_XS(void)
{
     static uint	x=0;
     x++;
     if(x>=1000)   //定时500毫秒
		{	   
			num++;x=0;
    }
                
			 
} 在这里插入代码片

smg.h

#include "system.h"

//sbit WEI0 = P2^7;
//sbit WEI1 = P2^6;
//sbit WEI2 = P2^5;
//sbit WEI3 = P2^4;

void smg_DigDisplay(); //数码管位选
void smg_scan(unsigned char n);//数码管 驱动
void	SMG_XS(void);在这里插入代码片

#include “system.c”

#include "system.h"

uchar flag_1ms=0;
unsigned char count_0_1ms=0;
uint count_100us=0;
void	Timer0_Init(void)
{
	TH0 = T1MS>>8; //赋初值
	TL0 = T1MS;	   //赋初值
	TMOD = 0x01;  //设置定时器0用十六位定时器方式
    EA = 1;			 //打开总中断
  	ET0 = 1;		 //打开定时器0中断
  	TR0 = 1;		 //启动定时器0		
}

void Timer0() interrupt 1		 //中断号1
{	
	TH0 = T1MS>>8; //赋初值
	TL0 = T1MS;	   //赋初值
	
  
  count_0_1ms++;
	if(count_0_1ms>=10)
	{
		flag_1ms=1;
		count_0_1ms=0;
	}
 count_100us++;
}


void	Delay_us(uint xus)
{
	for(;xus>0;xus--);
}

void	Delay_ms(uint xms)
{
	for(;xms>0;xms--)
	{
		Delay_us(1000);
	}
}

#include “system.h”

//#include "reg51.h"
#include "STC12C5630AD.H"
//#include "STC12C5A60S2.H"
#define	uchar unsigned char	//定义无符号字符
#define	uint  unsigned int	//定义无符号整形

#define	u8 unsigned char	//定义无符号字符
#define	u16  unsigned int	//定义无符号整形

#define	FOSC	12000000L	//定义晶振频率		   
#define	T1MS	(65536-FOSC/12/10000)  //定时10毫秒的时候,计数器要写入的值

void	Delay_us(uint xus);	//us级延时
void	Delay_ms(uint xms);	//ms级延时
void	Timer0_Init(void);  	//定时器初始化

main.c

#include "system.h"
#include "key.h"
#include "led.h"	
#include "smg.h"

extern	uchar flag_1ms;	   //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

void main(void)			//程序的主函数
{	
//    P0M0  = 0x0;
//    P0M1  = 0xff;
//     P0M0  = 0x20;
//     P0M1  = 0x20;

	Timer0_Init(); 定时器0函数调用
  
	while(1)  			//大括号里面的东西,被不停的循环执行
	{  
		//1ms进入一次
		if(flag_1ms==1)	//加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行	 	
		{
		  	flag_1ms=0;  
        smg_DigDisplay();//数码管位选
        Led_SHANSHUO();// LED 500ms闪烁
        KEY_SHEZHI(); //按键设置
        KeyScan ();//按键扫描函数
     //   smg_XS();  //数码管显示
	  	}
	}
}

文章来源:https://blog.csdn.net/weixin_46001221/article/details/135724472
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。