Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define DAT 6
- #define CLK 7
- #define KEY 2
- #define MODE_N 8
- #define INTERV 50
- byte pattern=0;
- byte state=0;
- volatile bool reseted=false;
- volatile byte mode = 0;
- void setup() {
- Serial.begin(9600);
- pinMode(CLK,OUTPUT);
- pinMode(DAT,OUTPUT);
- pinMode(KEY,INPUT);
- attachInterrupt(digitalPinToInterrupt(KEY),change_mode,RISING);
- interrupts();
- }
- void loop() {
- noInterrupts();
- debug();
- switch(mode){
- case 0:
- roll_R();
- break;
- case 1:
- roll_L();
- break;
- case 2:
- bounce();
- break;
- case 3:
- stack_L();
- break;
- case 4:
- blink_ALL();
- break;
- case 5:
- blink_OE();
- break;
- case 6:
- nibbleroll();
- break;
- case 7:
- OEroll();
- break;
- default:
- mode=0;
- reseted=false;
- }
- shiftOut(DAT,CLK,MSBFIRST,pattern);
- interrupts();
- delay(INTERV);
- }
- void debug(){
- Serial.print("M, S= ");
- Serial.print(mode);
- Serial.print(",");
- Serial.println(state);
- }
- void change_mode(){
- mode++;
- reseted=false;
- if(mode>=MODE_N){
- mode=0;
- }
- }
- void roll_L(){
- if(!reseted){
- pattern=0x08;
- reseted=true;
- }
- pattern<<=1;
- if(pattern==0){
- pattern=0x01;
- }
- return;
- }
- void roll_R(){
- if(!reseted){
- pattern=0x10;
- reseted=true;
- }
- pattern>>=1;
- if(pattern==0){
- pattern=0x80;
- }
- return;
- }
- void bounce(){
- if(!reseted){
- pattern=0x10;
- state=0;
- reseted=true;
- }
- if(state==0){
- pattern<<=1;
- if(pattern==0x80){
- state=1;
- }
- }else{
- pattern>>=1;
- if(pattern==0x01){
- state=0;
- }
- }
- return;
- }
- void stack_L(){
- if(!reseted){
- pattern=0x00;
- state=0;
- reseted=true;
- }
- if(state>=8){
- pattern=0x00;
- state=0;
- }
- byte rp=(pattern>>state)<<state;
- pattern&=~rp;
- rp>>=1;
- if(rp==0){
- rp=0x80;
- }
- pattern|=rp;
- state=succ_L(pattern);
- return;
- }
- byte succ_L(byte p){
- byte s=0;
- while((p&1)!=0){
- p>>=1;
- s++;
- }
- return s;
- }
- void blink_ALL(){
- if(!reseted){
- pattern=0x00;
- state=0;
- reseted=true;
- }
- if(state==0||state==3){
- pattern=~pattern;
- }
- state++;
- state%=5;
- return;
- }
- void blink_OE(){
- if(!reseted){
- pattern=0x00;
- state=0;
- reseted=true;
- }
- pattern=0;
- if((state&0x7)==0x7){
- pattern|=0x55;
- }
- if((state&0xB)==0xB){
- pattern|=0xAA;
- }
- state++;
- state&=0xF;
- return;
- }
- void nibbleroll(){
- if(!reseted){
- pattern=0x8;
- state=0;
- reseted=true;
- }
- if((pattern&0xF)!=0){
- pattern<<=4;
- }else{
- pattern>>=5;
- }
- if(pattern==0){
- pattern=0x8;
- }
- return;
- }
- void OEroll(){
- if(!reseted){
- pattern=0x80;
- reseted=true;
- }
- if(state==0){
- pattern>>=2;
- }else{
- pattern<<=2;
- }
- if(pattern==0){
- if(state==0){
- pattern=0x1;
- }else{
- pattern=0x80;
- }
- state=1-state;
- }
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement