Advertisement
Guest User

POV Wand Code

a guest
Mar 29th, 2025
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.81 KB | None | 0 0
  1. #include <8051.h>
  2.  
  3. // Define LED ports
  4. #define LEDS_LOW P0    // D1-D8 connected to P0.0-P0.7
  5. #define LEDS_HIGH P2   // D9-D16 connected to P2.0-P2.7
  6.  
  7. // Button and motion sensor
  8. __sbit __at (0xB7) BUTTON;    // P3.7 Button for changing display
  9. __sbit __at (0xB2) MOTION;    // P3.2 Vibration/motion sensor
  10.  
  11. // Number of messages
  12. #define NUM_MODES 3
  13.  
  14. // Current message index
  15. unsigned char currentMode = 0;
  16. __bit lastButtonState = 1;  // For button debouncing
  17.  
  18. // Pattern for "LUKE"
  19. const __code unsigned char L_pattern[5] = {
  20.     0xFF, 0x7F, 0x7F, 0x7F, 0x7F  // L
  21. };
  22.  
  23. const __code unsigned char U_pattern[5] = {
  24.     0x80, 0xFF, 0xFF, 0xFF, 0x80  // U
  25. };
  26.  
  27. const __code unsigned char K_pattern[5] = {
  28.     0xFF, 0xF7, 0xEF, 0xDF, 0xBF  // K
  29. };
  30.  
  31. const __code unsigned char E_pattern[5] = {
  32.     0xFF, 0x7F, 0x7F, 0x7F, 0x7F  // E
  33. };
  34.  
  35. // Pattern for "LOVE"
  36. const __code unsigned char O_pattern[5] = {
  37.     0x80, 0xFF, 0xFF, 0xFF, 0x80  // O
  38. };
  39.  
  40. const __code unsigned char V_pattern[5] = {
  41.     0x07, 0xF8, 0xF8, 0xF8, 0x07  // V
  42. };
  43.  
  44. // Pattern for "TIMBERS"
  45. const __code unsigned char T_pattern[5] = {
  46.     0x7F, 0x7F, 0xFF, 0x7F, 0x7F  // T
  47. };
  48.  
  49. const __code unsigned char I_pattern[5] = {
  50.     0x7F, 0x7F, 0xFF, 0x7F, 0x7F  // I
  51. };
  52.  
  53. const __code unsigned char M_pattern[5] = {
  54.     0xFF, 0x8F, 0xF3, 0x8F, 0xFF  // M
  55. };
  56.  
  57. const __code unsigned char B_pattern[5] = {
  58.     0xFF, 0x7F, 0x7F, 0x7F, 0x81  // B
  59. };
  60.  
  61. const __code unsigned char R_pattern[5] = {
  62.     0xFF, 0x7E, 0x7D, 0x7B, 0x87  // R
  63. };
  64.  
  65. const __code unsigned char S_pattern[5] = {
  66.     0x87, 0x7B, 0x7B, 0x7B, 0xE1  // S
  67. };
  68.  
  69. // Spacer between characters
  70. const __code unsigned char SPACE[2] = {
  71.     0x00, 0x00
  72. };
  73.  
  74. // Function declarations
  75. void delay_ms(unsigned int ms);
  76. void display_column(unsigned char pattern);
  77. void check_button(void);
  78. void display_message(void);
  79.  
  80. // Speed control - ADJUST THESE VALUES for best results
  81. // 35-50ms is a good range for human waving
  82. #define COLUMN_DISPLAY_TIME 10    // Time each column is displayed (milliseconds)
  83. #define COLUMN_SPACE_TIME 8       // Time between columns (milliseconds)
  84.  
  85. // Main function
  86. void main(void) {
  87.     // Initialize ports
  88.     LEDS_LOW = 0;    // All LEDs off
  89.     LEDS_HIGH = 0;
  90.    
  91.     // Main loop
  92.     while(1) {
  93.         check_button();
  94.         display_message();
  95.     }
  96. }
  97.  
  98. // Function to check button and change display mode
  99. void check_button(void) {
  100.     // Read button state (assumed active low with pull-up)
  101.     __bit currentState = BUTTON;
  102.    
  103.     // Check if button state changed from HIGH to LOW (press)
  104.     if (currentState == 0 && lastButtonState == 1) {
  105.         // Debounce
  106.         delay_ms(20);
  107.        
  108.         // Re-check button state
  109.         if (BUTTON == 0) {
  110.             // Button is pressed, go to next mode
  111.             currentMode = (currentMode + 1) % NUM_MODES;
  112.            
  113.             // Small delay after button press
  114.             delay_ms(200);
  115.         }
  116.     }
  117.    
  118.     lastButtonState = currentState;
  119. }
  120.  
  121. // Function to display a message based on current mode
  122. void display_message(void) {
  123.     unsigned char i;
  124.    
  125.     // Only display when in motion (optional)
  126.     // To enable motion detection, change to if (MOTION == 1)
  127.     if (1) {  
  128.         switch(currentMode) {
  129.             case 0:
  130.                 // Display "LUKE"
  131.                 // Space at start
  132.                 display_column(SPACE[0]);
  133.                 display_column(SPACE[1]);
  134.                
  135.                 // Letter L
  136.                 for(i = 0; i < 5; i++) {
  137.                     display_column(L_pattern[i]);
  138.                 }
  139.                
  140.                 // Space between letters
  141.                 display_column(SPACE[0]);
  142.                
  143.                 // Letter U
  144.                 for(i = 0; i < 5; i++) {
  145.                     display_column(U_pattern[i]);
  146.                 }
  147.                
  148.                 // Space between letters
  149.                 display_column(SPACE[0]);
  150.                
  151.                 // Letter K
  152.                 for(i = 0; i < 5; i++) {
  153.                     display_column(K_pattern[i]);
  154.                 }
  155.                
  156.                 // Space between letters
  157.                 display_column(SPACE[0]);
  158.                
  159.                 // Letter E
  160.                 for(i = 0; i < 5; i++) {
  161.                     display_column(E_pattern[i]);
  162.                 }
  163.                
  164.                 // Space at end
  165.                 display_column(SPACE[0]);
  166.                 display_column(SPACE[1]);
  167.                 break;
  168.                
  169.             case 1:
  170.                 // Display "LOVE"
  171.                 // Space at start
  172.                 display_column(SPACE[0]);
  173.                 display_column(SPACE[1]);
  174.                
  175.                 // Letter L
  176.                 for(i = 0; i < 5; i++) {
  177.                     display_column(L_pattern[i]);
  178.                 }
  179.                
  180.                 // Space between letters
  181.                 display_column(SPACE[0]);
  182.                
  183.                 // Letter O
  184.                 for(i = 0; i < 5; i++) {
  185.                     display_column(O_pattern[i]);
  186.                 }
  187.                
  188.                 // Space between letters
  189.                 display_column(SPACE[0]);
  190.                
  191.                 // Letter V
  192.                 for(i = 0; i < 5; i++) {
  193.                     display_column(V_pattern[i]);
  194.                 }
  195.                
  196.                 // Space between letters
  197.                 display_column(SPACE[0]);
  198.                
  199.                 // Letter E
  200.                 for(i = 0; i < 5; i++) {
  201.                     display_column(E_pattern[i]);
  202.                 }
  203.                
  204.                 // Space at end
  205.                 display_column(SPACE[0]);
  206.                 display_column(SPACE[1]);
  207.                 break;
  208.                
  209.             case 2:
  210.                 // Display "TIMBERS"
  211.                 // Space at start
  212.                 display_column(SPACE[0]);
  213.                 display_column(SPACE[1]);
  214.                
  215.                 // Letter T
  216.                 for(i = 0; i < 5; i++) {
  217.                     display_column(T_pattern[i]);
  218.                 }
  219.                
  220.                 // Space between letters
  221.                 display_column(SPACE[0]);
  222.                
  223.                 // Letter I
  224.                 for(i = 0; i < 5; i++) {
  225.                     display_column(I_pattern[i]);
  226.                 }
  227.                
  228.                 // Space between letters
  229.                 display_column(SPACE[0]);
  230.                
  231.                 // Letter M
  232.                 for(i = 0; i < 5; i++) {
  233.                     display_column(M_pattern[i]);
  234.                 }
  235.                
  236.                 // Space between letters
  237.                 display_column(SPACE[0]);
  238.                
  239.                 // Letter B
  240.                 for(i = 0; i < 5; i++) {
  241.                     display_column(B_pattern[i]);
  242.                 }
  243.                
  244.                 // Space between letters
  245.                 display_column(SPACE[0]);
  246.                
  247.                 // Letter E
  248.                 for(i = 0; i < 5; i++) {
  249.                     display_column(E_pattern[i]);
  250.                 }
  251.                
  252.                 // Space between letters
  253.                 display_column(SPACE[0]);
  254.                
  255.                 // Letter R
  256.                 for(i = 0; i < 5; i++) {
  257.                     display_column(R_pattern[i]);
  258.                 }
  259.                
  260.                 // Space between letters
  261.                 display_column(SPACE[0]);
  262.                
  263.                 // Letter S
  264.                 for(i = 0; i < 5; i++) {
  265.                     display_column(S_pattern[i]);
  266.                 }
  267.                
  268.                 // Space at end
  269.                 display_column(SPACE[0]);
  270.                 display_column(SPACE[1]);
  271.                 break;
  272.         }
  273.     } else {
  274.         // No motion detected, keep LEDs off
  275.         LEDS_LOW = 0;
  276.         LEDS_HIGH = 0;
  277.         delay_ms(10);
  278.     }
  279. }
  280.  
  281. // Function to display a single column pattern
  282. void display_column(unsigned char pattern) {
  283.     // Both ports use the same pattern
  284.     // Uncomment the tilde (~) if your LEDs are active LOW
  285.     LEDS_LOW = pattern;   // Use ~pattern if LEDs are active LOW
  286.     LEDS_HIGH = pattern;  // Use ~pattern if LEDs are active LOW
  287.    
  288.     // Delay for human waving speed
  289.     delay_ms(COLUMN_DISPLAY_TIME);
  290.    
  291.     // Turn off all LEDs between columns
  292.     LEDS_LOW = 0x00;    // Use 0xFF if LEDs are active LOW
  293.     LEDS_HIGH = 0x00;   // Use 0xFF if LEDs are active LOW
  294.    
  295.     // Small delay between columns
  296.     delay_ms(COLUMN_SPACE_TIME);
  297. }
  298.  
  299. // Function to provide millisecond delay
  300. void delay_ms(unsigned int ms) {
  301.     unsigned int i, j;
  302.     for(i = 0; i < ms; i++) {
  303.         for(j = 0; j < 120; j++);  // Approximately 1ms delay at 12MHz
  304.     }
  305. }
Tags: Code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement