c语言数码管显示乘法口诀,[转载]AVR-数码管显示乘法口诀升级版

a4c26d1e5885305701be709a3d33442f.png

//_____________________________________________________________________________________

// 名称:  数码管模拟显示乘法口诀

// 说明: 输入正确结果则显示下一口诀

否则报错 继续显示

//_____________________________________________________________________________________

#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());

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值