stc98c52单片机四个独立按键lcd1608显示每个按键按了几次

四个独立按键LCD显示每个按键按了几次

key1-4

你好,我是有问必答小助手。为了技术专家团更好地为您解答问题,烦请您补充下(1)问题背景详情,(2)您想解决的具体问题,(3)问题相关代码图片或者报错信息。便于技术专家团更好地理解问题,并给出解决方案。

您可以点击问题下方的【编辑】,进行补充修改问题。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 请看👉 :单片机stc89c52 lcd1602 9999秒倒计时 可按键控制
  • 除此之外, 这篇博客: STC89C52单片机 独立键盘中的 每次按动按键 S4,控制数码管显示数字减 1,当数码管数字变为 00 时, 按动按键 S4,会让数码管重新变为 10。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    方法一:

    #include <reg52.h>
    #include <intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit DU = P2^6;//数码管段选
    sbit WE = P2^7;//数码管段选
    sbit key_s2 = P3^0;//独立按键S2
    sbit key_s3 = P3^1;//独立按键S3
    sbit key_s4 = P3^2;//独立按键S2
    uchar num1 = 0, num2 = 0;//数码管显示的值
    uchar count = 0;
    
    //共阴数码管段选表0-9
    uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    
    
    //毫秒级延时函数定义
    void delay(uint z)
    {
    	uint x,y;
    	for(x = z; x > 0; x--)
    		for(y = 114; y > 0 ; y--); 		
    } 
    
    
    /*====================================
    描述	:两位共阴数码管动态显示
    ====================================*/
    void display(uchar num1, uchar num2)
    {
    												
    	/*第一位显示*/ 		
    	P0 = 0XFF;//清除断码
    	WE = 1;//打开位选锁存器
    	P0 = 0XFE; //1111 1110
    	WE = 0;//锁存位选数据
    	
    	DU = 1;//打开段选锁存器
    	P0 = tabel[num1];//
    	DU = 0;//锁存段选数据
    	delay(1);
    
    	/*第二位显示*/
    	P0 = 0XFF;//清除断码
    	WE = 1;//打开位选锁存器
    	P0 = 0XFD; //1111 1101
    	WE = 0;//锁存位选数据
    	
    	DU = 1;//打开段选锁存器
    	P0 = tabel[num2];//
    	DU = 0;//锁存段选数据
    	delay(1);
    	
    }
    
    void main()//main函数自身会循环
    {
    	display(num1, num2); //数码管显示函数
    	
    	while(1)
    	{
    		if(key_s4 == 0)//判断S2是否被按下
    		{
    			delay(20);//按键消抖
    			if(key_s4 == 0)
    			{
    				if(count == 0){
    					num1 = 1;
    					num2 = 0;
    					count++;
    				} else if(count == 1){					
    					num1 = 0;
    					num2 = 9;
    					count++;
    				} else if(count < 11){
    					num2--;
    					count++;
    				} else {
    					count = 0;
    				}
    
    				if(count == 0){
    					num1 = 1;
    					num2 = 0;
    					count++;
    				} 
    				while(!key_s4);//松手检测 
    			}	
    		}
    	   display(num1, num2); 
    	}	
    } 
    
    

    方法二:

    /*********************************************************************************
    * 【作    者】:	vvcat
    * 【版    本】:	V1.0
    * 【外部晶振】: 	11.0592mhz	
    * 【主控芯片】: 	STC89C52
    * 【编译环境】: 	Keil μVisio4	
    * 【程序功能】: 	独立按键识别		   			            			    
    * 【使用说明】: 	每次按动按键 S4,控制数码管显示数字减 1,当数码管数字变为 00 时, 按动按键 S4,会让数码管重新变为 10。
    **********************************************************************************/
    #include <reg52.h>
    #include <intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit DU = P2^6;//数码管段选
    sbit WE = P2^7;//数码管段选
    sbit key_s4 = P3^2;//独立按键S4
    uchar display_num = 0; // 对数码管显示的数值初始化
    uchar num1 = 0, num2 = 0;//数码管显示的值
    
    //共阴数码管段选表0-9
    uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    
    
    //毫秒级延时函数定义
    void delay(uint z)
    {
    	uint x,y;
    	for(x = z; x > 0; x--)
    		for(y = 114; y > 0 ; y--); 		
    } 
    
    
    /*====================================
    描述	:两位共阴数码管动态显示
    ====================================*/
    void display(uchar num1, uchar num2)
    {
    												
    	/*第一位显示*/ 		
    	P0 = 0XFF;//清除断码
    	WE = 1;//打开位选锁存器
    	P0 = 0XFE; //1111 1110
    	WE = 0;//锁存位选数据
    	
    	DU = 1;//打开段选锁存器
    	P0 = tabel[num1];//
    	DU = 0;//锁存段选数据
    	delay(1);
    
    	/*第二位显示*/
    	P0 = 0XFF;//清除断码
    	WE = 1;//打开位选锁存器
    	P0 = 0XFD; //1111 1101
    	WE = 0;//锁存位选数据
    	
    	DU = 1;//打开段选锁存器
    	P0 = tabel[num2];//
    	DU = 0;//锁存段选数据
    	delay(1);
    	
    }
    
    void main()//main函数自身会循环
    {
    	display(num1, num2); //数码管显示函数
    	
    	while(1)
    	{
    		if(key_s4 == 0)//判断S4是否被按下
    		{
    			display_num--; // 每按一次独立按键,数码管显示的值减去1
    			delay(20);//按键消抖
    			if(key_s4 == 0)
    			{
    				switch(display_num){   // 通过	switch case 语句对 数码管的数值进行精准的管理
    				    case 0 :
    				       num1 = 0;
    					   num2 = 0;
    				       break; 
    				    case 1 :
    				       num1 = 0;
    					   num2 = 1;
    				       break;
    					case 2 :
    				       num1 = 0;
    					   num2 = 2;
    				       break;
    					case 3 :
    				       num1 = 0;
    					   num2 = 3;
    				       break;
    					case 4 :
    				       num1 = 0;
    					   num2 = 4;
    				       break;
    					case 5 :
    				       num1 = 0;
    					   num2 = 5;
    				       break;
    					case 6 :
    				       num1 = 0;
    					   num2 = 6;
    				       break;   
    					case 7 :
    				       num1 = 0;
    					   num2 = 7;
    				       break; 
    					case 8 :
    				       num1 = 0;
    					   num2 = 8;
    				       break;
    					case 9 :
    				       num1 = 0;
    					   num2 = 9;
    				       break;
    					case 10 :
    				       num1 = 1;
    					   num2 = 0;
    				       break;
    					default : // 当display_num数值小于0的时候,display_num 重新赋值10,不能使 display_num 变为负数
    						display_num = 10;
    						num1 = 1;
    					   	num2 = 0;      
    				}
    				while(!key_s4);//松手检测 
    			}	
    		}
    
    	   display(num1, num2); 
    	}	
    } 
    
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^