我淦啊 2021-06-22 10:38 采纳率: 0%
浏览 171

multisim仿真电路设计--拔河游戏机

用9个发光二极管排成一行,开机后只有中间一个点亮,以此作为拔河的中心线,游戏双方各持一个按键,迅速地、不断地按动产生脉冲,谁按得快,亮点向谁的方向移动,每按一次,亮点移动一次。移到任一方终端二极管点亮,这一方就得胜,此时双方按键均无作用,输出保持,只有经复位后才使亮点恢复到中心线。

  • 写回答

1条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-16 15:09
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 1.需要用到一个中间亮点和9个发光二极管,可以考虑用一个数组来保存它们的状态。 2.需要检测按键的按下次数并向对应方向移动亮点。 3.需要判断亮点是否已到达任一方终端。 解决方案: 1.定义一个长度为9的数组来表示发光二极管的状态,初始时只有中间一个点亮,可以定义一个初始化函数来设置初始状态。 2.定义两个变量来记录双方按键的按下次数,可以用中断处理函数来检测按键按下。每次按键按下时,将对应的变量自增1,然后根据哪个变量更大来决定向哪个方向移动亮点的位置。移动亮点时,需要将先前的发光二极管状态清零,然后更新新的发光二极管状态。 3.定义一个函数来检测亮点的位置是否已到达任一方终端,当亮点到达某一方终端时,输出胜利信息并保持亮点位置不变,需要定义一个变量来记录游戏是否已结束。 示例代码:(仅作参考,具体实现可能因硬件设备不同而异) #include #include volatile int left_count = 0; volatile int right_count = 0; volatile int game_over = 0; volatile int led_state[9]; void init_led_state(){ for(int i=0; i<9; i++){ led_state[i] = 0; } led_state[4] = 1; } void update_led_state(int move_direction){ int new_pos; for(int i=0; i<9; i++){ if(led_state[i]){ led_state[i] = 0; new_pos = i + move_direction; if(new_pos >= 0 && new_pos < 9){ led_state[new_pos] = 1; break; } } } } void check_game_status(){ if(led_state[0]){ game_over = 1; printf("Left player wins!"); } else if(led_state[8]){ game_over = 1; printf("Right player wins!"); } } ISR(INT0_vect){ left_count++; update_led_state(1); check_game_status(); } ISR(INT1_vect){ right_count++; update_led_state(-1); check_game_status(); } int main(){ init_led_state(); EICRA |= (1 << ISC01) | (1 << ISC11); EIMSK |= (1 << INT0) | (1 << INT1); sei(); while(!game_over); return 0; }
    评论

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突