51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

题目要求:

在51单片机上通过C语言编写代码,使用中断,按键按一下数码管上面的数字从00开始加1,实现00——99的循环

准备工作:

  • keil建立工程
  • proteus仿真验证

代码如下:

/*
*功能:用中断实现开关每按一次,数码管数字加一,
*实现00-99的循环
*/
#include<reg52.h>
sbit SEG1 = P1^0;    //定义显示十位数码管
sbit SEG2 = P2^0;    //定义显示个位数码管
sbit key = P3^2;     //定义按键
int sum = 0;
int i,j;
unsigned char code DSY_CODE[] = {0xC0,0xF9,0xA4,
                                 0xB0,0x99,0x92,
                                 0x82,0xF8,0x80,0x90}; //共阳极数码管


void main()
{
  IE = 0x81;      //使用外部中断0
  IT0 = 1;
  while(1);
}

void EX0_INT(void) interrupt 0
{
        sum++;
		i = sum/10;	   //十位数字
		j = sum%10;	   //个位数字
		if(sum == 100)
		{
		sum = 0;
		}
		P1 =  DSY_CODE[i];//数码管显示十位数字
	    P2 =  DSY_CODE[j];//数码管显示个位数字
}
 

(写的不是很规范,仅供参考)

仿真结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 34
    点赞
  • 249
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
以下是基于51单片机按键控制数码管加一减一的代码: ``` #include <reg52.h> // 包含STC15F2K60S2单片机的寄存器定义 #include <intrins.h> // 包含_nop_()等函数的头文件 // 数码管共阴极引脚连接单片机P2口 sbit LED_COM1 = P2^2; sbit LED_COM2 = P2^3; sbit LED_COM3 = P2^4; sbit LED_COM4 = P2^5; // 数码管段选引脚连接单片机P0口 sbit LED_A = P0^0; sbit LED_B = P0^1; sbit LED_C = P0^2; sbit LED_D = P0^3; sbit LED_E = P0^4; sbit LED_F = P0^5; sbit LED_G = P0^6; sbit LED_DP = P0^7; // 按键引脚连接单片机P3口 sbit KEY_ADD = P3^0; sbit KEY_SUB = P3^1; // 数码管显示的数字,初始值为0 unsigned char led_code = 0; // 数码管显示函数 void LED_Display(unsigned char num) { // 数码管编码表,0~9对应的编码 unsigned char LED_TABLE[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; // 数码管共阴极,高电平不亮,低电平亮 LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; // 判断显示的是哪一位数码管,并点亮 switch(num / 1000) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num / 1000]; // 显示千位数字 _nop_(); // 延时一段时间,让人眼可以看到 LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; switch(num % 1000 / 100) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num % 1000 / 100]; // 显示百位数字 _nop_(); LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; switch(num % 100 / 10) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num % 100 / 10]; // 显示十位数字 _nop_(); LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; switch(num % 10) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num % 10]; // 显示个位数字 _nop_(); } // 延时函数 void Delay(unsigned int t) { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } void main() { // 初始显示数码管0 LED_Display(led_code); while(1) { // 检测加一按键是否按下,如果按下则led_code加一 if(KEY_ADD == 0) { Delay(20); // 延时一段时间,确保按键稳定按下 if(KEY_ADD == 0) { led_code++; if(led_code > 9999) led_code = 0; LED_Display(led_code); // 显示加一后的数码管值 } while(!KEY_ADD); // 等待加一按键释放 } // 检测减一按键是否按下,如果按下则led_code减一 if(KEY_SUB == 0) { Delay(20); // 延时一段时间,确保按键稳定按下 if(KEY_SUB == 0) { led_code--; if(led_code < 0) led_code = 9999; LED_Display(led_code); // 显示减一后的数码管值 } while(!KEY_SUB); // 等待减一按键释放 } } } ``` 代码中使用了外部按键控制数码管的加一减一操作,数码管由四个共阴极的数码管组成,使用P2口控制共阴极引脚,使用P0口控制段选引脚。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值