|
楼主 |
发表于 2014-3-18 15:23:07
|
显示全部楼层
使用STM8S单片机。
代码开源:
//4-pedal.c
#include <stmduino.h>
#define itglimit 20
#define blinkled D2
#define led3 D3
#define led4 D4
#define blinktime 80
//Variables
uchar tonenumber=0;
uchar ctra=1;
uchar ctrb=1;
void setblink();
typedef struct {
pin p;
uchar itg;
uchar state;
void(*pressed)();
void(*released)();
}button;
void updatebutton(button*b){
if(pinread(b->p))
{//if button is not pushed
if(b->itg>0)b->itg--;
}
else
{//if button is pushed, therefore pulled low
if(b->itg<itglimit)b->itg++;
}
if((b->itg==itglimit)&&(b->state==0))
{
b->state=1;
if(b->pressed)b->pressed();
}
if((b->itg==0)&&(b->state==1))
{
b->state=0;
if(b->released)b->released();
}
}
///////////////////////////////////////////////消抖算法
button b1;
button b2;
button b3;
button b4;
void b1pressed()
{
tonenumber++;
tonenumber%=128;
/* Send tone ch */
putchar(0xc0);
putchar(tonenumber);
setblink();
eeuchar(0)=tonenumber;
}
void b2pressed()
{
tonenumber__;
tonenumber%=128;
putchar(0xc0);
putchar(tonenumber);
eeuchar(0)=tonenumber;
}
void b3pressed()
{
if(ctra)
{
putchar(0xb0);
putchar(25);
putchar(127);
pinhigh(led3);
}
else
{
putchar(0xb0);
putchar(25);
putchar(0);
pinlow(led3);
}
ctra=1-ctra;
}
void b4pressed()
{
if(ctrb)
{
putchar(0xb0);
putchar(26);
putchar(127);
pinhigh(led4);
}
else
{
putchar(0xb0);
putchar(26);
putchar(0);
pinlow(led4);
}
ctrb=1-ctrb;
}
uchar blinkcntr=0;
void setblink()
{
blinkcntr=blinktime;
}
void t()
{
updatebutton(&b1);
updatebutton(&b2);
updatebutton(&b3);
updatebutton(&b4);
if(blinkcntr)
{
blinkcntr--;
pinhigh(blinkled);
}
else
{
pinlow(blinkled);
}
}
void btninit(){
b1.p=C3;
b1.itg=0;
b1.state=0;
b1.pressed=b1pressed;
b1.released=0;
b2.p=C4;
b2.itg=0;
b2.state=0;
b2.pressed=b2pressed;
b2.released=0;
b3.p=C5;
b3.itg=0;
b3.state=0;
b3.pressed=b3pressed;
b3.released=0;
b4.p=C6;
b4.itg=0;
b4.state=0;
b4.pressed=b4pressed;
b4.released=0;
}
void main(){
clock(16M);
pinmode(C3,PULLUP);
pinmode(C4,PULLUP);
pinmode(C5,PULLUP);
pinmode(C6,PULLUP);
pinmode(blinkled,PUSHPULL);
pinmode(led3,PUSHPULL);
pinmode(led4,PUSHPULL);
btninit();
timer4tick(1ms);
attach(t,timer4);
serial(31250);
unlock(EEPROM);
tonenumber=eeuchar(0);
interrupts();
while(1){
sleep();
}
}
这个代码使用了novakon同志编写的stmduino库,这个库是非开源的,所以在此表达对novakon的感谢和对GC里的同志表示抱歉。
[ 本帖最后由 bg8npk 于 2014-3-18 15:36 编辑 ] |
|