0% found this document useful (0 votes)
50 views

Programs

The document contains examples of embedded systems code in assembly and C language to demonstrate various concepts like arithmetic operations, timers, interrupts, I/O ports, serial communication, LCD interfacing, etc. on ARM microcontrollers. Specifically, it shows: 1) Examples of arithmetic operations, delays, and I/O port manipulation using assembly language. 2) Implementing timers using polling and interrupt methods. 3) Serial transmission and reception of characters using polling and interrupt-driven approaches. 4) Interfacing with a 2x16 LCD to display alphanumeric characters and converting hexadecimal to decimal.

Uploaded by

albert
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
50 views

Programs

The document contains examples of embedded systems code in assembly and C language to demonstrate various concepts like arithmetic operations, timers, interrupts, I/O ports, serial communication, LCD interfacing, etc. on ARM microcontrollers. Specifically, it shows: 1) Examples of arithmetic operations, delays, and I/O port manipulation using assembly language. 2) Implementing timers using polling and interrupt methods. 3) Serial transmission and reception of characters using polling and interrupt-driven approaches. 4) Interfacing with a 2x16 LCD to display alphanumeric characters and converting hexadecimal to decimal.

Uploaded by

albert
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 12

Embedded systems Practical

EX. 2 : SIMULATION OF ARITHMETIC OPERATION ON ARM IN ASSEMBLY

AREA Arith, CODE


ENTRY
Start
LDR R0, Value1
LDR R1, Value2
ADD R2, R0, R1
SUB R3, R0, R1
MUL R4, R0, R1
SWI 0x11

Value1 DCD 0x12345678


Value2 DCD 0x00000002

END

EX. 3 SIMULATION OF ASSEMBLY LEVEL PROGRAM FOR SOFT DELAY

AREA Blink, CODE


ENTRY

IO1DIR EQU 0xE0028018


IO1SET EQU 0xE0028014
IO1CLR EQU 0xE002801C

LDR R4,=IO1DIR
LDR R1,=0xFF000000
STR R1,[r4]
Loop
LDR R4,=IO1SET
LDR R1,=0xFF000000
STR R1,[R4]
BL Delay
LDR R4,=IO1CLR
LDR R1,=0xFF000000
STR R1,[R4]
BL Delay
B Loop
SWI 0x11

Delay
LDR R5,=0X000FFFFF
L1
SUB R5,R5,#1
CMP R5,#0
BNE L1
BX R14

END

Page 1 of 12
EX. 4 : SIMPLE LED BLINKING WITH VARIABLE SPEED IN ASM

GLOBAL __main
AREA main, CODE, READONLY
EXPORT __main
EXPORT __use_two_region_memory
__use_two_region_memory EQU 0
BX LR
ENTRY

IO1DIR EQU 0xE0028018


IO1PIN EQU 0xE0028010
IO1CLR EQU 0xE002801C
IO1SET EQU 0xE0028014

__main
LDR R4,=IO1DIR
LDR R1,=0xFF000000
STR R1,[R4]
Loop
LDR R4,=IO1SET
LDR R1,=0xFF000000
STR R1,[R4]
BL __delay
LDR R4,=IO1CLR
LDR R1,=0xFF000000
STR R1,[R4]
BL __delay
B Loop
SWI 0x11

__delay
LDR R5,=0X000FFFFF
L1
SUB R5,R5,#1
CMP R5,#0
BNE L1
BX R14

END

EX. 5 : REALIZATION OF INPUT AND OUTPUT PORT IN ASM

GLOBAL __main
AREA main, CODE, READONLY
EXPORT __main
EXPORT __use_two_region_memory
__use_two_region_memory EQU 0
BX LR
ENTRY

IO0DIR EQU 0xE0028008


IO1DIR EQU 0xE0028018
IO0PIN EQU 0xE0028000
IO1PIN EQU 0xE0028010

Page 2 of 12
__main
LDR R1,=IO1DIR
LDR R2,=0xFF000000
STR R2, [R1]

LDR R1,=IO0DIR
LDR R2,=0x00000000
STR R2, [R1]

Loop
LDR R1,=IO0PIN
LDR R2, [R1]
LSL R2,#8
AND R2,#0xFF000000
LDR R1,=IO1PIN
STR R2, [R1]
B Loop

END

EX. 6 : SIMPLE LED BLINKING WITH VARIABLE SPEED IN C

#include <LPC214x.h>
#include <stdio.h>

void DelayMs(unsigned int ms);


unsigned int delay_Val;

int main(void)
{
VPBDIV = 0x01;
IO1DIR = 0xFF000000;
IO0DIR = 0x00000000;

while(1)
{
if(IO0PIN & 0x00800000)
{
delay_Val = 20;
}
else
{
delay_Val = 100;
}

IO1SET = 0xFF000000;
DelayMs(delay_Val);
IO1CLR = 0xFF000000;
DelayMs(delay_Val);
}
}

Page 3 of 12
void DelayMs(unsigned int ms)
{
long i,j;
for (i = 0; i < ms; i++ )
for (j = 0; j < 5000; j++ );
}

