PIC18f programming using mikroc

Discussion in 'The Projects Forum' started by pr123, Mar 13, 2015.

  1. pr123

    Thread Starter Member

    Mar 13, 2015
    30
    0
    Hi,
    I want to program PIC18f such that i can switch on/off LED for different timings. Example if push button1 pressed the LED is on for 1 sec and off for 2 and this continues unless another button pressed which changes the time example 2 sec on and 4 sec off. I am doing this using delays however, the problem is that pic doesnt recognize when i press second button while first routine is on. that is during delay time. Please tell me where i'm going wrong. Thank you
     
  2. R!f@@

    AAC Fanatic!

    Apr 2, 2009
    8,750
    759
    Welcome to AAC.

    During delay time μC will not respond to inputs.
    I do not know yet how to go around tht but I know there are others here who can do tht.
    You have to wait a while for them to find your thread and post the code you already wrote.
     
  3. MCU88

    Member

    Mar 12, 2015
    360
    35
    Hello....

    Try having your delay broken down in an loop.

    Code (Text):
    1.  
    2.    // Delay
    3.    for (z = 0; z < 100; z++)
    4.    {
    5.       Delay_ms(1);
    6.       checkInputsButons();
    7.    }
    8.  
    The delay is 100mS + the time taken for the for next loop to execute, but stuck (non-responsive) -- to other functions for only 1mS at a time.
     
    ErnieM likes this.
  4. tshuck

    Well-Known Member

    Oct 18, 2012
    3,531
    675
    This is an example of when it's time to use interrupts.

    Either interrupt on change or timers would help you...
     
  5. MCU88

    Member

    Mar 12, 2015
    360
    35
    I have an project here that is basically just four buttons and four LEDs.

    What can be done with just four buttons and four LEDs?

    [​IMG]


    Have a read through some code here with button de-bouncing:

    Code (Text):
    1.  
    2.  
    3. // 16 in 1 LEDs 'n Buttons FUN
    4.  
    5. unsigned short nStart = 0;
    6. unsigned short dir = 0;
    7. unsigned short keyUp = 0;
    8. unsigned short keyDown = 0;
    9. unsigned short keyPress = 0;
    10. unsigned int randomNo = 0;
    11.  
    12. unsigned short i = 0;
    13. unsigned short j = 0;
    14. unsigned short k = 0;
    15. unsigned short e = 0;
    16. unsigned short s = 0;
    17. unsigned short simon[32]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    18.                            0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    19.  
    20.  
    21. #define dSW1 PORTA.F2
    22. #define dSW2 PORTA.F3
    23. #define dSW3 PORTA.F0
    24. #define dSW4 PORTA.F1
    25.  
    26. #define sw01 PORTB.F3
    27. #define sw02 PORTB.F2
    28. #define sw03 PORTB.F1
    29. #define sw04 PORTB.F0
    30.  
    31. #define ld01 PORTB.F4
    32. #define ld02 PORTB.F5
    33. #define ld03 PORTB.F6
    34. #define ld04 PORTB.F7
    35.  
    36. progressiveLed(int dir)
    37. {
    38.    i++;
    39.  
    40.    if (dir == 0)
    41.    {
    42.       switch (i)
    43.       {
    44.          case 1: ld01 = 1; break;
    45.          case 2: ld02 = 1; break;
    46.          case 3: ld03 = 1; break;
    47.          case 4: ld04 = 1; break;
    48.       }
    49.    }
    50.    else
    51.    {
    52.       switch (i)
    53.       {
    54.          case 1: ld04 = 1; break;
    55.          case 2: ld03 = 1; break;
    56.          case 3: ld02 = 1; break;
    57.          case 4: ld01 = 1; break;
    58.       }
    59.    }
    60.  
    61.    if (i == 5)
    62.    {
    63.       i = 0;
    64.       ld01 = 0;
    65.       ld02 = 0;
    66.       ld03 = 0;
    67.       ld04 = 0;
    68.    }
    69.  
    70.    Delay_ms(500);
    71. }
    72.  
    73. void timer(int period)
    74. {
    75.    do
    76.    { // Wait for user to press a key
    77.    } while (sw01 == 1 && sw02 == 1 && sw03 == 1 && sw04 == 1);
    78.  
    79.    // All leds on
    80.    ld01 = 1;
    81.    ld02 = 1;
    82.    ld03 = 1;
    83.    ld04 = 1;
    84.    
    85.    // Timer interval
    86.    if (period == 0)
    87.    {
    88.       Delay_ms(10000); // 1 min
    89.    }
    90.    else
    91.    {
    92.       delay_ms(30000); // 3 min
    93.    }
    94.    
    95.    // All leds off
    96.    ld01 = 0;
    97.    ld02 = 0;
    98.    ld03 = 0;
    99.    ld04 = 0;
    100. }
    101.  
    102. void randomLed(int decision)
    103. {
    104.    randomNo = rand();
    105.  
    106.    if (decision == 1)
    107.    {
    108.       do
    109.       {
    110.       } while (sw01 == 1 && sw02 == 1 && sw03 == 1 && sw04 == 1);
    111.      
    112.       for (j = 0; j < 10; j++)
    113.       {
    114.          for (i = 0; i < 4; i++)
    115.          {
    116.             ld01 = 0;
    117.             ld02 = 0;
    118.             ld03 = 0;
    119.             ld04 = 0;
    120.  
    121.             Delay_ms(40);
    122.          
    123.             switch (i)
    124.             {
    125.                case 0: ld01 = 1; break;
    126.                case 1: ld02 = 1; break;
    127.                case 2: ld03 = 1; break;
    128.                case 3: ld04 = 1; break;
    129.             }
    130.          
    131.             Delay_ms(40);
    132.          }
    133.       }
    134.    }
    135.  
    136.    ld01 = 0;
    137.    ld02 = 0;
    138.    ld03 = 0;
    139.    ld04 = 0;
    140.  
    141.    if (randomNo <  8000)
    142.    {
    143.       ld01 = 1;
    144.    }
    145.    else if (randomNo < 16000)
    146.    {
    147.       ld02 = 1;
    148.    }
    149.    else if (randomNo < 24000)
    150.    {
    151.       ld03 = 1;
    152.    }
    153.    else
    154.    {
    155.       ld04 = 1;
    156.    }
    157.    
    158.    if (decision == 0)
    159.    {
    160.       Delay_ms(500);
    161.    }
    162. }
    163.  
    164. void upBCDCounter()
    165. {
    166.    i++;
    167.    j = (i * 16);
    168.    PORTB = j;
    169.  
    170.    if (i > 15)
    171.    {
    172.       i = 0;
    173.    }
    174.  
    175.    Delay_ms(500);
    176. }
    177.  
    178. void dnBCDCounter()
    179. {
    180.    i++;
    181.    j = (240 - (i * 16));
    182.    PORTB = j;
    183.  
    184.    if (i > 15)
    185.    {
    186.       i = 0;
    187.    }
    188.  
    189.    Delay_ms(500);
    190. }
    191.  
    192. void onOffButtons()
    193. {
    194.  
    195.    if (keyDown == 0)
    196.    {
    197.       if (sw01 == 0)
    198.       {
    199.          ld01 = ! ld01;
    200.          keyDown = 1;
    201.       }
    202.       if (sw02 == 0)
    203.       {
    204.          ld02 = ! ld02;
    205.          keyDown = 1;
    206.       }
    207.       if (sw03 == 0)
    208.       {
    209.          ld03 = ! ld03;
    210.          keyDown = 1;
    211.       }
    212.       if (sw04 == 0)
    213.       {
    214.          ld04 = ! ld04;
    215.          keyDown = 1;
    216.       }
    217.    }
    218.  
    219.    if (sw01 == 1)
    220.    {
    221.       if (sw02 == 1)
    222.       {
    223.          if (sw03 == 1)
    224.          {
    225.             if (sw04 == 1)
    226.             {
    227.                keyDown = 0;
    228.             }
    229.           }
    230.        }
    231.     }
    232.  
    233.    // Debounce period
    234.    Delay_ms(50);
    235. }
    236.  
    237. void momentaryButtons()
    238. {
    239.    Delay_ms(50); // Debounce period
    240.    ld01 =! sw01;
    241.    ld02 =! sw02;
    242.    ld03 =! sw03;
    243.    ld04 =! sw04;
    244. }
    245.  
    246. void flasher()
    247. {
    248.    Delay_ms(500);
    249.    
    250.    ld01 = 0;
    251.    ld02 = 0;
    252.    ld03 = 0;
    253.    ld04 = 0;
    254.  
    255.    Delay_ms(500);
    256.  
    257.    ld01 = 1;
    258.    ld02 = 1;
    259.    ld03 = 1;
    260.    ld04 = 1;
    261. }
    262.  
    263. void alternateFlasher()
    264. {
    265.    Delay_ms(500);
    266.  
    267.    ld01 = 1;
    268.    ld02 = 1;
    269.    ld03 = 0;
    270.    ld04 = 0;
    271.  
    272.    Delay_ms(500);
    273.  
    274.    ld01 = 0;
    275.    ld02 = 0;
    276.    ld03 = 1;
    277.    ld04 = 1;
    278. }
    279.  
    280.  
    281. void ledChaser(int dir)
    282. {
    283.    if (i == 0)
    284.    {
    285.       if (dir == 0)
    286.       {
    287.          j = 16;
    288.       }
    289.       else
    290.       {
    291.          j = 128;
    292.       }
    293.    }
    294.    else
    295.    {
    296.       if (dir == 0)
    297.       {
    298.          j = j << 1;
    299.       }
    300.       else
    301.       {
    302.          j = j >> 1;
    303.       }
    304.    }
    305.  
    306.    i++;
    307.    PORTB = j;
    308.  
    309.    if (i == 4)
    310.    {
    311.       i = 0;
    312.    }
    313.  
    314.    Delay_ms(500);
    315. }
    316.  
    317. void ledScanner()
    318. {
    319.    if (i == 3)
    320.    {
    321.       i = 0;
    322.       dir++;
    323.  
    324.       if (dir == 2)
    325.       {
    326.          dir = 0;
    327.       }
    328.    }
    329.  
    330.    if (nStart == 0)
    331.    {
    332.       j = 16;
    333.       nStart = 1;
    334.    }
    335.  
    336.    PORTB = j;
    337.  
    338.    if (dir == 0)
    339.    {
    340.       j = j << 1;
    341.    }
    342.    else
    343.    {
    344.       j = j >> 1;
    345.    }
    346.  
    347.    Delay_ms(250);
    348.    i++;
    349. }
    350.  
    351. void simonSays()
    352. {
    353.  
    354.    ld01 = 0;
    355.    ld02 = 0;
    356.    ld03 = 0;
    357.    ld04 = 0;
    358.  
    359.    for (e = 0; e < k; e++)
    360.    {
    361.       randomNo = rand();
    362.  
    363.       if (randomNo <  8000)
    364.       {
    365.          ld01 = 1;
    366.          simon[e] = 1;
    367.       }
    368.       else if (randomNo < 16000)
    369.       {
    370.          ld02 = 1;
    371.          simon[e] = 2;
    372.       }
    373.       else if (randomNo < 24000)
    374.       {
    375.          ld03 = 1;
    376.          simon[e] = 3;
    377.       }
    378.       else
    379.       {
    380.          ld04 = 1;
    381.          simon[e] = 4;
    382.       }
    383.  
    384.       Delay_ms(1000);
    385.  
    386.       ld01 = 0;
    387.       ld02 = 0;
    388.       ld03 = 0;
    389.       ld04 = 0;
    390.  
    391.       Delay_ms(1000);
    392.  
    393.    }
    394.  
    395.    // User to repeat
    396.    for (e = 0; e < k; e++)
    397.    {
    398.       do
    399.       {
    400.          if (keyDown == 0)
    401.          {
    402.             if (sw01 == 0)
    403.             {
    404.                j = 1;
    405.                ld01 = 1;
    406.                keyDown = 1;
    407.             }
    408.             if (sw02 == 0)
    409.             {
    410.                j = 2;
    411.                ld02 = 1;
    412.                keyDown = 1;
    413.             }
    414.             if (sw03 == 0)
    415.             {
    416.                j = 3;
    417.                ld03 = 1;
    418.                keyDown = 1;
    419.             }
    420.             if (sw04 == 0)
    421.             {
    422.                j = 4;
    423.                ld04 = 1;
    424.                keyDown = 1;
    425.             }
    426.          }
    427.  
    428.          if (keyDown == 1)
    429.          {
    430.             if (sw01 == 1)
    431.             {
    432.                if (sw02 == 1)
    433.                {
    434.                   if (sw03 == 1)
    435.                   {
    436.                      if (sw04 == 1)
    437.                      {
    438.                         keyDown = 0;
    439.                         keyPress = 1;
    440.  
    441.                         ld01 = 0;
    442.                         ld02 = 0;
    443.                         ld03 = 0;
    444.                         ld04 = 0;
    445.                      }
    446.                   }
    447.                }
    448.             }
    449.          }
    450.       } while (keyPress == 0);
    451.  
    452.       keyPress = 0;
    453.       Delay_ms(200);
    454.      
    455.       if (simon[e] != j)
    456.       {
    457.          if (j != 0)
    458.          {
    459.             for (s = 0; s < 5; s++)
    460.             {
    461.                Delay_ms(500);
    462.                ld01 = 1;
    463.                ld02 = 1;
    464.                ld03 = 1;
    465.                ld04 = 1;
    466.  
    467.                Delay_ms(500);
    468.                ld01 = 0;
    469.                ld02 = 0;
    470.                ld03 = 0;
    471.                ld04 = 0;
    472.             }
    473.          }
    474.          k = 0;
    475.          break;
    476.       }
    477.       j = 0;
    478.    }
    479.    k++;
    480. }
    481.  
    482. void main()
    483. {
    484.  
    485.   // Configuration of ports etc ...
    486.  
    487.   CMCON      = 7;       // Disable analog comparators
    488.   TRISA      = 0x0F;    // 4 inputs 4 outputs
    489.   TRISB      = 0x0F;    // 4 inputs 4 outputs
    490.   PORTA      = 0x00;    // Init port, all pins low
    491.   PORTB      = 0x00;    // Init port, all pins low
    492.  
    493.   while(1)
    494.   {
    495.      if (dSW1 == 1 && dSW2 == 1 && dSW3 == 1 && dSW4 == 1)
    496.      {
    497.         momentaryButtons();
    498.      }
    499.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 1 && dSW4 == 1)
    500.      {
    501.         ledChaser(0);
    502.      }
    503.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 1 && dSW4 == 1)
    504.      {
    505.         ledChaser(1);
    506.      }
    507.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 1 && dSW4 == 1)
    508.      {
    509.         ledScanner();
    510.      }
    511.      else if (dSW1 == 1 && dSW2 == 1 && dSW3 == 0 && dSW4 == 1)
    512.      {
    513.         onOffButtons();
    514.      }
    515.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 0 && dSW4 == 1)
    516.      {
    517.         upBCDCounter();
    518.      }
    519.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 0 && dSW4 == 1)
    520.      {
    521.         dnBCDCounter();
    522.      }
    523.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 0 && dSW4 == 1)
    524.      {
    525.         randomLed(0);
    526.      }
    527.      else if (dSW1 == 1 && dSW2 == 1 && dSW3 == 1 && dSW4 == 0)
    528.      {
    529.         progressiveLed(0);
    530.      }
    531.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 1 && dSW4 == 0)
    532.      {
    533.         progressiveLed(1);
    534.      }
    535.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 1 && dSW4 == 0)
    536.      {
    537.         simonSays();
    538.      }
    539.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 1 && dSW4 == 0)
    540.      {
    541.         randomLed(1); // Decision Maker
    542.      }
    543.      else if (dSW1 == 1 && dSW2 == 1 && dSW3 == 0 && dSW4 == 0)
    544.      {
    545.         timer(0);
    546.      }
    547.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 0 && dSW4 == 0)
    548.      {
    549.         timer(1);
    550.      }
    551.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 0 && dSW4 == 0)
    552.      {
    553.         flasher();
    554.      }
    555.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 0 && dSW4 == 0)
    556.      {
    557.         alternateFlasher();
    558.      }
    559.   }
    560. }
    561.  
     
  6. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,386
    1,605
    With just four buttons and four LEDs I could, dare I say, RULE THE WORLD.

    Or just hijack someone else's thread. Please begin your own topic to discuss your project board.

    And welcome to the forums!
     
  7. MCU88

    Member

    Mar 12, 2015
    360
    35
    Arh it is applicable to topic and I think the OP will appreciate the code. Probably trying to achieve the same thing. But perhaps not on the same line of thought as in 'what the bloody hell can I make with just 33 one-cent parts'

    Thanks for the welcome! ;)
     
Loading...