#include<iom16v.h>
#include<macros.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
//定义数组和变量
uint cc_7seg_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管0-9段码
uint led_rand=0; //限制范围后的随机数
uchar grade_count=0; //分数 0-50
uchar start_flag=0; //是否开始 1开始
uchar change_flag=0; //是否改变led 1是
void delay_ms(uint ms) //8Mhz晶振 下1ms 大约
{
uint i,j;
for(i=0;i<ms;i++) //两个for循环 1140据说是测试出来的
for(j=0;j<1140;j++);
}
void io_init(void) //io引脚的初始化
{
DDRA =0xff; //A口为输出模式
PORTA=0x00; //A口设置为低电平
DDRB =0xff; //A口为输出模式
PORTB=0x00; //A口设置为低电平
DDRC =0xff; //c口输出模式
PORTC=0x00; //c口低电平
DDRD =0x00; //D口设置为输入模式
PORTD=0xff; //D口内部上拉 平时不按按键为高电平,按键按下为低电平
}
void main(void) //主函数
{
uint i=0; //变量 循环等是用
uint main_count=0; //用于main大循环中的计数值
io_init(); //初始化 io口
for(i=0;i<=7;i++){ //循环执行8次,
PORTC=BIT(i); //让8个led从左到右流水过去
delay_ms(80); //延时80ms
}
for(i=0;i<=7;i++){ //循环执行8次,
PORTC=BIT(7-i); //让8个led从右到左流水过去
delay_ms(80); //延时80ms
}
PORTC=0x00; //最后led全部关闭
while(1) //大循环
{
main_count++; //循环计数值+1
if(main_count>=60000) main_count=0; //限制范围0-60000 防止溢出
if(start_flag==0){ //若还未开始
if(PIND!=0xff){ //判断D口有按下时
start_flag=1; //开始标志为1
//led_rand=rand()%8; //发现rand()函数不是真正的随机函数
led_rand=(main_count+led_rand)%8; //使用循环的计数值和上一次状态的叠加,可实现连续点的时候会是随机状态
PORTC=BIT(led_rand); //让C口led点亮那个随机灯
main_count=0; //清零
}
}
if(start_flag==1){ //若此时在游戏中。。。
if(PIND!=0xff){ //判断有按键按下
delay_ms(2); //延时2ms,消抖
if((PIND&BIT(led_rand))==0){ //如果按对了
grade_count++; //分数+1
if(grade_count>=50){ //若分数大于等于50分
//c口led全体闪烁3次
PORTC=0x00; delay_ms(300);
PORTC=0xff; delay_ms(300);
PORTC=0x00; delay_ms(300);
PORTC=0xff; delay_ms(300);
PORTC=0x00; delay_ms(300); //led全灭 延时300ms
PORTC=0xff; delay_ms(300); //led全亮 延时300ms
PORTC=0x00; delay_ms(300);
grade_count=0; //分数清零
}
}
else{ //若按键按错了
if(grade_count>0)grade_count--; //分数大于0的话,分数减1
else grade_count=0; //分数等于0 的话,还是赋值为0 最低分
}
change_flag=1; //标记 需要转换led显示状态
while(PIND!=0xff); //等待D口按键松开
}
if(main_count>=1902-grade_count*30){ //若规定时间过了 间歇时间会随着分数值变大而变小
//if(main_count>=2001){
change_flag=1; //标记 需要转换led显示状态
}
if(change_flag==1){ //若需要转换led状态
change_flag=0; //清空标记
//led_rand=rand()%8; //发现rand()函数不是真正的随机函数
led_rand=(main_count+led_rand)%8; //利用时间和上一次状态 随机出下一个状态
PORTC=BIT(led_rand); //让C口led亮对应的灯
main_count=0; //清零
}
}
PORTA=cc_7seg_table[grade_count/10%10]; //显示分数的10位 将分数的十位提取出来,用数组查表的方式静态显示
PORTB=cc_7seg_table[grade_count%10]; //显示分数的个位 将分数的个位提取出来,用数组查表的方式静态显示
delay_ms(1); //延时1ms
}
}
荒野大飞
- 粉丝: 1w+
- 资源: 2809
最新资源
- 招生管理系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 招聘信息管理系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 志同道合交友网站-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 校园疫情防控系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 校园志愿者管理系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 智慧党建系统设计与实现_1i659--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 校园志愿者管理系统pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 校运会管理系统pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 智慧学生校舍系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 新冠物资管理--论文pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 新冠物资管理系统的设计与实现pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 新生宿舍管理系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 新闻资讯系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 智能菜谱推荐系统_ct3p7--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 毕业设计-基于Python+卷积神经网络的人脸识别+驾驶员疲劳检测与预警系统源码
- 饮食分享平台--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