EX. 7 : SEVEN SEGMENT LED DISPLAY INTERFACE IN C

#include "lpc214x.h"
void delay(void);

int main()
{
unsigned char data[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned int i;
IO1DIR = 0x00ff0000;

while(1)
{
for(i=0; i<=9;i++)
{
IO1PIN=(data[i] << 16);
delay();
}
}
}

void delay(void)
{
unsigned int i;
for(i=0;i<0xFFFFF;i++);
}

EX. 8 : SEVEN SEGMENT LED DISPLAY INTERFACE IN C

#include "lpc214x.h"
extern void delay(void);

int main()
{
unsigned char data[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned int i;
IO1DIR = 0x00FF0000;

while(1)
{
for(i=0; i<=9;i++)
{
IO1PIN=(data[i] << 16);
delay();
}
}
}

Page 4 of 12
asm_delay.s

AREA Delay, CODE


EXPORT delay

delay
LDR R5,=0X00FFFFFF
L1
SUB R5,R5,#1
CMP R5,#0
BNE L1
BX R14

END

EX. 9 : REALIZING TIMER PERIPHERAL IN ARM BY POLLING METHOD

#include "lpc214x.h"

unsigned int timer_delay = 1000 ;

void timer_init()
{
VPBDIV = 1;
T0PR = 12000*timer_delay ;
T0MR0 = 1;
T0MCR = 2;
T0TCR = 1;
}

int main(void)
{
IO1DIR = 0xFF000000;
timer_init();
while(1)
{
if( T0TC==0 )
{
IO1PIN = 0xF0000000;
while(T0TC==0);
}
else
IO1PIN = 0x0F000000;
}
}

EX. 10 : REALIZING TIMER PERIPHERAL IN ARM BY INTERRUPT DRIVEN METHOD

#include <LPC214x.h>

unsigned int timer_delay = 1000 ;

void Timer0_Init(void);
__irq void T0ISR(void);

Page 5 of 12
int main(void)
{
VPBDIV = 0x01;
IO1DIR = 0xFF000000;
Timer0_Init();
while(1);
}

void Timer0_Init(void)
{
T0PR = 12000*timer_delay;
T0MR0 = 1;
T0MCR = 3;
T0TCR = 1;

VICIntEnable = 0x10;
VICVectAddr4 = (unsigned )T0ISR;
VICVectCntl4 = 0x20 | 4;
}

__irq void T0ISR(void)


{
long int regVal;
regVal = T0IR;
IO1PIN ^= 0xFF000000;
T0IR = regVal;
VICVectAddr = 0x0;
}

EX. 11 : SERIAL TRANSMISSION AND RECEPTION OF A CHARACTER IN C BY POLLING METHOD

#include <LPC214x.H>

void UART0_Init(void);
void UART0_Txmt(unsigned char);
unsigned char UART0_Recv(void);
void UART0_puts(unsigned char *);

unsigned char Rec_Val;

int main(void)
{
VPBDIV = 0x02;
UART0_Init();
UART0_puts("Press any one Key\r\n");
while(1)
{
UART0_Txmt(UART0_Recv());
}
}

Page 6 of 12
void UART0_Init(void)
{
PINSEL0 = 0x00000005;
U0LCR = 0x00000083;
U0DLL = 0x000000C3;
U0LCR = 0x00000003;
U0IER = 0x00000001;
}
void UART0_Txmt(unsigned char Chr)
{
while (!(U0LSR & 0x20));
U0THR = Chr;
}
unsigned char UART0_Recv(void)
{
while (!(U0LSR & 0x01));
return (U0RBR);
}
void UART0_puts(unsigned char *string)
{
while(*string)
UART0_Txmt(*string++);
}

EX. 12 : SERIAL TRANSMISSION AND RECEPTION OF A CHARACTER IN C BY INTERRUPT METHOD

#include <LPC214x.H>
void UART0_Init(void);
void UART0_Txmt(unsigned char);
void UART0_puts(unsigned char *);
__irq void UART0_ISR(void);
unsigned char Rec_Val;
int main(void)
{
VPBDIV = 0x02;
UART0_Init();
UART0_puts("Press any one Key\r\n");
while(1);
}
void UART0_Init(void)
{
PINSEL0 = 0x00000005;
U0LCR = 0x00000083;
U0DLL = 0x000000C3;
U0LCR = 0x00000003;
U0IER = 0x00000001;
VICIntEnable = 0x00000040;
VICVectCntl4 = 0x00000020 | 6 ;
VICVectAddr4 = (unsigned) UART0_ISR;
}

Page 7 of 12
__irq void UART0_ISR(void)
{
unsigned char temp;

if(U0LSR & 0x01)


{
temp = U0RBR;
U0THR = temp;
}
VICVectAddr = 0x0;
}

void UART0_Txmt(unsigned char Chr)


{
while (!(U0LSR & 0x20));
U0THR = Chr;
}

void UART0_puts(unsigned char *string)


{
while(*string)
UART0_Txmt(*string++);
}

EX. 13 : DISPLAYING ALPHANUMERIC CHARACTERS IN 2X16 LINE LCD MODULE

#include "lpc214x.h"
#define EN 0x800
#define RW 0X200
#define RS 0x100
void delay(void)
{
unsigned int i;
for(i=0;i<0x1fff;i++);
}

void EN_Pulse(void)
{
IO0SET = EN ;
delay();
IO0CLR = EN ;
}

void send_cmd( int addr )


{
IO1PIN = addr<<16;
IO0CLR = RS;
EN_Pulse();
}
void send_data( int data )
{
IO1PIN = data<<16;
IO0SET = RS;
EN_Pulse();
}

Page 8 of 12
void lcd_initialize(void)
{
send_cmd(0X38); delay();
send_cmd(0X0F); delay();
send_cmd(0X01); delay();
send_cmd(0X06); delay();
send_cmd(0X80); delay();
}
int main(void)
{
unsigned char alphabets[16]= {"Embedded Systems"};
unsigned char numbers[16]= {" 10/12/2013 "};
unsigned char i=0,j=0,line1=0x80,line2=0xC0;

IO0DIR = 0x00000F00;
IO1DIR = 0x00FF0000;
IO0CLR = RW;
lcd_initialize();

for(j=0;j<1;j++)
{
for(i=0;i<16;i++)
{
send_cmd(line1+i); delay();
send_data(alphabets[i]); delay();
}

for(i=0;i<16;i++)
{
send_cmd(line2+i); delay();
send_data(numbers[i]); delay();
}

EX. 14 : CONVERTING HEXADECIMAL TO DECIMAL AND TO DISPLAY IN LCD

#include "lpc214x.h"
#define EN 0x800
#define RW 0X200
#define RS 0x100
void delay(void)
{
unsigned int i;
for(i=0;i<0x1fff;i++);
}
void EN_Pulse(void)
{
IO0SET = EN;
delay();
IO0CLR = EN;
}

Page 9 of 12
void send_cmd(int addr)
{
IO1PIN = addr<<16;
IO0CLR = RS; EN_Pulse();
}

void send_data(int data)


{
IO1PIN = data<<16;
IO0SET = RS; EN_Pulse();
}

void lcd_initialize(void)
{
send_cmd(0X38); delay();
send_cmd(0X0F); delay();
send_cmd(0X01); delay();
send_cmd(0X06); delay();
send_cmd(0X80); delay();
}

int main(void)
{
int num,i,d1,d2,d3;
char *display = "Decimal value = ";
IO0DIR = 0x00000F00;
IO1DIR = 0x00FF0000;
IO0CLR = RW;

lcd_initialize();

num = 0xF7;
d1 = num % 10;
num = num / 10;
d2 = num % 10;
num = num / 10;
d3 = num;
send_cmd(0x80); delay();
for(i=0;i<=15; i++)
{
send_data(display[i]);
}
send_cmd (0xc0); delay();
send_data(d3+48); delay();
send_data(d2+48); delay();
send_data(d1+48); delay();
while(1)
{
}

Page 10 of 12
EX. 15 : ACCESSING INTERNAL ADC OF THE ARM PROCESSOR AND TO DISPLAY IN LCD

#include "lpc214x.h"

#define EN 0x800
#define RW 0X200
#define RS 0x100

#define DONE 0x80000000


#define START 0x01000000
#define PRESET 0x00230600

void delay(void)
{
unsigned int i;
for(i=0;i<0x1fff;i++);
}

void EN_Pulse(void)
{
IO0SET = EN;
delay();
IO0CLR = EN;
}

void send_cmd( int addr )


{
IO1PIN = addr<<16;
IO0CLR = RS; EN_Pulse();
}

void send_data( int data )


{
IO1PIN = data<<16;
IO0SET = RS; EN_Pulse();
}

void lcd_initialize(void)
{
send_cmd(0X38); delay();
send_cmd(0X0F); delay();
send_cmd(0X01); delay();
send_cmd(0X06); delay();
send_cmd(0X80); delay();
}

int main(void)
{
int num,i,d1,d2,d3,d4;
unsigned long Val;

char *display = "Digital value = ";


PINSEL1 = 0x01 << 24;

IO0DIR = 0x00000F00;
IO1DIR = 0x00FF0000;

Page 11 of 12
IO0CLR = RW;
AD0CR = PRESET | 0x02;
AD0CR |= START;

lcd_initialize();

send_cmd(0x80); delay();
for(i=0;i<=15; i++)
{
send_data(display[i]);
}
while(1)
{
do
{
Val = AD0GDR;
}
while ((Val & DONE) == 0);
Val = ((AD0GDR >> 6) & 0x3FF);

num = Val;
d1 = num % 10;
num = num / 10;
d2 = num % 10;
num = num / 10;
d3 = num % 10;
num = num / 10;
d4 = num;
send_cmd (0xc0); delay();
send_data(d4+48); delay();
send_data(d3+48); delay();
send_data(d2+48); delay();
send_data(d1+48); delay();
}

Page 12 of 12

You might also like