最近小孩练习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;
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--);
}
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]);
seg_disp(2,~leddata[b1]);
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(1,~leddata[a1]);
seg_disp(7,~leddata[b1]);
}
}
}
运行效果
|