51单片机--数码管显示按键按下次数(注释详细)

一、案例要求

用单个数码管显示按键按下的次数,也即是一开始显示0,随着按键的按下,每按下一次按键,数码管显示的数字加1,要求最多可以统计15次,0-9用正常的阿拉伯数字显示,从10~15依次用A-F来显示。

二、案例分析

按键可以使用外部中断0的工作方式,即连接51单片机的P3.2引脚,按下一次按键便发生一次中断,次数加1,加1得到的数存在一个变量button_cnt中;数码管选择7段共阳极数码管,公共端接5V电源,数码管的字形码存放在一个数组Dis_Num[]中,Dis_Num[button_cnt]便是显示当前按下的次数。

三、案例仿真

在这里插入图片描述

四、案例代码

#include <reg51.h>
#include <intrins.h>

	
unsigned char button_cnt= 0;   //初始化按键按下的次数
unsigned char Dis_Num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阳极数码管0-F的字形码

//延时函数
void Delay(unsigned int k)
{
	while(k--);
}

void main()
{
    IT0=1;//外部中断0为下降沿触发方式
    EA=1;//开总中断
    EX0=1;//打开外部中断0
	while(1)
	{
		P2 = Dis_Num[button_cnt];    //数码管8个引脚连接P2,Dis_Num[button_cnt]为显示的按键按下次数
	}
}

//外部中断0中断服务函数
void int0() interrupt 0  
{ 				  			
	button_cnt = button_cnt+1;     //按键按下时,button_cnt 加1
	button_cnt =button_cnt & 0x0f; //为了保证有效统计15次,次数大于15时清零

	Delay(200000);//延时,用于按键消抖
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于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; // 计算千万 } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值