//_____________________________________________________________________________________
// 名称: 数码管模拟显示乘法口诀
// 说明: 输入正确结果则显示下一口诀
否则报错 继续显示
//_____________________________________________________________________________________
#define F_CPU 4000000UL
#include
#include
//中断所需头文件
#include
//变量类型头文件
#include
//延时函数头文件
#include
#include
//按键定义操作
#define
K1_DOWN() ((PIND&_BV(PD4))==0X00)
//蜂鸣器定义
#define
SPK() PORTD^=_BV(PD0)
//解码芯片74C922按键定义 获取键值
#define key_pressed() (PINA
& 0x10)==0X10
#define
key_value (PINA &0X0F)
//数码管段码表(共阴)0-9 最后三位是0x00 0x48 0x08 分别是黑屏 等号
下划线
const uint8_t
seg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x48,0x08};
const uint8_t
warn[]={0x00,0x79,0x77,0x77,0x3f,0x77}; //error段码表
//存放数码管被乘数 乘数 乘积初始显示“0 0=0”
uint8_t display_buffer[]={0,10,0,11,10,0};
uint8_t
result; //两数乘积结果
uint8_t
real_result; //求的结果
//_____________________________________________________________________________________
// 名称: 随机生成被乘数和乘数,并计算结果但不显示
//_____________________________________________________________________________________
void get_random_num_A_B()
{
//随机生成被乘数 和 乘数
display_buffer[0]=rand()%9+1;
display_buffer[2]=rand()%9+1;
//计算结果
result=display_buffer[0]*display_buffer[2];
//显示结果的4 5 两位时 先显示下划线
12是下划线
display_buffer[4]=12;
display_buffer[5]=12;
}
//_____________________________________________________________________________________
// 名称: 输入错误时提示音
//_____________________________________________________________________________________
void beep()
{
uint8_t i;
for(i=0;i<25;i++)
{
SPK();
_delay_ms(1);
}
}
//_____________________________________________________________________________________
// 名称: 输入错误时 显示error
//_____________________________________________________________________________________
void warn_error()
{
uint8_t i=0;
for(i=0;i<6;i++)
{
PORTB=0x00; //暂时关闭段码
PORTB=warn[i]; //送段码
PORTC=~_BV(i); //送位码
_delay_ms(5);
}
}
//_____________________________________________________________________________________
// 名称: 主程序
//_____________________________________________________________________________________
int main()
{
uint8_t k=4;
uint16_t
addr=0x0001,addr1=0x0002;
DDRA=0X00; PORTA=0XFF;
DDRB=0XFF; PORTB=0XFF;
DDRC=0XFF; PORTC=0XFF;
DDRD=0X01; PORTD=0XFE;
srand(87); //设置随机种子
TCCR0=0X03; //预分频64
TCNT0=256-F_CPU/64.0*0.004; //定时时间值为4MS
TIMSK=0X01; //开中断
sei();
get_random_num_A_B();
while(1)
{ if(key_pressed())
{
display_buffer[k++]=key_value; //获取键值
eeprom_write_byte((uint8_t
*)addr, display_buffer[4]); //
eeprom_write_byte((uint8_t *)addr1,
display_buffer[5]);
if(k==6) {
k=4;
real_result=display_buffer[4]*10+display_buffer[5];
_delay_ms(1000); if(result==real_result) //输入结果与真实一致,则进行下一道题 否则显示错误 error
再重新输入
{
get_random_num_A_B();
}
else
{
beep();
TIMSK=0X00;
for(uint8_t
n=0;n<50;n++) //错误提示停滞时间值 warn_error();
display_buffer[4]=12; //重新装载下划线 准备下一次的输入
display_buffer[5]=12; TIMSK=0X01;
}
}
while(key_pressed());