萌新求助被卡了两天了,实在想不出来了_(:з」∠)_
arduino吧
全部回复
仅看楼主
level 3
God220v 楼主
这个程序用个一维数组输出给寄存器以输出0-9,我启用外部中断的时候,按道理数码管应该显示零,但是按下按键去经常没反应,或者说起码按0.2-0.3秒才会至零,有的时候按下去他就直接停了,数根本不变。
2018年10月23日 12点10分 1
level 3
God220v 楼主
详细代码#include <MsTimer2.h>
int stcp=5;
int shcp=4;
int ds=2;
int button=12;
int EMMM =8;
int Reset=9;
int a[]={0b00111111,0b00000110,0b01011011 ,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01100111};
int k=0;
//int out_put= 13;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(stcp,OUTPUT);
pinMode(shcp,OUTPUT);
pinMode(ds,OUTPUT); //让三个脚都是输出状态
pinMode(button,OUTPUT);//产生上升沿的时候触发中断
MsTimer2::set(10,ggyy);//10ms执行一次会产生数码管频闪,将ms引脚与电源相接解决问题
MsTimer2::start();
// judge();
attachInterrupt(button,gotozero,RISING);
pinMode(Reset, OUTPUT);
digitalWrite(Reset, HIGH);
// pinMode(out_put,OUTPUT);
}
void loop() {
}
void ggyy()
{
if(k>999)
{ k=0;}
digitalWrite(stcp,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
shiftOut(ds,shcp,MSBFIRST,a[k/100]);
//这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是ds的参数,
// 输入到芯片后会产生8个二进制数,达到开关的作用
digitalWrite(stcp,HIGH); //将ST_CP这个针脚恢复到高电平
k++;
}
void gotozero()
{
digitalWrite(Reset, LOW);
// EMMM=digitalRead(button);
// if(EMMM==HIGH)
// k=0;
}
2018年10月23日 12点10分 2
level 6
看不清楚唉
2018年10月23日 12点10分 3
代码我复制了
2018年10月23日 12点10分
level 3
God220v 楼主
这是怎么回事呀_(:з」∠)_
2018年10月23日 12点10分 4
level 6
建议用定时器查询按键状态,我用按键中断感觉也有问题,设置的上升沿触发,但实际高电平也会触发,可能是中断嵌套了
2018年10月23日 12点10分 5
什么意思?我现在就是两个中断,一个是定时器中断用于正常的0-9数字变化,然后还有一个是外部中断
2018年10月23日 12点10分
用外部中断不容易控制,最好用查询方式检测按键
2018年10月23日 12点10分
@红彩见后雨 你的意思是把主体塞回loop然后把外部中断的内容放到定时中断里面吗
2018年10月23日 13点10分
对,按键的判断放在loop,不用外部中断,还用定时器中断读按键状态
2018年10月23日 13点10分
level 6
我用的是1ms的定时器去查询按键状态,用变量计数,这样也好做滤波,也容易控制
2018年10月23日 12点10分 6
level 3
God220v 楼主
现在改成了这样int stcp=5;
int shcp=4;
int ds=2;
int button=12;int k=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(stcp,OUTPUT);
pinMode(shcp,OUTPUT);
pinMode(ds,OUTPUT); //让三个脚都是输出状态
pinMode(button,OUTPUT);
MsTimer2::set(1,ggyy);//10ms执行一次会产生数码管频闪,将ms引脚与电源相接解决问题
MsTimer2::start();
// judge();
// attachInterrupt(button,gotozero,HIGH);
}
void loop() {
int a[]={0b00111111,0b00000110,0b01011011 ,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01100111};
// put your main code here, to run repeatedly:
for(;k<1000;k++)
{
digitalWrite(stcp,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
shiftOut(ds,shcp,MSBFIRST,a[k/100]);
//这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是ds的参数,
/cp的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数,
// 输入到芯片后会产生8个二进制数,达到开关的作用
digitalWrite(stcp,HIGH); //将ST_CP这个针脚恢复到高电平
delay(10);
}
}
void ggyy()
{
if(digitalRead(button)==HIGH)
k=0;
}
2018年10月23日 13点10分 7
1