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