0% found this document useful (0 votes)
15 views29 pages

PDF 3

The document outlines a series of experiments involving programming in C and assembly language for microcontrollers, focusing on LED control, arithmetic operations, addressing modes, and timer functionalities. Each experiment includes code snippets demonstrating various tasks such as LED blinking, arithmetic operations, and handling interrupts. The experiments aim to familiarize users with software and hardware interactions through practical coding examples.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views29 pages

PDF 3

The document outlines a series of experiments involving programming in C and assembly language for microcontrollers, focusing on LED control, arithmetic operations, addressing modes, and timer functionalities. Each experiment includes code snippets demonstrating various tasks such as LED blinking, arithmetic operations, and handling interrupts. The experiments aim to familiarize users with software and hardware interactions through practical coding examples.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 29

Exper 1: Familiarization with software

LED BLINKING

#define LED_PORT P3

void delay_ms(unsigned int ms) {

unsigned int i, j;

for (i = 0; i < ms; i++)

for (j = 0; j < 127; j++);

void main()

{ while

(1) {

LED_PORT = 0xFF;

delay_ms(500);

LED_PORT = 0x00;

delay_ms(500);

a) LED CURTAIN
#define LED_PORT P3
void delay_ms(unsigned int
ms) { unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 127; j++);
}
void main() {
LED_PORT =
0x00;

while (1) {
for (unsigned char i = 0; i < 8; i++) {
LED_PORT = (0x01 << i);
delay_ms(100);
}
for (unsigned char i = 0; i < 8; i++) {
LED_PORT = (0x80 >> i);
delay_ms(100);
}
LED_PORT = 0x00;
}
}

Experiment 2 – Add , Subtract,Multiplication ,


Division
void main()

{ asm{

//MOV A,#06

//MOV B,#05

//ADD A,B

//MOV P0,A

//MOV A,#06

//MOV B,#05

//SUBB A,B

//MOV P1,A

MOV A,#255
MOV

B,#1

MUL AB

MOV

P1,A

MOV

P2,B

MOV

A,#10

MOV

B,#05

DIV AB

MOV P3,A

Experiment -3 addressing modes


//1.Immediate

addressing

void main()

{ asm{

MOV A,

#09; MOV

P2, A;

//
2.Register

//addressin

//g mode

void

main(){

asm{

MOV R0,

#0x03; MOV

A,R0; MOV

P1,A;
}

//3.Direct

void

main()

{ asm{

MOV A,

0x40; MOV

P2, A;

//4.Indirect

void

main()

{ asm{

MOV

DPTR,#2000;

MOV A,#070;

MOVC A,

@A+DPTR;

//5.Register

Indirect void

main(){

asm{

MOV 0x40,
#0x2D;
MOV R0,
#0x40;

MOV A, @R0;

MOV P2,A;

}
//6. Implied (Only

Commands) SWAP A

CLR

CPL

DAA

Experiment –4 C program to input one pin and


show output on other pin

In assembly language
void main() {

asm {

SETB P3.2

SETB P2.3

AGAIN:

JB P3.2, BUTTON_PRESSED

CLR P2.3

SJMP AGAIN
BUTTON_PRESSED:

SETB P2.3

SJMP AGAIN

Same code In c language

#define BUTTON P3_2 // P3.2 as input


(button)
#define LED P2_3 // P2.3 as output (LED)

void main() {
while(1) {
if (BUTTON == 0) { // Check if the
button is pressed (low)
LED = 1; // Turn on the LED
} else {
LED = 0; // Turn off the LED
}
}
}
Experiment –5 ASM Program for delay of 200ms
void main() {

asm{

NEXT:

MOV P3, #0x55

ACALL DELAY

MOV P3, #0xAA

ACALL DELAY

SJMP NEXT

DELAY:

MOV R0, #2

L3:

MOV R1, #163

L2:

MOV R2, #254

L1:

DJNZ R2, L1

DJNZ R1, L2
DJNZ R0, L3

RET

}
Experiment –6 LED Display
//Part a : program for display codes from lookup table

unsigned char

display_code[]={0x99,0xb0,0xa4,0xf9};

void delay_ms(unsigned int ms) {

unsigned int i, j;

for (i = 0; i < ms; i++)

for (j = 0; j < 127; j++);

void display_data(void){

unsigned char

i,j; while(1){

j=1;

for(i=0;i<4;i++){

P0=display_code[i];

P1=j;

delay_ms(10

00); j=j<<1;

return;

}
}

void main() {

display_data();

//Part B

Display codes from lookup table , the display appear after pressing the key on

P2.0 code unsigned char lookup_7seg[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,

0x92, 0x82, 0xf8, 0x80, 0x90};

unsigned char display_code[]={0x99, 0xb0, 0xa4, 0xf9};

unsigned int dispay_value;

int test_key(){

P2_0_bit=1;

if(P2_0_bit == 0) return 1;

else return 0;

void transfer_display_code(int display_value){


unsigned char i,j;

for(i=0; i < 4; i++){

j=display_value%10;

display_code[i]=lookup_7seg[j];

display_value/=10;

return;

void display_data(void){

unsigned char i,j;

while(1){

j=1;

for(i=0;i<4;i++){

P0=display_code[i];

P1=j;

delay_ms(1000);

j=j<<1;

}
}

void main() {

int display_value=7404;

while(test_key() != 1)

transfer_display_code(display_value);

display_data();

Experiment –7
a) To display numeric value of 7 segment display.

unsigned char display_code[4] = {0x99, 0xB6, 0xA4,

0xF9}; void delay_ms(unsigned int time)


{

unsigned int i, j;

for (i = 0; i < time; i++)

for (j = 0; j < 1275; j++);

void display_data(void)

unsigned

char i; while

(1)

for (i = 0; i < 4; i++)

P1 =

display_code[i];

delay_ms(1000);

void main()

display_data();

b) Number from 0000 to 9999 in ascending

unsigned char code7seg[10] = {0xC0, 0xF9,

0xA4, 0xB0,

0x99, 0x92, 0x82, 0xF8,

0x80, 0x90};
void delay_ms(unsigned int time)

unsigned int i, j;

for (i = 0; i < time; i++)

for (j = 0; j < 1275; j++);

void display_digit(unsigned char digit)

P2 = 0x08;

P1 = code7seg[digit];

delay_ms(5);

P2 = 0x04;

P1 = code7seg[digit];

delay_ms(5);

P2 = 0x02;

P1 = code7seg[digit];

delay_ms(5);

P2 = 0x01;

P1 = code7seg[digit];

delay_ms(5);

}
void main()

unsigned char num;

while (1)

for (num = 0; num <= 9; num++)

unsigned int t;

for (t = 0; t < 100; t++)

display_digit(num);

Number from 9999 to 0000 in descending order

unsigned char code7seg[10] = {0xC0, 0xF9,

0xA4, 0xB0,

0x99, 0x92, 0x82, 0xF8,

0x80, 0x90};

void delay_ms(unsigned int time)

unsigned int i, j;

for (i = 0; i < time; i++)

for (j = 0; j < 1275; j++);

}
void display_digit(unsigned char digit)

P2 = 0x08;

P1 = code7seg[digit];

delay_ms(5);

P2 = 0x04;

P1 = code7seg[digit];

delay_ms(5);

P2 = 0x02;

P1 = code7seg[digit];

delay_ms(5);

P2 = 0x01;

P1 = code7seg[digit];

delay_ms(5);

void main()

unsigned char num;

while (1)

for (num = 0; num <= 9; num++)


{

unsigned int t;

for (t = 0; t < 100; t++)

display_digit(num);

c) Fixing the display pattern on any 3 segment (print 456 )

unsigned char code7seg[10] = {0xC0, 0xF9, 0xA4,


0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90};

void delay_ms(unsigned int time)


{
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 1275; j++);
}

void display_digit(unsigned char digit)


{
P2 = 0x08;
P1 =
code7seg[digit];
delay_ms(5);

P2 = 0x04;
P1 =
code7seg[digit];
delay_ms(5);
P2 = 0x02;
P1 =
code7seg[digit];
delay_ms(5);

P2 = 0x01;
P1 =
code7seg[digit];
delay_ms(5);
}

void main()
{
while (1)
{
display_digit(4);
delay_ms(500);

display_digit(5);
delay_ms(500);

display_digit(6);
delay_ms(500);
}
}

d) Verify the difference between 130 and 0130

void

display130(void) {
unsigned char i;
for (i = 0; i < 100; i+
+) { P1 = 0x04;
P0 = 0xF9;
delay_ms(5);

P1 =
0x08; P0
= 0xB0;
delay_ms(5);

P1 =
0x09; P0
= 0xC0;
delay_ms(5);
}
}

void display0130(void) {
unsigned char i;
for (i = 0; i < 100; i+
+) { P1 = 0x08;
P0 = 0xC0;
delay_ms(5);

P1 =
0x04; P0
= 0xF9;
delay_ms(5);

P1 =
0x08; P0
= 0xB0;
delay_ms(5);

P1 =
0x09; P0
= 0xC0;
delay_ms(5);
}
}

void main()
{ while(1
){
display130();
delay_ms(1000);
display0130();
delay_ms(1000);
}
}
Experiment –8 Timer 0 in mode 1
Part A : to complement the status of pin P3.6 after milli+3

+sec;

void delay_m(void) { TMOD =

0x01; TL0 = 0xBE;

TH0 =

0xFC; TR0

= 1;

while (TF0 == 0); TR0 = 0; TF0 = 0; }

void main()

{ while (1)

{ delay_m(

);

P3_6 = ~P3_6; } }

Part B : to generate variable delay with resolution of 1ms and complement the
bit P 3.6 after 5msec

void delay_msec(unsigned int msec_count) { unsigned

char i; while (msec_count != 0) {

TMOD =

0x01; TH0 =

0xFC; TL0 =

0x66; TF0 =

0;

TR0 = 1;

for (i = 0; i < 4; i++) {


while (TF0 == 0); TF0 = 0; }
TR0 = 0;

msec_count--; } } void

main() {

while (1) {

delay_msec(5000);

P3_6 = ~P3_6; } }

Experiment –9 Timer 0 in mode 2


void delay_msec_2(unsigned msec_count) {
unsigned i;
TF0_bit = 0;
TMOD = 0x02; // Timer 0, Mode 2 (auto-reload mode)
TH0 = 0x30; // Load reload value (~1ms at 12MHz clock)
TL0 = 0x30; // Load TL0 with same value for 1ms delay

while (msec_count--) {
for (i = 0; i < 4; i++) { // Fine-tune to 1ms if needed
TR0_bit = 1; // Start Timer 0
while (TF0_bit == 0); // Wait for overflow
TF0_bit = 0; // Clear overflow flag
}
}

TR0_bit = 0; // Stop Timer 0


}

void main() {
while (1) {
delay_msec_2(500); // 500ms delay
P3 |= 0x40; // Toggle P3.6 (Set bit 6)
P3 &= ~0x40; // Reset bit 6 (Toggle P3.6)
}
}
Experiment –10 Interrupts when INT0 ocuurs led at
p2.4 toggles
// A part external INT0 occurs , led at pin 2.4 toggles
//External Interrupt 0 ISR
void external0_ISR(void) interrupt 0 {
P2_4 = ~P2_4; // Toggle P2.4
}
void main(void) {
IT0 = 1; // INT0 edge triggered
EX0 = 1; // Enable External Interrupt 0
EA = 1; // Enable Global Interrupt
while(1); // Infinite loop
}

//B part external edge triggered interrupt int0 and int 1 , maintain integer count that
is incremented by 1 on the arrival of int 0
unsigned char port_val = 0;
// ISR for External Interrupt 0 (Increment) // org 0x0003
void external0_ISR(void) interrupt 0 {
port_val++;
P2 = port_val;
}
//part B
// ISR for External Interrupt 1 (Decrement) //org 0x0013
void external1_ISR(void) interrupt 2 {
port_val--;
P2 = port_val;
}

void main(void) {
IT0 = 1; // INT0 edge triggered
IT1 = 1; // INT1 edge triggered
EX0 = 1; // Enable External Interrupt 0
EX1 = 1; // Enable External Interrupt 1
EA = 1; // Enable Global Interrupt
while(1); // Infinite loop
}
//C part : display the count value on port 2 led , also count is decremented by 1 on
the arrival of int 1

unsigned char count = 0;


unsigned char seg_code[16] = {
0xC0, 0xF9, 0xA4, 0xB0,
0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83,
0xC6, 0xA1, 0x86, 0x8E
};

void external0_ISR() org 0x0003 {


count++;
if (count > 15) count = 0;
P1 = 0x01;
P0 = seg_code[count];
}

void external1_ISR() org 0x0013 {


if (count > 0) count--;
else count = 15;
P1 = 0x01;
P0 = seg_code[count];
}
void main() {
IT0_bit = 1;
IT1_bit = 1;
EX0_bit = 1;
EX1_bit = 1;
EA_bit = 1;

P1 = 0x01;
P0 = seg_code[count];

while(1);
}
Experiment –11 LCD
// LCD module connections

sbit LCD_RS at P2_0_bit;

sbit LCD_EN at P2_1_bit;

sbit LCD_D4 at P2_2_bit;

sbit LCD_D5 at P2_3_bit;

sbit LCD_D6 at P2_4_bit;

sbit LCD_D7 at P2_5_bit;

// End LCD module connections

char txt1[] = "mikroElektronika";

char txt2[] = "Easy8051v6";

char txt3[] = "Lcd4bit";


char txt4[] = "example";

char i; // Loop variable

void Move_Delay() { // Function used for text moving

Delay_ms(500); // You can change the moving speed here

void main(){

Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display

Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

LCD_Out(1,6,txt3); // Write text in first row

LCD_Out(2,6,txt4); // Write text in second row

Delay_ms(2000);

Lcd_Cmd(_LCD_CLEAR); // Clear display

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,5,txt2); // Write text in second row


Delay_ms(2000);

// Moving text

for(i=0; i<4; i++) { // Move text to the right 4 times

Lcd_Cmd(_LCD_SHIFT_RIGHT);

Move_Delay();

while(1) { // Endless loop

for(i=0; i<8; i++) { // Move text to the left 7 times

Lcd_Cmd(_LCD_SHIFT_LEFT);

Move_Delay();

for(i=0; i<8; i++) { // Move text to the right 7 times

Lcd_Cmd(_LCD_SHIFT_RIGHT);

Move_Delay();

You might also like