Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <8051.h>
- // Define LED ports
- #define LEDS_LOW P0 // D1-D8 connected to P0.0-P0.7
- #define LEDS_HIGH P2 // D9-D16 connected to P2.0-P2.7
- // Button and motion sensor
- __sbit __at (0xB7) BUTTON; // P3.7 Button for changing display
- __sbit __at (0xB2) MOTION; // P3.2 Vibration/motion sensor
- // Number of messages
- #define NUM_MODES 3
- // Current message index
- unsigned char currentMode = 0;
- __bit lastButtonState = 1; // For button debouncing
- // Pattern for "LUKE"
- const __code unsigned char L_pattern[5] = {
- 0xFF, 0x7F, 0x7F, 0x7F, 0x7F // L
- };
- const __code unsigned char U_pattern[5] = {
- 0x80, 0xFF, 0xFF, 0xFF, 0x80 // U
- };
- const __code unsigned char K_pattern[5] = {
- 0xFF, 0xF7, 0xEF, 0xDF, 0xBF // K
- };
- const __code unsigned char E_pattern[5] = {
- 0xFF, 0x7F, 0x7F, 0x7F, 0x7F // E
- };
- // Pattern for "LOVE"
- const __code unsigned char O_pattern[5] = {
- 0x80, 0xFF, 0xFF, 0xFF, 0x80 // O
- };
- const __code unsigned char V_pattern[5] = {
- 0x07, 0xF8, 0xF8, 0xF8, 0x07 // V
- };
- // Pattern for "TIMBERS"
- const __code unsigned char T_pattern[5] = {
- 0x7F, 0x7F, 0xFF, 0x7F, 0x7F // T
- };
- const __code unsigned char I_pattern[5] = {
- 0x7F, 0x7F, 0xFF, 0x7F, 0x7F // I
- };
- const __code unsigned char M_pattern[5] = {
- 0xFF, 0x8F, 0xF3, 0x8F, 0xFF // M
- };
- const __code unsigned char B_pattern[5] = {
- 0xFF, 0x7F, 0x7F, 0x7F, 0x81 // B
- };
- const __code unsigned char R_pattern[5] = {
- 0xFF, 0x7E, 0x7D, 0x7B, 0x87 // R
- };
- const __code unsigned char S_pattern[5] = {
- 0x87, 0x7B, 0x7B, 0x7B, 0xE1 // S
- };
- // Spacer between characters
- const __code unsigned char SPACE[2] = {
- 0x00, 0x00
- };
- // Function declarations
- void delay_ms(unsigned int ms);
- void display_column(unsigned char pattern);
- void check_button(void);
- void display_message(void);
- // Speed control - ADJUST THESE VALUES for best results
- // 35-50ms is a good range for human waving
- #define COLUMN_DISPLAY_TIME 10 // Time each column is displayed (milliseconds)
- #define COLUMN_SPACE_TIME 8 // Time between columns (milliseconds)
- // Main function
- void main(void) {
- // Initialize ports
- LEDS_LOW = 0; // All LEDs off
- LEDS_HIGH = 0;
- // Main loop
- while(1) {
- check_button();
- display_message();
- }
- }
- // Function to check button and change display mode
- void check_button(void) {
- // Read button state (assumed active low with pull-up)
- __bit currentState = BUTTON;
- // Check if button state changed from HIGH to LOW (press)
- if (currentState == 0 && lastButtonState == 1) {
- // Debounce
- delay_ms(20);
- // Re-check button state
- if (BUTTON == 0) {
- // Button is pressed, go to next mode
- currentMode = (currentMode + 1) % NUM_MODES;
- // Small delay after button press
- delay_ms(200);
- }
- }
- lastButtonState = currentState;
- }
- // Function to display a message based on current mode
- void display_message(void) {
- unsigned char i;
- // Only display when in motion (optional)
- // To enable motion detection, change to if (MOTION == 1)
- if (1) {
- switch(currentMode) {
- case 0:
- // Display "LUKE"
- // Space at start
- display_column(SPACE[0]);
- display_column(SPACE[1]);
- // Letter L
- for(i = 0; i < 5; i++) {
- display_column(L_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter U
- for(i = 0; i < 5; i++) {
- display_column(U_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter K
- for(i = 0; i < 5; i++) {
- display_column(K_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter E
- for(i = 0; i < 5; i++) {
- display_column(E_pattern[i]);
- }
- // Space at end
- display_column(SPACE[0]);
- display_column(SPACE[1]);
- break;
- case 1:
- // Display "LOVE"
- // Space at start
- display_column(SPACE[0]);
- display_column(SPACE[1]);
- // Letter L
- for(i = 0; i < 5; i++) {
- display_column(L_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter O
- for(i = 0; i < 5; i++) {
- display_column(O_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter V
- for(i = 0; i < 5; i++) {
- display_column(V_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter E
- for(i = 0; i < 5; i++) {
- display_column(E_pattern[i]);
- }
- // Space at end
- display_column(SPACE[0]);
- display_column(SPACE[1]);
- break;
- case 2:
- // Display "TIMBERS"
- // Space at start
- display_column(SPACE[0]);
- display_column(SPACE[1]);
- // Letter T
- for(i = 0; i < 5; i++) {
- display_column(T_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter I
- for(i = 0; i < 5; i++) {
- display_column(I_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter M
- for(i = 0; i < 5; i++) {
- display_column(M_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter B
- for(i = 0; i < 5; i++) {
- display_column(B_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter E
- for(i = 0; i < 5; i++) {
- display_column(E_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter R
- for(i = 0; i < 5; i++) {
- display_column(R_pattern[i]);
- }
- // Space between letters
- display_column(SPACE[0]);
- // Letter S
- for(i = 0; i < 5; i++) {
- display_column(S_pattern[i]);
- }
- // Space at end
- display_column(SPACE[0]);
- display_column(SPACE[1]);
- break;
- }
- } else {
- // No motion detected, keep LEDs off
- LEDS_LOW = 0;
- LEDS_HIGH = 0;
- delay_ms(10);
- }
- }
- // Function to display a single column pattern
- void display_column(unsigned char pattern) {
- // Both ports use the same pattern
- // Uncomment the tilde (~) if your LEDs are active LOW
- LEDS_LOW = pattern; // Use ~pattern if LEDs are active LOW
- LEDS_HIGH = pattern; // Use ~pattern if LEDs are active LOW
- // Delay for human waving speed
- delay_ms(COLUMN_DISPLAY_TIME);
- // Turn off all LEDs between columns
- LEDS_LOW = 0x00; // Use 0xFF if LEDs are active LOW
- LEDS_HIGH = 0x00; // Use 0xFF if LEDs are active LOW
- // Small delay between columns
- delay_ms(COLUMN_SPACE_TIME);
- }
- // Function to provide millisecond delay
- void delay_ms(unsigned int ms) {
- unsigned int i, j;
- for(i = 0; i < ms; i++) {
- for(j = 0; j < 120; j++); // Approximately 1ms delay at 12MHz
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement