51单片机数码管控制,类似抢答器

  1. 本次数码管控制仿真实验中,使用了共阳极的数码管7SEG-MPX1-CA,数码管组件一共有十个引脚,其中八个阴极引脚代表每个数的七个led灯和小数点选择,即0有效1无效;有一个阳极引脚,即1有效0无效(共阴极的话也一样,只是阳极和阴极的个数和含义互换)。
  2. 本次实验使用P0^0连接一个botton组件控制数码管是否加一显示数字,P0^7也连接一个button组件控制数码管复位显示;同时通过P3^0控制数码管的阳极,i控制显示数字是否大于9,各个值初始定义如下:
    P3=0X01;   //控制阳极
    	P0=0X00;   //控制按键选择
    P2=digit[0];  //数码管初始显示为0
    Int i;
    I=0;			

  3. 创建数组保存每个数字显示需要分配的16进制数,具体代码如下:
    int digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

  4. 通过变量i控制数码管显示的数字是否大于9,是则回到0显示,具体代码如下:

    if(i>9){
    	 i=0; 
    	 P2=digit[i];
    	 delay(200);   }

  5. 实现第一个按键
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过按键中断来实现四人抢答器和八人抢答器的切换。以下是一个简单的实现方法: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit button1 = P1^0; // 按钮1 sbit button2 = P1^1; // 按钮2 sbit button3 = P1^2; // 按钮3 uchar player_num = 4; // 默认为四人抢答器 // 数码管段选表,共阳极数码管 uchar code digit[10] = { 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x82, // 6 0xF8, // 7 0x80, // 8 0x90 // 9 }; // 数码管位选表,共阳极数码管 uchar code position[4] = { 0x01, // 第一位 0x02, // 第二位 0x04, // 第三位 0x08 // 第四位 }; // 数码管显示函数,num为要显示的数字,pos为数码管位置 void display(uchar num, uchar pos) { P2 = digit[num]; // 先将段选数据送入P2口 P0 = ~position[pos]; // 再将位选数据送入P0口 } // 延时函数,用于消除按键抖动 void delay(uint t) { uint i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } // 中断服务函数,用于处理外部中断0(按键1)的触发事件 void button1_isr() interrupt 0 { player_num = 4; // 切换到四人抢答器 display(player_num, 0); // 数码管第一位显示选手总数 display(0, 3); // 数码管第四位清零 delay(10); // 延时消抖 } // 中断服务函数,用于处理外部中断1(按键2)的触发事件 void button2_isr() interrupt 2 { player_num = 8; // 切换到八人抢答器 display(player_num, 0); // 数码管第一位显示选手总数 display(0, 3); // 数码管第四位清零 delay(10); // 延时消抖 } void main() { EA = 1; // 开启总中断 EX0 = 1; // 开启外部中断0(按键1) IT0 = 1; // 外部中断0下降沿触发 EX1 = 1; // 开启外部中断1(按键2) IT1 = 1; // 外部中断1下降沿触发 while(1) { // 实现四人抢答器或八人抢答器的代码 } } ``` 在本代码中,通过按键中断切换到对应的抢答器模式。按键1对应四人抢答器,按键2对应八人抢答器。每次按键中断触发时,将选手总数设置为对应的数值,并清零数码管第四位。需要注意的是,由于本代码没有按键3,因此无法返回主菜单。如果需要返回主菜单,可以参考上一个回答中的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值