Advertisement
leo3065

[Arduino] LED Blinker

Dec 17th, 2016
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.00 KB | None | 0 0
  1. #define DAT 6
  2. #define CLK 7
  3. #define KEY 2
  4.  
  5. #define MODE_N 8
  6. #define INTERV 50
  7.  
  8. byte pattern=0;
  9. byte state=0;
  10. volatile bool reseted=false;
  11. volatile byte mode = 0;
  12.  
  13. void setup() {
  14.   Serial.begin(9600);
  15.   pinMode(CLK,OUTPUT);
  16.   pinMode(DAT,OUTPUT);
  17.   pinMode(KEY,INPUT);
  18.   attachInterrupt(digitalPinToInterrupt(KEY),change_mode,RISING);
  19.   interrupts();
  20. }
  21.  
  22. void loop() {
  23.   noInterrupts();
  24.   debug();
  25.   switch(mode){
  26.     case 0:
  27.       roll_R();
  28.       break;
  29.     case 1:
  30.       roll_L();
  31.       break;
  32.     case 2:
  33.       bounce();
  34.       break;
  35.     case 3:
  36.       stack_L();
  37.       break;
  38.     case 4:
  39.       blink_ALL();
  40.       break;
  41.     case 5:
  42.       blink_OE();
  43.       break;
  44.     case 6:
  45.       nibbleroll();
  46.       break;
  47.     case 7:
  48.       OEroll();
  49.       break;
  50.     default:
  51.       mode=0;
  52.       reseted=false;
  53.   }
  54.   shiftOut(DAT,CLK,MSBFIRST,pattern);
  55.   interrupts();
  56.   delay(INTERV);
  57. }
  58.  
  59. void debug(){
  60.   Serial.print("M, S=  ");
  61.   Serial.print(mode);
  62.   Serial.print(",");
  63.   Serial.println(state);
  64. }
  65.  
  66. void change_mode(){
  67.   mode++;
  68.   reseted=false;
  69.   if(mode>=MODE_N){
  70.     mode=0;
  71.   }
  72. }
  73.  
  74. void roll_L(){
  75.   if(!reseted){
  76.     pattern=0x08;
  77.     reseted=true;
  78.   }
  79.   pattern<<=1;
  80.   if(pattern==0){
  81.     pattern=0x01;
  82.   }
  83.   return;
  84. }
  85.  
  86. void roll_R(){
  87.   if(!reseted){
  88.     pattern=0x10;
  89.     reseted=true;
  90.   }
  91.   pattern>>=1;
  92.   if(pattern==0){
  93.     pattern=0x80;
  94.   }
  95.   return;
  96. }
  97.  
  98.  
  99. void bounce(){
  100.   if(!reseted){
  101.     pattern=0x10;
  102.     state=0;
  103.     reseted=true;
  104.   }
  105.   if(state==0){
  106.     pattern<<=1;
  107.     if(pattern==0x80){
  108.       state=1;
  109.     }
  110.   }else{
  111.     pattern>>=1;
  112.     if(pattern==0x01){
  113.       state=0;
  114.     }
  115.   }
  116.   return;
  117. }
  118.  
  119. void stack_L(){
  120.   if(!reseted){
  121.     pattern=0x00;
  122.     state=0;
  123.     reseted=true;
  124.   }
  125.   if(state>=8){
  126.     pattern=0x00;
  127.     state=0;
  128.   }
  129.   byte rp=(pattern>>state)<<state;
  130.   pattern&=~rp;
  131.   rp>>=1;
  132.   if(rp==0){
  133.     rp=0x80;
  134.   }
  135.   pattern|=rp;
  136.   state=succ_L(pattern);
  137.   return;
  138. }
  139.  
  140. byte succ_L(byte p){
  141.   byte s=0;
  142.   while((p&1)!=0){
  143.     p>>=1;
  144.     s++;
  145.   }
  146.   return s;
  147. }
  148.  
  149. void blink_ALL(){
  150.   if(!reseted){
  151.     pattern=0x00;
  152.     state=0;
  153.     reseted=true;
  154.   }
  155.   if(state==0||state==3){
  156.     pattern=~pattern;
  157.   }
  158.   state++;
  159.   state%=5;
  160.   return;
  161. }
  162.  
  163. void blink_OE(){
  164.   if(!reseted){
  165.     pattern=0x00;
  166.     state=0;
  167.     reseted=true;
  168.   }
  169.   pattern=0;
  170.   if((state&0x7)==0x7){
  171.     pattern|=0x55;
  172.   }
  173.   if((state&0xB)==0xB){
  174.     pattern|=0xAA;
  175.   }
  176.   state++;
  177.   state&=0xF;
  178.   return;
  179. }
  180.  
  181.  
  182.  
  183. void nibbleroll(){
  184.   if(!reseted){
  185.     pattern=0x8;
  186.     state=0;
  187.     reseted=true;
  188.   }
  189.   if((pattern&0xF)!=0){
  190.     pattern<<=4;
  191.   }else{
  192.     pattern>>=5;
  193.   }
  194.   if(pattern==0){
  195.     pattern=0x8;
  196.   }
  197.   return;
  198. }
  199.  
  200. void OEroll(){
  201.   if(!reseted){
  202.     pattern=0x80;
  203.     reseted=true;
  204.   }
  205.   if(state==0){
  206.     pattern>>=2;
  207.   }else{
  208.     pattern<<=2;
  209.   }
  210.   if(pattern==0){
  211.     if(state==0){
  212.       pattern=0x1;
  213.     }else{
  214.       pattern=0x80;
  215.     }
  216.     state=1-state;
  217.   }
  218.   return;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement