Jarvis @ JM.me

Micro Processor Lab

Oct 6, 2024 · 50min امیرمحمد - حامد سربازی

Little practice for Micro Processor Lab

(حل و پاسخ تمارین آز ریزپردازنده)

Practice 1

Use 8 LED and light them up in simulator

Devices :

  • ATMEGA32
  • LED-RED

CODE

/*
 * Flasher.c
 *
 * Created: 9/29/2024 11:13:44 AM
 * Author: AMIR-MOHAMMAD-SAFARI
 */

#include <delay.h>
#include <mega32.h>

int i;
void main(void) {
    DDRD = 0xFF;  // Set PORTD as output
    while (1) {
        // First loop to shift bits from 1 to 128
        for (i = 1; i <= 128; i = i * 2) {
            PORTD = i;
            delay_ms(100);
        }

        // Second loop to shift bits from 64 back to 1
        for (i = 64; i >= 1; i = i / 2) {
            PORTD = i;
            delay_ms(100);
        }
    }
}

Schematic


Practice 2

Light up the LED Counter in simulator

  • 0 to 9
  • 9 to 0
  • Speed of counting
  • Count 0 to 5

Devices :

  • ATMEGA32
  • 7SEGMENT
  • SW-SPDT
  • 7447 Decoder

CODE 0 to 9 and 9 to 0

/*
 * CounterLED.c
 *
 * Created: 10/6/2024 9:43:52 AM
 * Author: AMIR-MOHAMMAD-SAFARI
 */

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

void main (void) {
    DDRC.0 = 0;
    DDRA = 0xFF;

    while(1) {
        if (PINC.0 == 1) {
            int i = 0;

            while(i < 10) {
                PORTA = i;
                i++;
                delay_ms(50); // Speed 50 MS
            }
        }
        else {
            int i = 9;
            while(i >= 0) {
                PORTA = i;
                i--;
                delay_ms(50); // Speed 50 MS
            }
        }
    }
}

Changes that count 0 to 5

while(i < 5) {
    PORTA = i;
    i++;
    delay_ms(50);
}
else {
    int i = 5;
	while(i >= 0) {
	    PORTA = i;
	    i--;
	    delay_ms(50);
	}
}

Schematic


Practice 3

Algorithm that show Sum and Multiply of numbers and show on LED

We have 4 SW_SPDT

  • A0 and A1
  • B0 and B1

Current project is on ATMEGA32

Devices :

  • ATMEGA32
  • SW-SPDT
  • 7447 Decoder
  • 7SEGMENT

CODE

