单片机原理及应用:计数按键控制数码管显示

承接上文,我们来介绍一下按键和数码管的配合工作,由于数码管显示的字符和位数多种多样,无法做到一个字符对应一个按键,所以程序主要记录按键的使用次数来切换数码管的显示。

#include <reg52.h>          	//包含reg52.h头文件
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极接法
unsigned char Count;          	//定义变量放置计数数值
sbit KEY=P1^0;	//定义KEY为接在P1.0上的按键
sbit KEY1=P1^1;
void delay10ms(void)          	//定义10ms延时函数
{ 
    unsigned char i,j; 
    for(i=20;i>0;i--)
       for(j=248;j>0;j--); 
} 
void main(void)
{
    //初始步骤,用于控制上电之后所显示的数字,共三步,数据
	Count=0;                    		//计数变量初始为0
    P0=table[Count/10];      			//十位数码管显示0
    P2=table[Count%10];       			//个位数码管显示0       
    while(1)                    		//按键扫描,计数显示处理
    { 
       if(KEY==0)               		//双if嵌套去抖动
       { 
           delay10ms();          		//延时
           if(KEY==0)           		
           { 
                Count++;           		//计数加1 
				if(Count==100)    	
                { 
                     Count=0;    		//计数清零
                }
				 
                P0=table[Count/10]; 	//显示十位数
                P2=table[Count%10]; 	//显示个位数
                while(KEY==0);     		//防止不松手等键释放
           } 
       }
	 
//再加一个按键KEY1,按下后会减一
//由于count在-1时重新赋值99.所以count得是有符号的char类型
			 
       if(KEY1==0)               		
       { 
           delay10ms();          		
           if(KEY1==0)           		
           { 
                Count--;           		
                if(Count==-1)    		
                { 
                     Count=99;    		
                } 
                P0=table[Count/10]; 	
                P2=table[Count%10]; 	
                while(KEY1==0);     		
           } 
       }   /*
//加一个KEY2,按下后会清零
       if(KEY2==0)               		
       { 
           delay10ms();          		
           if(KEY2==0)           		
           {  
                P0=table[0]; 	
                P2=table[0]; 	
                while(KEY2==0);     		
           } 
       }
 */
    }
}

键盘去抖的方式有很多,不过for循环嵌套应该是最简单的。这类计数装置需要考虑按键释放,要在if内层的最后一行写一个while(1) 。仿真电路如图所示:

 

按键控制数码管计数器

下面给大家提供一道模拟题:自选外设,根据按键次数显示相应的数字,按下按键9次后清零。

#include <reg52.h>     //包含reg52.h头文件
sbit key = P1^0;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};	//数码管的组函数要加code,并且顺序固定
  char n;
void  Delay()            //延时函数
{
  unsigned char i, j;
      for (i=0;i<255;i++)
         for (j=0;j<255;j++);
}
 void  delay10ms()
 {
 	  unsigned char i, j;
      for (i=0;i<255;i++)
         for (j=0;j<40;j++);
 }
void  main()   
{
   	n=0;
  	P2=table[n]	;
   while(1)
    {  
	    if(key==0)
	    {
		 delay10ms();
		 if(key==0)
		  {
			  n++;
		     
		     
		    if(n==10)
			{
			   n=0;
			}
			  P2=table[n];
		      while(key==0);
		  }
		}
	 
	} 
 }

上面是笔者的演示代码,用按键控制1只数码管计数,要比0~99计数器简单一些,适合新手入门。分享就到这里,谢谢大家。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于51单片机按键控制数码管显示计时程序,代码中用到了定时器计数和中断处理,具体注释见代码: ``` #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit key1 = P3^0; // 按键1,用于开始计时 sbit key2 = P3^1; // 按键2,用于暂停计时和继续计时 sbit key3 = P3^2; // 按键3,用于复位计时 sbit dula = P2^6; // 数码管段选1 sbit wela = P2^7; // 数码管位选1 uchar code table[] = { // 数码管显示0~9的编码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; uchar num[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 存储显示的8位数字 uint second = 0; // 计时秒数 bit flag = 0; // 计时标志,0表示未开始计时或已经暂停,1表示正在计时 void delay(uchar i) { // 延时函数 uchar j, k; for (j = i; j > 0; j--) for (k = 110; k > 0; k--); } void init() { // 初始化函数,设置定时器和中断 TMOD = 0x01; // 定时器T0工作模式1 TH0 = 0x4C; // 定时器T0初值,定时1ms TL0 = 0x00; ET0 = 1; // 允许定时器T0中断 EA = 1; // 允许总中断 TR0 = 1; // 启动定时器T0 } void display() { // 数码管显示函数 uchar i; for (i = 0; i < 8; i++) { wela = 1; // 打开位选 P0 = 0x01 << i; // 选择第i位 wela = 0; // 关闭位选 P0 = table[num[i]]; // 显示num[i]对应的编码 dula = 0; // 打开段选 dula = 1; // 关闭段选 } } void main() { init(); // 初始化 while (1) { if (!key1) { // 按键1按下,开始计时 flag = 1; } if (!key2) { // 按键2按下,暂停或继续计时 flag = !flag; } if (!key3) { // 按键3按下,复位计时 flag = 0; second = 0; num[0] = num[1] = num[2] = num[3] = num[4] = num[5] = num[6] = num[7] = 0; } display(); // 显示计时器数字 } } void timer0() interrupt 1 { // 定时器T0中断处理函数 static uint cnt = 0; TH0 = 0x4C; // 定时器T0重新赋初值 TL0 = 0x00; cnt++; if (cnt == 1000) { // 每1s计一次 cnt = 0; if (flag) { // 如果正在计时,秒数加1 second++; if (second >= 99999999) { // 计时器最大值为99999999,超过则复位 second = 0; } num[0] = second % 10; // 计算个位 num[1] = second / 10 % 10; // 计算十位 num[2] = second / 100 % 10; // 计算百位 num[3] = second / 1000 % 10; // 计算千位 num[4] = second / 10000 % 10; // 计算万位 num[5] = second / 100000 % 10; // 计算十万位 num[6] = second / 1000000 % 10; // 计算百万位 num[7] = second / 10000000 % 10; // 计算千万位 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值