unkwntech

LIFE STM8s

May 19th, 2015
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.49 KB | None | 0 0
  1. #include <intrinsics.h>
  2. #include <iostm8s103f3.h>
  3. #include "types.h"
  4. #include "system.c"
  5. #include "Random.c"
  6.  
  7. //------------------------------------------------------------------------------
  8. //
  9. //  Settings Modify these to suit your specific setup
  10. //
  11. #define ROWS 8
  12. #define COLUMNS 8
  13.  
  14. #define COLUMN0 PB_ODR_ODR0
  15. #define COLUMN1 PC_ODR_ODR6
  16. #define COLUMN2 PB_ODR_ODR2
  17. #define COLUMN3 PB_ODR_ODR3
  18. #define COLUMN4 PB_ODR_ODR4
  19. #define COLUMN5 PB_ODR_ODR5
  20. #define COLUMN6 PB_ODR_ODR6
  21. #define COLUMN7 PB_ODR_ODR7
  22.  
  23. #define ROW0 PD_ODR_ODR0
  24. #define ROW1 PC_ODR_ODR7
  25. #define ROW2 PD_ODR_ODR2
  26. #define ROW3 PD_ODR_ODR3
  27. #define ROW4 PD_ODR_ODR4
  28. #define ROW5 PD_ODR_ODR5
  29. #define ROW6 PD_ODR_ODR6
  30. #define ROW7 PD_ODR_ODR7
  31.  
  32. #define RNDSRC ADC
  33.  
  34. //------------------------------------------------------------------------------
  35. //
  36. //  End of settings, do not modify anything beyond this point
  37. //
  38.  
  39. char PREVField[ROWS][COLUMNS];
  40. char SNDPREVField[ROWS][COLUMNS];
  41. char field[ROWS][COLUMNS];
  42. char firstGen = 1;
  43.  
  44. void UpdateDisplay( void );
  45. void SetRow( char, char );
  46. void SetColumn( char, char );
  47. void Set( char, char, char );
  48. void Delay( int );
  49. void BlankDisplay( void );
  50. void DrawLetter( char );
  51. void IterateField( void );
  52. void ClearField( void );
  53.  
  54. #include "Patterns.c"
  55.  
  56.  
  57. //------------------------------------------------------------------------------
  58. //
  59. //  Iterate the the field when the interrupt fires
  60. //
  61. #pragma vector = TIM2_OVR_UIF_vector
  62. __interrupt void TIM2_UPD_OVF_IRQHandler()
  63. {
  64.   __disable_interrupt();
  65.  
  66.   IterateField();
  67.   //UpdateDisplay();
  68.   PC_ODR_ODR4 = !PC_ODR_ODR4;
  69.  
  70.   TIM2_SR1_UIF = 0;
  71.  
  72.   __enable_interrupt();
  73. }
  74.  
  75. //------------------------------------------------------------------------------
  76. //
  77. //  Setup the field wtih 0s
  78. //
  79. void InitField(char field[ROWS][COLUMNS])
  80. {
  81.   firstGen = 1;
  82.   ClearField();
  83.   return;
  84. }
  85.  
  86. //------------------------------------------------------------------------------
  87. //
  88. //  Check if the previous field is a duplicate of the current field.
  89. //
  90. char IsDuplicate()
  91. {
  92.   for(int i = 0; i < ROWS; i++)
  93.   {
  94.     for(int j = 0; j < COLUMNS; j++)
  95.     {
  96.       if(PREVField[i][j] != field[i][j] && SNDPREVField[i][j] != field[i][j])
  97.       {
  98.         return 0;
  99.       }
  100.     }
  101.   }
  102.   return 1;
  103. }
  104.  
  105. //------------------------------------------------------------------------------
  106. //
  107. //  Generate a random field
  108. //
  109. void GenerateRandomField( void )
  110. {
  111.   for(int i = 0; i < ROWS; i++)
  112.   {
  113.     for(int j = 0; j < COLUMNS; j++)
  114.     {
  115.       field[i][j] = GetRandomBit(RNDSRC);
  116.     }
  117.   }
  118. }
  119.  
  120. //------------------------------------------------------------------------------
  121. //
  122. //  Iterate the fields following the rules of Conway's game of life.
  123. //
  124. void IterateField()
  125. {
  126.   /*
  127.    *  First create a copy of the field we use the copy as a reference
  128.    *  the field is then updated directly.
  129.    *
  130.    */
  131.  
  132.   char fieldCopy[ROWS][COLUMNS];
  133.  
  134.   int count = 0;
  135.  
  136.   if(IsDuplicate())
  137.     GenerateRandomField();
  138.  
  139.   //Copy the current field to the comparison copy
  140.   for(int i = 0; i < ROWS; i++)
  141.   {
  142.       for(int j = 0; j < COLUMNS; j++)
  143.       {
  144.         {
  145.           SNDPREVField[i][j] = PREVField[i][j];
  146.           PREVField[i][j] = field[i][j];
  147.           fieldCopy[i][j] = field[i][j];
  148.         }
  149.     }
  150.   }
  151.  
  152.   for(int i = 0; i < ROWS; i++)
  153.   {
  154.     for(int j = 0; j < COLUMNS; j++)
  155.     {
  156.       count = 0;
  157.  
  158.       //if i < 1 no need to check left
  159.       //if j < 1 no need to check up
  160.  
  161.       //Up 1 Left 1
  162.       if((i > 0 && j > 0) && fieldCopy[i - 1][j - 1] == 1)
  163.         count++;
  164.  
  165.       //Up 1 Right 1
  166.       if((i > 0 && j < 7) && fieldCopy[i - 1][j + 1] == 1)
  167.         count++;
  168.  
  169.  
  170.       //Left 1
  171.       if(j > 0 && fieldCopy[i][j - 1] == 1)
  172.         count++;
  173.  
  174.       //Right 1
  175.       if(j < 7 && fieldCopy[i][j + 1] == 1)
  176.         count++;
  177.  
  178.       //down 1
  179.       if(i < 7 && fieldCopy[i + 1][j] == 1)
  180.         count++;
  181.  
  182.       //up 1
  183.       if(i > 0 && fieldCopy[i - 1][j] == 1)
  184.         count++;
  185.  
  186.  
  187.       //down 1 left 1
  188.       if((i < 7 && j > 0) && fieldCopy[i + 1][j - 1] == 1)
  189.         count++;
  190.       //down 1 right 1
  191.       if((i < 7 && j < 7) && fieldCopy[i + 1][j + 1] == 1)
  192.         count++;
  193.  
  194.       //<2 live neighbors, under-population
  195.       if(count < 2)
  196.         field[i][j] = 0;
  197.  
  198.       //2 or 3 live neighbords, lives
  199.       if(count == 3)
  200.         field[i][j]  = 1;
  201.  
  202.       //>3 live neighbors, over-population
  203.       if(count > 3)
  204.         field[i][j] = 0;
  205.     }
  206.   }
  207. }
  208.  
  209. //------------------------------------------------------------------------------
  210. //
  211. //  Shift the entire array left 1 column, loop the leftmost column to the right
  212. //
  213. void ShiftLeft( void )
  214. {
  215.   char leftmost[] = {0,0,0,0,0,0,0,0};
  216.  
  217.   for(int i = 0; i < ROWS; i++)
  218.   {
  219.     for(int j = 0; j < COLUMNS; j++)
  220.     {
  221.       if(j == 0)
  222.         leftmost[i] = field[i][j];
  223.  
  224.       if(j < COLUMNS - 1)
  225.         field[i][j] = field[i][j + 1];
  226.     }
  227.   }
  228.   for(int i = 0; i < 8; i++)
  229.   {
  230.     field[i][COLUMNS - 1] = leftmost[i];
  231.   }
  232. }
  233.  
  234. //------------------------------------------------------------------------------
  235. //
  236. // Shift the entire array right 1 column, loop the rightmost column to the left
  237. //
  238. void ShiftRight( void )
  239. {
  240.   char rightmost[] = {0,0,0,0,0,0,0,0};
  241.  
  242.   for(int i = 0; i < ROWS; i++)
  243.   {
  244.     for(int j = 0; j < COLUMNS; j++)
  245.     {
  246.       if(j == COLUMNS - 1)
  247.         rightmost[i] = field[i][j];
  248.  
  249.       if(j > 0)
  250.         field[i][j] = field[i][j - 1];
  251.     }
  252.   }
  253.   for(int i = 0; i < 8; i++)
  254.   {
  255.     field[i][0] = rightmost[i];
  256.   }
  257. }
  258.  
  259. //------------------------------------------------------------------------------
  260. //
  261. //  Update the display with the current field, and multiplex
  262. //
  263. void UpdateDisplay( void )
  264. {
  265.   for(int i = 0; i < ROWS; i++)
  266.   {
  267.     for(int j = 0; j < COLUMNS; j++)
  268.     {
  269.       BlankDisplay();
  270.       if(field[i][j])
  271.       {
  272.         ROW0 = (i == 0);
  273.         ROW1 = (i == 1);
  274.         ROW2 = (i == 2);
  275.         ROW3 = (i == 3);
  276.         ROW4 = (i == 4);
  277.         ROW5 = (i == 5);
  278.         ROW6 = (i == 6);
  279.         ROW7 = (i == 7);
  280.         COLUMN0 = !(j == 0);
  281.         COLUMN1 = !(j == 1);
  282.         COLUMN2 = !(j == 2);
  283.         COLUMN3 = !(j == 3);
  284.         COLUMN4 = !(j == 4);
  285.         COLUMN5 = !(j == 5);
  286.         COLUMN6 = !(j == 6);
  287.         COLUMN7 = !(j == 7);
  288.       }
  289.     }
  290.   }
  291. }
  292.  
  293. //------------------------------------------------------------------------------
  294. //
  295. //  Write the entire field to 0
  296. //
  297. void ClearField( void )
  298. {
  299.   for(int i = 0; i < ROWS; i++)
  300.   {
  301.     for(int j = 0; j < COLUMNS; j++)
  302.     {
  303.       field[i][j] = 0;
  304.     }
  305.   }
  306. }
  307.  
  308. //------------------------------------------------------------------------------
  309. //
  310. //  ReInit the display and flash the display
  311. //
  312. void Reset( void )
  313. {
  314.   FillDisplay();
  315.   Delay(10000);
  316.   BlankDisplay();
  317.   Delay(10000);
  318.   FillDisplay();
  319.   Delay(10000);
  320.   BlankDisplay();
  321.   Delay(10000);
  322.   InitField(field);
  323. }
  324.  
  325. //------------------------------------------------------------------------------
  326. //
  327. //
  328. //
  329. void main( void )
  330. {
  331.   //Disable interrupts while everything is setup
  332.   __disable_interrupt();
  333.  
  334.   //Initialise hardware and software
  335.   init();
  336.  
  337.   //Setup the array with 0s
  338.   InitField(field);
  339.  
  340.   //Generate a random field
  341.   //GenerateRandomField();
  342.  
  343.   //Generate a glider, bottom left
  344.   CreateGlider();
  345.  
  346.   //enable interrupts so that iterations can start taking place
  347.   __enable_interrupt();
  348.  
  349.   //Main Loop
  350.   while(TRUE)
  351.   {
  352.     //Update the display & keep the multiplexing going;
  353.     UpdateDisplay();
  354.   }
  355. }
Advertisement
Add Comment
Please, Sign In to add comment