/*
 * LED_StarPlus.c
 *
 * Created: 10/13/2024 8:23:08 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

void main (void) {
    DDRD = 0xFF;
    DDRC.0 = 0;
    DDRA = 0x00;
    DDRB = 0x00;
    
    while (1) {
        if (PINC.0 == 1) {
            PORTD = PINA + PINB;
        }
        else {
            PORTD = PINA * PINB;
        }
    }
}

Schematic


Practice 4

Showing something on LCD, which is LM016L. We can even clear screen or change position of things on LCD.

Current project is on ATMEGA32

Devices :

  • LM016L
  • ATMEGA32

CODE

/*
 * LCD_16Bit_Code_C.c
 *
 * Created: 10/20/2024 8:13:19 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

#asm
    .equ __lcd_port = 0x18;
#endasm

#include <lcd.h>

void main(void) {
    PORTB = 0x00;
    DDRB = 0x00;
    
    lcd_init(16);
    lcd_clear();
    
    lcd_gotoxy(0,0);
	lcd_putsf("Amir Mohammad");
	
    lcd_gotoxy(9,1);
	lcd_putsf("Safari");
}

Schematic

Scroll Practice 4 - 1

Now the data shown in LCD will be scroll horizontally

CODE

/*
 * LCD_16Bit_Code_C_Move.c
 *
 * Created: 10/20/2024 10:37:27 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

#asm
    .equ __lcd_port = 0x18;
#endasm

#include <lcd.h>

void main(void) {
    char name[] = "Amir Mohammad Safari    ";
    int len = 23;
    int i;

    PORTB = 0x00;
    DDRB = 0x00;
    
    lcd_init(32);

    while (1) {
        for (i = 0; i < len - 1; i++) {
            lcd_clear();
            lcd_gotoxy(0, 0);
            lcd_puts(&name[i]);
            delay_ms(20);
        }
    }
}

Schematic


Practice 5

Devices :

  • LM032L
  • KEYPAD MATRIX
  • RES
  • ATMEGA32

CODE

/*
 * KeyPad.c
 *
 * Created: 10/30/2024 1:57:05 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

#asm
    .equ __lcd_port = 0x1B;
#endasm

#include <lcd.h>

unsigned char scan_key(void);
unsigned char code[4][4] = {{7,4,1,10},{8,5,2,0},{9,6,3,11},{12,13,14,15}};

char lcd_buffer[10];

void main (void) {
    unsigned char key;
    PORTC = 0x00;
    DDRC = 0xF0;
    
    lcd_init(16);
    lcd_clear();
    
    while(1) {
        key = scan_key();
        if (key != 0xFF) {
            lcd_clear();
            lcd_gotoxy(0,0);
            
            sprintf(lcd_buffer, "Button = %d", key);
            lcd_puts(lcd_buffer);
        }
    }
}

unsigned char scan_key(void) {
    unsigned char i, data, num_key = 0xFF, temp = 0x70;
    
    for (i = 0; i < 4; i++) {
        PORTC = temp;
        delay_ms(5);
        data = PINC & 0x0F;
        
        if (data == 0x07)
            num_key = code[0][i];
        if (data == 0x0B)
            num_key = code[1][i];
        if (data == 0x0D)
            num_key = code[2][i];
        if (data == 0x0E)
			num_key = code[3][i];
            
		temp = ((temp >>= 1) | 0x80) & 0xF0;
	}
	return num_key;
}

Schematic


Practice 6

2 Mode

  • Cathode
  • Anode

[CATHODE]

Devices :

  • ATMEGA32
  • 7SEGMENT-CATHODE
  • GROUND

Table

+-------+----+---+---+---+---+---+---+---+-----+
| CHAR  | DP | G | F | E | D | C | B | A | HEX |
+-------+----+---+---+---+---+---+---+---+-----+
|   0   | 0  | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 3F  |
|   1   | 0  | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06  |
|   2   | 0  | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 5B  |
|   3   | 0  | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 4F  |
|   4   | 0  | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 66  |
|   5   | 0  | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 6D  |
|   6   | 0  | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 7D  |
|   7   | 0  | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07  |
|   8   | 0  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 7F  |
|   9   | 0  | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 6F  |
+-------+----+---+---+---+---+---+---+---+-----+

CODE

/*
 * 7SEG-CATHODE-COUNTER.c
 *
 * Created: 11/6/2024 1:39:03 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <delay.h>

void main (void) {
    int i = 0;
    unsigned char seg[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
    
    DDRC = 0xFF;
    PORTC = 0x00;
    
    while(1) {
        if (i > 9)
            i = 0;
        PORTC = seg[i];
        delay_ms(100);
        i++;
    }
}

Schematic

[ANODE]

Devices :

  • ATMEGA32
  • 7SEGMENT-ANODE
  • VCC (5V)

Table

+-------+----+---+---+---+---+---+---+---+-----+
| CHAR  | DP | G | F | E | D | C | B | A | HEX |
+-------+----+---+---+---+---+---+---+---+-----+
|   0   | 1  | 1 | 0 | 0 | 0 | 0 | 0 | 0 | C0  |
|   1   | 1  | 1 | 1 | 1 | 1 | 0 | 0 | 1 | F9  |
|   2   | 1  | 0 | 1 | 0 | 0 | 1 | 0 | 0 | A4  |
|   3   | 1  | 0 | 1 | 1 | 0 | 0 | 0 | 0 | B0  |
|   4   | 1  | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 99  |
|   5   | 1  | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92  |
|   6   | 1  | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 82  |
|   7   | 1  | 1 | 1 | 1 | 1 | 0 | 0 | 0 | F8  |
|   8   | 1  | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80  |
|   9   | 1  | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 90  |
+-------+----+---+---+---+---+---+---+---+-----+

CODE

/*
 * 7SEG-ANODE-COUNTER.c
 *
 * Created: 11/6/2024 1:40:49 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <delay.h>

void main (void) {
    int i = 0;
    unsigned char seg[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
    
    DDRC = 0xFF;
    PORTC = 0x00;
    
    while(1) {
        if (i > 9)
            i = 0;
        PORTC = seg[i];
        delay_ms(100);
        i++;
    }
}

Schematic


Practice 7

Show 0-255 on 7SEG

We have 9 Switch

Devices :

  • ATMEGA32
  • SP-SPST (Switch)
  • LCD (LM016L)

CODE

/*
 * 0-255-LCD-SWITCH.c
 *
 * Created: 11/17/2024 5:33:14 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <delay.h>
#include <stdio.h>

#include <lcd.h>

#asm
.equ __lcd_port = 0x1B;
#endasm

void main(void) {
    char buffer [20];
    unsigned char num;
    
    PORTB = 0xFF;
    DDRB = 0x00;
    PORTC = 0xFF;
    DDRC = 0x00;
    
    lcd_init(20);
    lcd_clear();
    lcd_putsf("Set Keys");
    
    while (1) {
        if (PINC.0 != 0) {
            lcd_clear();
            lcd_gotoxy(0,0);
            sprintf(buffer, "Hi, please start");
            lcd_puts(buffer);
            num = 0x00;
        }
        
        else {
            num =~ PINB;
        }
        
        if (num != 0x00) {
            lcd_clear();
            lcd_gotoxy(0,0);
            sprintf(buffer, "Number = %d", num);
            lcd_puts(buffer);
            delay_ms(100);
        }
        
		else if (PINC.0 == 0) {
			lcd_clear();
			lcd_putsf("Number = 0");
			delay_ms(100);
		}
	}
}

Schematic


Practice 8

We have 8 resistors connected to atmega32

Devices :

  • ATMEGA32
  • Resistor 330 OHM
  • 7SEG-MPX4-CA

CODE

/*
 * 7-SEG-9999.c
 *
 * Created: 11/17/2024 8:00:24 PM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <delay.h>

void main(void) {
    unsigned char seg[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
    int i = 0, ones, tens, hundreds, thousands;
    
    DDRC = 0xFF;
    PORTC = 0x00;

    DDRD = 0xFF;
    PORTD = 0x00;
    
    while (1) {
        thousands = i / 1000;
        hundreds = (i % 1000) / 100;
        tens = (i % 100) / 10;
        ones = i % 10;

        PORTD = 0b00001000; // Display ones
        PORTC = seg[ones];
        delay_ms(1); // Reduce delay for multiplexing
        
        PORTD = 0b00000100; // Display tens
        PORTC = seg[tens];
        delay_ms(1);
        
        PORTD = 0b00000010; // Display hundreds
        PORTC = seg[hundreds];
        delay_ms(1);
        
        PORTD = 0b00000001; // Display thousands
        PORTC = seg[thousands];
        delay_ms(1);
        
        i++;
        if (i > 9999) i = 0;
    }
}

Schematic


Practice 9

Digital clock

Devices :

  • ATMEGA32
  • LM032L

CODE

/*
 * DIGITAL-CLOCK.c
 *
 * Created: 11/24/2024 10:20:01 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <delay.h>
#include <stdio.h>

#include <lcd.h>

#asm
.equ __lcd_port = 0x1B;
#endasm

void main(void) {
    while(1) {
        int H = 0;
        int M = 0;
        int S = 0;
        
        char buffer_lcd[10];
        lcd_init(16);
        lcd_clear();
        
        for (H = 0; H < 25; H++) {
            lcd_gotoxy(0,0);
            sprintf(buffer_lcd, "Time : %d", H);
            lcd_puts(buffer_lcd);
            
            for (M = 0; M < 61; M++) {
                lcd_gotoxy(9,0);
                sprintf(buffer_lcd, "%d", M);
                lcd_puts(buffer_lcd);
                
                for(S = 0; S < 61; S++) {
                    lcd_gotoxy(12,0);
                    sprintf(buffer_lcd, "%d", S);
					lcd_puts(buffer_lcd);
					delay_ms(1000);
				}
			}
		}
	}
}

Schematic


Practice 10

Alphabet letters on MATRIX

Devices :

  • ATMEGA32
  • MATRIX 8x8

Letters TABLE info

LetterBit Pattern
A0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00
B0x7E, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7E, 0x00
C0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00
D0x7C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00
E0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00
F0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x00
G0x3C, 0x66, 0x60, 0x60, 0x6E, 0x66, 0x3C, 0x00
H0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00
I0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00
J0x1E, 0x0C, 0x0C, 0x0C, 0x6C, 0x6C, 0x38, 0x00
K0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00
L0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00
M0x66, 0x7E, 0x7E, 0x66, 0x66, 0x66, 0x66, 0x00
N0x66, 0x76, 0x7E, 0x7E, 0x6E, 0x66, 0x66, 0x00
O0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00
P0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00
Q0x3C, 0x66, 0x66, 0x66, 0x66, 0x6C, 0x36, 0x00
R0x7C, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x66, 0x00
S0x3E, 0x60, 0x60, 0x3C, 0x06, 0x06, 0x7C, 0x00
T0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00
U0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00
V0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00
W0x66, 0x66, 0x66, 0x66, 0x7E, 0x7E, 0x66, 0x00
X0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00
Y0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x00
Z0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00

CODE

/*
 * MATRIX8x8-Alphabet-LETTERS.c
 *
 * Created: 11/24/2024 10:55:44 AM
 * Author: Amir Mohammad
 */

#include <mega32.h>
#include <delay.h>

#define xtal 8000000

unsigned char k;
flash unsigned char arr[8] = {0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00};  // Letter A

void main(void) {
    DDRA = 0xFF;
    DDRB = 0xFF;
    
    while(1) {
        for ( k = 0; k <= 7; k++) {
			PORTA = arr[k];
			PORTB = ~(1 << k);
			delay_us(100);
			PORTB = 0xFF;
		}
	}
}

Schematic


Credit

  • Mr. Hamed Sarbazi (Teacher)
  • Mr. Amir Mohammad Safari (TA)
> Comment on twitter (X)
 
CC BY-NC-SA 4.0  2009-PRESENT © Nuxsco (AMS) This website rewrite several times from those years up to present