新人初学51单片机,制作简易八路抢答器有部分不解,代码如下,问题是怎么用外部中断0控制1人抢答后的停止以及按键复位

[复制链接]
查看11 | 回复10 | 2021-1-27 06:06:28 | 显示全部楼层 |阅读模式
本人只学过c,请用C来修改
1.使用矩阵键盘,除了8个按键之外额外设置一个清零键(与自带复位不同的)
2.抢答器按下一个按键后数值固定,只有按下清零键才能进行下一轮抢答
3.使用数码管或者LCD1602显示八路抢答器的数值
4.使用外部中断
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineGPIO_DIGP0
#defineGPIO_KEYP1
ucharKeyValue;
sbitk1=P3^1;
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
ucharcodesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voidInt0Init()
{
IT0=1;
EX0=1;
EA=1;
}
voiddelay(uinti)
{
while(i--);
}
voidKeyDown()
{
chara=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07):KeyValue=1;break;
case(0X0b):KeyValue=2;break;
case(0X0d):KeyValue=3;break;
case(0X0e):KeyValue=4;break;
}
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue;break;
case(0Xb0):KeyValue=KeyValue+4;break;
case(0Xd0):KeyValue=KeyValue+8;break;
case(0Xe0):KeyValue=KeyValue+12;break;
}
while((a -->
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
有人来帮忙解决一下吗?
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
当检测到按钮按下时可以控制EX0=1;或EA=1;回复时也是控制EX0=1;或EA=1;
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
当检测到按钮按下时可以控制EX0=0;或EA=0;回复时也是控制EX0=1;或EA=1;
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
引用3楼智者知已应修善业的回复:当检测到按钮按下时可以控制EX0=0;或EA=0;回复时也是控制EX0=1;或EA=1;
这是写在中断里还是写在主函数里?('?')
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
引用4楼qq_44992011的回复:Quote: 引用3楼智者知已应修善业的回复:当检测到按钮按下时可以控制EX0=0;或EA=0;回复时也是控制EX0=1;或EA=1;
这是写在中断里还是写在主函数里?('?')

说得很清楚了,在有按钮按下的地方
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
首先就是在你原来的基础上说:
1、你这个程序是完成不了你的功能的。在主函数里面的流程就有问题,以下给一个参考的主函数模式供你参考。注意这里面的有一个while循环,你的函数里面没有,这样就不知道运行一遍以后程序回到什么地方。估计会继续复位运行,具体怎么个逻辑我也不知道。
voidmain(void)
{
init();//这个函数时上电以后只执行一次的。
while(1)//这个循环就要求程序一直在运行中。
{
sub1();//这个二个函数只要单片机没有掉电,就会不停循环执行。
sub2();
}
}
2、再看keydown这个函数。没有电路图,从程序上看,第一次用GPIO_KEY的低4位输入了4个按键,再用GPIO_KEY的高四位输入了按键,这个是什么意图看不懂。如果按照你要求,采用矩阵式的按键,GPIO_KEY的8个IO中,应该用4个输出,四个输入,就可以满足你8个按键的要求(16按键以内都可以)。
3、没有看到你是如何连接INT0的,如果采用Keydown里面的4*4的方法来做。那么4个输入的信号如何并入到int0?这些信号并入一个IO的话需要考虑之间相互的影响。
最后建议你的解决方法就是:
1、用GPIO_KEY做输出,用INT0这个IO来做输入。上电以后,直接在GPIO_KEY上输出0,INT0需要上拉。
2、设置INT0为下降沿中断。
3、打开INT0中断,再进入主循环(while(1)循环体)。
4、在INT0中断程序里面需要关闭中断(一来中断即关闭中断),再将GPIO_KEY从bit0到bit7,依次输出0(每次只输出一位0,其他位为高),每次输出以后再读INT0的IO口状态,如果发现读回来的状态是0,则说明这个按键按下产生了中断,这时可以退出中断服务程序。
5、在主循环里面对此按键处理。如果是归零按键,就再次开启INT0中断即可。
单片机程序是需要结合硬件电路来做的。所以,写程序前先考虑硬件怎么做。做好硬件以后,再来考虑软件。
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
一个类似的代码,自己去修改,有问题再来问


回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
检测任何按钮按下代码自己添加到中断按钮那里即可,如if(!k0||!k1||!k2||!k3)
回复

使用道具 举报

千问 | 2021-1-27 06:06:28 | 显示全部楼层
倒计时16路抢答器秀一个


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行