Morse code in c for keil 8051 microcontroler

Discussion in 'Embedded Systems and Microcontrollers' started by kasuci, Jan 26, 2012.

  1. kasuci

    Thread Starter New Member

    Jan 26, 2012
    4
    0
    I apologize in advence if there is another open thread about this.

    I'm trying to write a program in "c" for keil 8051 microcontroler which would
    as input "take scan if the key on a PC keyboard has been pressed and if it was than interpret which key it was" and send it out to a external speeker on
    port 1.0 as a morse code sound.

    Please help. I haven't had much chance to work in c so help is greatly appreciated.
     
  2. t06afre

    AAC Fanatic!

    May 11, 2009
    5,939
    1,222
    I do not know keil C. But this can quite simple be implemented with two look up tables. One lookup table contains dash and dots stored binary as bits (1 for dash and zero for dot). The other table contains the total of dash/dots. The letter A is dot dash so the lenght is two. But the letter J is dot das dash dash so the a total of four tones should be played
     
  3. John P

    AAC Fanatic!

    Oct 14, 2008
    1,634
    224
    You could combine the 2 tables if you said that the top 3 bits of a byte contained the number of beeps, and the bottom 5 contained the actual data. There might be some reason to split the byte 2 and 6, or 4 and 4 instead. There's certainly extra space available.
     
  4. kasuci

    Thread Starter New Member

    Jan 26, 2012
    4
    0
    I tried but I have no luck (not to mention knowledge).
    If someone could write the program I'd be really greatfull.
     
  5. kasuci

    Thread Starter New Member

    Jan 26, 2012
    4
    0
    OK. Here is what I've got now

    Code ( (Unknown Language)):
    1.  
    2. #include <c:\Keil\Reg535.h>
    3. #include <c:\Keil\M535.h>
    4. #include <c:\Keil\stdio.h>
    5.  
    6. sbit out=P4^7;
    7.  
    8.  
    9. data unsigned int count;
    10. code unsigned char tablica[2][4][6][8]= {{1,1,0,2}, {1,1,2,2}};
    11. code unsigned char TablicaA[2]={0,1};  //tablica trajanja za 'a'
    12. code unsigned char TablicaB[4]={1,0,0,0}; //tablica trajanja za 'b'
    13. code unsigned char TablicaC[6]={1,0,1,0,};
    14. code unsigned char TablicaD[8]={1,0,0};
    15. code unisgned ;char TablicaE[2]={0};
    16. code unsigned char TablicaF[4]={0,0,1,0};
    17. code unsigned char TablicaG[6]={1,1,0};
    18. code unsigned char TablicaH[8]={0,0,0,0};
    19. code unsigned ;char TablicaI[2]={0,0};
    20. code unsigned char TablicaJ[4]={0,1,1,1};
    21. code unsigned char TablicaK[6]={1,0,1};
    22. code unsigned char TablicaL[8]={0,1,0,0};
    23. code unsigned ;char TablicaM[2]={1,1};
    24. code unsigned char TablicaN[4]={1,0};
    25. code unsigned char TablicaO[6]={1,1,1};
    26. code unsigned char TablicaP[8]={0,1,1,0};
    27. code unsigned ;char TablicaQ[2]={1,1,0,1};
    28. code unsigned char TablicaR[4]={0,1,0};
    29. code unsigned char TablicaS[6]={0,0,0};
    30. code unsigned char TablicaT[8]={1};
    31. code unsigned ;char TablicaU[2]={0,0,1};
    32. code unsigned char TablicaV[4]={0,0,0,1};
    33. code unsigned char TablicaW[6]={0,1,1};
    34. code unsigned char TablicaX[8]={1,0,0,1};
    35. code unsigned ;char TablicaY[2]={1,0,1,1};
    36. code unsigned char TablicaZ[4]={1,1,0,0};
    37. //-------------------------------------------------------------------
    38. main()
    39. {
    40.     while(1)
    41.     {
    42.         data unsigned char z;
    43.         z=GetKey();
    44.  
    45.         if(z == 'a')
    46.         {
    47.             for(count = 0; count < 2; count++)
    48.             {
    49.                 out = 1;
    50.                 if(TablicaA[count]==0)
    51.                     Delay(100);
    52.                 else
    53.                     Delay(300);
    54.                 out = 0;
    55.                     Delay(100);
    56.             }
    57.         }
    58.         else if(z == 'b')
    59.         {
    60.             for(count = 0; count < 4; count++)
    61.             {
    62.                 out = 1;
    63.                 if(TablicaB[count]==0)
    64.                     Delay(100);
    65.                 else
    66.                     Delay(300);
    67.                 out = 0;
    68.                     Delay(100);
    69.             }
    70.         }
    71.         if (z== 'c')
    72.         {
    73.             for(count = 0; count < 6; count ++)
    74.             {
    75.                 out =1;
    76.                 if(TablicaC[count]==0)
    77.                      Delay(100);
    78.                 else
    79.                      Delay(300);
    80.                 out = 0;
    81.                      Delay(100);
    82.                }
    83.         }
    84.         else if(z=='d')
    85.         {
    86.                for(count = 0; count < 8; count++)
    87.                {
    88.                 out = 1;
    89.                 if(TablicaD[count]==0)
    90.                       Delay(100);
    91.                 else
    92.                       Delay(300);
    93.                 out = 0;
    94.                       Delay(100);
    95.               }
    96.         }
    97.         if(z=='e')
    98.         {
    99.                for(count = 0; count < 2; count++);
    100.                {
    101.                 out = 1;
    102.                 if(TablicaE[count]==0)
    103.                        Delay(100);
    104.                 else
    105.                        Delay(300);
    106.                 out = 0;
    107.                        Delay(100);
    108.                }
    109.         }
    110.         else if(z=='f')
    111.         {
    112.             for(count = 0; count < 4; count++)
    113.             {
    114.                 out = 1;
    115.                 if(TablicaF[count]==0)
    116.                        Delay(100);
    117.                 else
    118.                       Delay(300);
    119.                 out = 0;
    120.                        Delay(100);
    121.             }
    122.         }
    123.         if(z=='g')
    124.         {
    125.             for(count = 0; count < 6; count++)
    126.             {
    127.                 out = 1;
    128.                 if(TablicaG[count]==0)
    129.                     Delay(100);
    130.                 else
    131.                     Delay(300);
    132.                 out = 0;
    133.                     Delay(100);
    134.             }
    135.         }
    136.         else if(z=='h')
    137.         {
    138.             for(count = 0; count < 8; count++)
    139.             {
    140.                 out = 1;
    141.                 if(TablicaH[count]==0)
    142.                     Delay(100);
    143.                 else
    144.                     Delay(300);
    145.                 out = 0;
    146.                     Delay(100);
    147.             }
    148.         }
    149.         if(z=='i')
    150.         {
    151.             for(count = 0; count < 2; count++)
    152.             {
    153.                 out = 1;
    154.                 if(TablicaI[count]==0)
    155.                     Delay(100);
    156.                 else
    157.                     Delay(300);
    158.                 out = 0;
    159.                     Delay(100);
    160.             }
    161.         }
    162.         else if(z=='j')
    163.         {
    164.             for(count = 0; count < 4; count++)
    165.             {
    166.                 out = 1;
    167.                 if(TablicaJ[count]==0)
    168.                     Delay(100);
    169.                 else
    170.                     Delay(300);
    171.                 out = 0;
    172.                     Delay(100);
    173.             }
    174.         }
    175.         if(z=='k')
    176.         {
    177.             for(count = 0; count < 6; count++)
    178.             {
    179.                 out = 1;
    180.                 if(TablicaK[count]==0)
    181.                     Delay(100);
    182.                 else
    183.                     Delay(300);
    184.                 out = 0;
    185.                     Delay(100);
    186.             }
    187.         }
    188.         else if(z=='l')
    189.         {
    190.             for(count = 0; count < 8; count++)
    191.             {
    192.                 out = 1;
    193.                 if(TablicaL[count]==0)
    194.                     Delay(100);
    195.                 else
    196.                     Delay(300);
    197.                 out = 0;
    198.                     Delay(100);
    199.             }
    200.         }
    201.         if(z=='m')
    202.         {
    203.             for(count = 0; count < 2; count++)
    204.             {
    205.                 out = 1;
    206.                 if(TablicaM[count]==0)
    207.                     Delay(100);
    208.                 else
    209.                     Delay(300);
    210.                 out = 0;
    211.                     Delay(100);
    212.             }
    213.         }
    214.         else if(z=='n')
    215.         {
    216.             for(count = 0; count < 4; count++)
    217.             {
    218.                 out = 1;
    219.                 if(TablicaN[count]==0)
    220.                     Delay(100);
    221.                 else
    222.                     Delay(300);
    223.                 out = 0;
    224.                     Delay(100);
    225.             }
    226.         }
    227.         if(z=='o')
    228.         {
    229.             for(count = 0; count < 6; count++)
    230.             {
    231.                 out = 1;
    232.                 if(TablicaO[count]==0)
    233.                     Delay(100);
    234.                 else
    235.                     Delay(300);
    236.                 out = 0;
    237.                     Delay(100);
    238.             }
    239.         }
    240.         else if(z=='p')
    241.         {
    242.             for(count = 0; count < 8; count++)
    243.             {
    244.                 out = 1;
    245.                 if(TablicaP[count]==0)
    246.                     Delay(100);
    247.                 else
    248.                     Delay(300);
    249.                 out = 0;
    250.                     Delay(100);
    251.             }
    252.         }
    253.         if(z=='q')
    254.         {
    255.             for(count = 0; count < 2; count++)
    256.             {
    257.                 out = 1;
    258.                 if(TablicaQ[count]==0)
    259.                     Delay(100);
    260.                 else
    261.                     Delay(300);
    262.                 out = 0;
    263.                     Delay(100);
    264.             }
    265.         }
    266.         else if(z=='r')
    267.         {
    268.             for(count = 0; count < 4; count++)
    269.             {
    270.                 out = 1;
    271.                 if(TablicaR[count]==0)
    272.                     Delay(100);
    273.                 else
    274.                     Delay(300);
    275.                 out = 0;
    276.                     Delay(100);
    277.             }
    278.         }
    279.         if(z=='s')
    280.         {
    281.             for(count = 0; count < 6; count++)
    282.             {
    283.                 out = 1;
    284.                 if(TablicaS[count]==0)
    285.                     Delay(100);
    286.                 else
    287.                     Delay(300);
    288.                 out = 0;
    289.                     Delay(100);
    290.             }
    291.         }
    292.         else if(z=='t')
    293.         {
    294.             for(count = 0; count < 8; count++)
    295.             {
    296.                 out = 1;
    297.                 if(TablicaT[count]==0)
    298.                     Delay(100);
    299.                 else
    300.                     Delay(300);
    301.                 out = 0;
    302.                     Delay(100);
    303.             }
    304.         }
    305.         if(z=='u')
    306.         {
    307.             for(count = 0; count < 2; count++)
    308.             {
    309.                 out = 1;
    310.                 if(TablicaU[count]==0)
    311.                     Delay(100);
    312.                 else
    313.                     Delay(300);
    314.                 out = 0;
    315.                     Delay(100);
    316.             }
    317.         }
    318.         else if(z=='v')
    319.         {
    320.             for(count = 0; count < 4; count++)
    321.             {
    322.                 out = 1;
    323.                 if(TablicaV[count]==0)
    324.                     Delay(100);
    325.                 else
    326.                     Delay(300);
    327.                 out = 0;
    328.                     Delay(100);
    329.             }
    330.         }
    331.         if(z=='w')
    332.         {
    333.             for(count = 0; count < 6; count++)
    334.             {
    335.                 out = 1;
    336.                 if(TablicaW[count]==0)
    337.                     Delay(100);
    338.                 else
    339.                     Delay(300);
    340.                 out = 0;
    341.                     Delay(100);
    342.             }
    343.         }
    344.         else if(z=='x')
    345.         {
    346.             for(count = 0; count < 8; count++)
    347.             {
    348.                 out = 1;
    349.                 if(TablicaX[count]==0)
    350.                     Delay(100);
    351.                 else
    352.                     Delay(300);
    353.                 out = 0;
    354.                     Delay(100);
    355.             }
    356.         }
    357.         .......
    358.                
    359.  
    360.  
    361.  
    362.         out = 0;
    363.  
    364.     }      
    365. }
    366.  
    367.  
    The problem now is that it says line 37,41 and 45 "array[]" over initilized or
    something like that.
    I really don't know where the problem is.

    Line 37 is the one with TablicaQ
     
    Last edited by a moderator: Apr 3, 2012
  6. THE_RB

    AAC Fanatic!

    Feb 11, 2008
    5,435
    1,305
    That's a messy way to do it! :eek:

    Have a look at this project, it has source code in C that might give you some ideas;
    http://www.romanblack.com/shift1/sh1_projects.htm (bottom project on page)
    it generates official timing for the morse characters (Paris standard) with official WPM (words per minute).

    Source code is for the PIC 12F675 but may work on other micros if you change it as needed to suit.
     
  7. MMcLaren

    Well-Known Member

    Feb 14, 2010
    759
    116
    hi kasuci,

    One relatively efficient technique for representing Morse character dit and dah elements in an array involves using an extra '1' bit as a terminator immediately following the dit (0) and/or dah (1) bits. This allows for storing Morse character patterns up to seven elements in length and it doesn't force you to use a counter variable when parsing the dit/dah pattern. Use a null pattern that contains just the terminator bit (0b10000000) when you encounter the space character, or any non-Morse character, as input.

    Code ( (Unknown Language)):
    1. ;
    2. ;    rom char morse[] = { 0b11001110,   // ',' (44) dah-dah-di-di-dah-dah
    3. ;                         0b10000110,   // '-' (45) dah-di-di-di-di-dah
    4. ;                         0b01010110,   // '.' (46) di-dah-di-dah-di-dah
    5. ;                         0b10010100,   // '/' (47) dah-di-di-dah-dit
    6. ;                         0b11111100,   // '0' (48) dah-dah-dah-dah-dah
    7. ;                         0b01111100,   // '1' (49) di-dah-dah-dah-dah
    8. ;                         0b00111100,   // '2' (50) di-di-dah-dah-dah
    9. ;                         0b00011100,   // '3' (51) di-di-di-dah-dah
    10. ;                         0b00001100,   // '4' (52) di-di-di-di-dah
    11. ;                         0b00000100,   // '5' (53) di-di-di-di-dit
    12. ;                         0b10000100,   // '6' (54) dah-di-di-di-dit
    13. ;                         0b11000100,   // '7' (55) dah-dah-di-di-dit
    14. ;                         0b11100100,   // '8' (56) dah-dah-dah-di-dit
    15. ;                         0b11110100,   // '9' (57) dah-dah-dah-dah-dit
    16. ;                         0b10000000,   // ':' (58) null
    17. ;                         0b10000000,   // ';' (59) null
    18. ;                         0b10000000,   // '<' (60) null
    19. ;                         0b10000000,   // '=' (61) null
    20. ;                         0b10000000,   // '>' (62) null
    21. ;                         0b00110010,   // '?' (63) di-di-dah-dah-di-dit
    22. ;                         0b10000000,   // '@' (64) null
    23. ;                         0b01100000,   // 'A' (65) di-dah
    24. ;                         0b10001000,   // 'B' (66) dah-di-di-dit
    25. ;                         0b10101000,   // 'C' (67) dah-di-dah-dit
    26. ;                         0b10010000,   // 'D' (68) dah-di-dit
    27. ;                         0b01000000,   // 'E' (69) dit
    28. ;                         0b00101000,   // 'F' (70) di-di-dah-dit
    29. ;                         ~~~~
    30. ;                         0b10011000,   // 'X' (88) dah-di-di-dah
    31. ;                         0b10111000,   // 'Y' (89) day-di-dah-dah
    32. ;                         0b11001000 }; // 'Z' (90) dah-dah-di-dit
    33. ;
    34.  
    Processing this type of Morse character pattern is relatively straight forward, as can be seen in this pseudo C code example;

    Code ( (Unknown Language)):
    1. ;    ~~~~
    2. ;    static unsigned char mchar = 128;  //
    3. ;
    4. ;    ~~~~
    5. ;    if(rxchar >= 97) rxchar -= 32;     // lower to upper case alpha
    6. ;    if((rxchar>=44) && (rxchar<=90))   // if in array range
    7. ;      mchar = morse[rxchar-44];        // get morse element pattern
    8. ;   /*                                                                 *
    9. ;    *  send Morse dit/dah elements (mchar = 0b10000000 on exit)       *
    10. ;    *                                                                 */
    11. ;    while(mchar != 128)                // while elements remain
    12. ;    { sendmorse(mchar.7);              // send dit (0) or dah (1)
    13. ;      ditspace(1);                     // inter-element 1 dit space
    14. ;      mchar <<= 1;                     // shift next element into b7
    15. ;    }                                  //
    16. ;    ditspace(2);                       // inter-char space (3)
    17. ;    if(rxchar == '.') ditspace(4);     // inter-word space (7)
    18. ;    if(rxchar == ',') ditspace(4);     // inter-word space (7)
    19. ;    if(rxchar == '?') ditspace(4);     // inter-word space (7)
    20. ;    if(rxchar == ' ') ditspace(5);     // inter-word space (7)
    21. ;
    22.  
    Hope this helps. Good luck with your project.

    Cheerful regards, Mike
     
    Last edited: Sep 21, 2016
  8. panic mode

    Senior Member

    Oct 10, 2011
    1,320
    304
    i just glanced the code and it seems that Q was declared as array[2] (elements 0, 1, 2) but assigned value had one extra element.
     
  9. kasuci

    Thread Starter New Member

    Jan 26, 2012
    4
    0
    Thank you all for your input.
    I mannaged to solve problems and everything is working
    as it was asked in the assigment.

    Next one will be more complicated and more specific in details I guess.
     
  10. MMcLaren

    Well-Known Member

    Feb 14, 2010
    759
    116
    kasuci,

    That's great. What did your array and final code look like?

    Regards... Mike
     
Loading...