【51】使用51单片机和数码管生成10以内加法及两组数据判断大小

最近小孩练习10以内加法运算,正好手上有块51开发板,写个程序自动生成题目会不会好一些呢。
开发板就是下面图这个
在这里插入图片描述

程序分成两部分
1、上电直接运行,是10以内加法,使用两个数码管分别显示两个数字
2、按住KEY1键上电,是两组加法判断,分别用第一个、第三个为第一组数据,第6个和第八个为第二组。

程序上用了一个比较懒的方法,第一个数跟10取余,第二个数为了防止加起来大于十,直接对11减去第一个数去余数。

按键及显示部分原理图

在这里插入图片描述

在这里插入图片描述

程序

#include "reg51.h"
#define SEG_POART P1
sbit SEG_LOCK=P2^6;
sbit BIT_LOCK=P2^7;
#define SEG_DATA P0

#define MAX 11

sbit KEY=P3^7;
sbit SELECT=P3^4;

//共阳极数码管0~F字型码
unsigned char leddata[]= { 0xC0,0xF9,0xA4,0xB0,0x99,0x92, 0x82, 0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

void delay(unsigned int t)
{
    while(t--);
}

//在第n位显示字型码seg
void seg_disp(char n,char seg)
{
    SEG_DATA=0x00;
    SEG_LOCK=1;
    SEG_LOCK=0;
    SEG_DATA=~(0x01<<n) ;
    BIT_LOCK=1;
    BIT_LOCK=0;
	SEG_DATA=seg;
    SEG_LOCK=1;
    SEG_LOCK=0;
    delay(200);
}

void main()
{	unsigned char a1,b1,a2,b2;
	if(SELECT==0)
	{
	    while(1)
	    {	
			if(KEY==0)
			{
				a1=rand()%MAX;
				b1=rand()%(MAX-a1);
				a2=rand()%MAX;
				b2=rand()%(MAX-a2);
			}
	        seg_disp(0,~leddata[a1]);	//第一位显示数字0,数码管为共阴极,需要转码
	        seg_disp(2,~leddata[b1]);
	        //seg_disp(2,~leddata[2]);
	        seg_disp(5,~leddata[a2]);
	        seg_disp(7,~leddata[b2]);
	    }
	}
	else
	{
	    while(1)
	    {	
			if(KEY==0)
			{
				a1=rand()%MAX;
				b1=rand()%(MAX-a1)	;
			}
	        //seg_disp(0,~leddata[0]);	//第一位显示数字0,数码管为共阴极,需要转码
	        seg_disp(1,~leddata[a1]);
	        //seg_disp(2,~leddata[2]);
	        //seg_disp(3,~leddata[3]);
	        seg_disp(7,~leddata[b1]);
	    }
	}

}

运行效果

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值