Embedded Lab Experiment Program
Embedded Lab Experiment Program
pg. 1
Experiment No 1
EXPORT __main
__main
ENTRY
START
MOV r1,#6400
MOV r2,#3200
MUL r3,r1,r2
NOP
NOP
NOP
END
pg. 2
Experiment No 2
rpt
SUBS r1, r1, #1
CMP r1, #0
BEQ STOP
ADD r3,r0,r1
MOV r0,r3
BNE rpt
STOP
NOP
NOP
NOP
END
pg. 3
Experiment No 3
;/ An ALP to add an array of 16 bit numbers and store the 32 bit result in internal RAM
;/* ARRAY OF 6 NUMBERS 0X1111,0X2222,0X3333,0XAAAA,0XBBBB,0XCCCC */
;/* THE SUM IS 29997H THE RESULT CAN BE VIEWED IN LOCATION 0X40000000 & ALSO IN R0*/
START
MOV R5,#6
MOV R0,#0
LDR R1,=VALUE1
LOOP
LDR R2,[R1],#2
LDR R3,MASK
AND R2,R2,R3
ADD R0,R0,R2
SUBS R5,R5,#1
CMP R5,#0
BNE LOOP
LDR R4,=RESULT
STR R0,[R4]
NOP
NOP
NOP
AREA DATA2,DATA,READWRITE
END
pg. 4
Experiment No 4
;/* PROGRAM TO COUNT THE NUMBER OF ONES & ZEROS IN TWO CONSECUTIVE MEMORY LOCATIONS
*/
;/* WE TOOK TWO NUMBERS i.e. 0X11111111,0XAA55AA55 (R0) */
;/* CHECK THE RESULT IN R2 FOR ONES & R3 FOR ZEROS */
;/* SET A BREAKPOINT AT NOP INSTRUCTION,RUN THE PROGRAM & CHECK THE RESULT */
START
MOV R2,#0
MOV R3,#0
MOV R7,#2
LDR R6,=VALUE
SUBS R7,R7,#1
CMP R7,#0
BNE LOOP
NOP
NOP
NOP
pg. 5
Experiment No 5
START
MOV R5,#7
MOV R2,#0
LDR R4,=VALUE
LOOP
LDR R1,[R4],#4
BHI FOUND
B LOOP1
FOUND
ADD R2,R2,#1
B LOOP1
LOOP1
SUBS R5,R5,#1
CMP R5,#0
BNE LOOP
NOP
NOP
NOP
END
pg. 6
Experiment No1: Display Hello word in UART
Main Code:-
#include <lpc17xx.h>
#include "stdutils.h"
LPC_UART0->FCR = (1<<SBIT_FIFO) | (1<<SBIT_RxFIFO) | (1<<SBIT_TxFIFO); // Enable FIFO and reset Rx/Tx FIFO
buffers
LPC_UART0->LCR = (0x03<<SBIT_WordLenght) | (1<<SBIT_DLAB); // 8bit data, 1Stop bit, No parity
UART_PCLK PCLK
0x00 SystemFreq/4
0x01 SystemFreq
0x02 SystemFreq/2
0x03 SystemFreq/8
**/
switch( var_UartPclk_u32 )
{
case 0x00:
var_Pclk_u32 = SystemCoreClock/4;
break;
case 0x01:
var_Pclk_u32 = SystemCoreClock;
break;
case 0x02:
var_Pclk_u32 = SystemCoreClock/2;
break;
case 0x03:
var_Pclk_u32 = SystemCoreClock/8;
break;
}
pg. 7
util_BitClear(LPC_UART0->LCR,(SBIT_DLAB)); // Clear DLAB after setting DLL,DLM
}
int main()
{
char a[]="\n\rHello World";
int i;
SystemInit();
uart_init(9600); // Initialize the UART0 for 9600 baud rate
pg. 8
Experiment No 2:-Speed Control of the DC Motor
Main code:-
#include <lpc17xx.h>
#define SBIT_PWMMR0R 1 //This bit is used to Reset PWMTC whenever it Matches PWMRx(x:0-6)
#define SBIT_PWMENA3 11 //This bit is used to enable/disable the PWM output for PWMx(x:1-6)
int main(void)
{
int dutyCycle;
SystemInit();
/* Cofigure pins(P2_2 ) for PWM mode. */
LPC_PINCON->PINSEL4 = (1<<PWM_3) ;
while(1)
{
{
LPC_PWM1->MR3 = dutyCycle; /* Increase the dutyCycle from 0-100 */
delay_ms(5);
}
if(!(LPC_GPIO2->FIOPIN & 0x00000800))//if sw 23 pressed
{
while(!(LPC_GPIO2->FIOPIN & 0x00000800));
pg. 9
dutyCycle-=10; //decrement duty cycle 10%
if(dutyCycle<0)
{
dutyCycle=0;
}
}
else if(!(LPC_GPIO2->FIOPIN & 0x00001000)) //if SW 22 pressed
{
while(!(LPC_GPIO2->FIOPIN & 0x00001000));
}
}
pg. 10
Experiment No 3:-Stepper Motor Interface and rotate clockwise and anticlockwise
#include <lpc17xx.h>
for(i=0;i<ms;i++)
for(j=0;j<20000;j++); //delay subroutine
}
for(cycle=0; cycle<13; cycle++)// for loop condition for number of rotation. It gives approx 90 degree rotation
{
LPC_GPIO0->FIOPIN = 0x00008000 ; // p0.15 pin
delay(100);
LPC_GPIO0->FIOPIN = 0x00010000 ;// p0.16 pin
delay(100);
LPC_GPIO0->FIOPIN = 0x00020000 ; // p0.17 pin
delay(100);
LPC_GPIO0->FIOPIN = 0x00040000 ;// p0.18 pin
delay(100);
}
}
pg. 11
Stepper motor rotation clockwise and anticlockwise.
#include "lpc17xx.h"
void delay();
void delay()
{
int i,j;
for(i=0;i<0xff;i++)
for(j=0;j<0x400;j++);
}
LPC_GPIO0->FIODIR |= 0x00078000;
while(1)
{
if(rotate==1)
{
LPC_GPIO0->FIOPIN = 0x00008000 ;
delay();
LPC_GPIO0->FIOPIN = 0x00010000 ;
delay();
LPC_GPIO0->FIOPIN = 0x00020000 ;
delay();
LPC_GPIO0->FIOPIN = 0x00040000 ;
delay();
}
else
{
LPC_GPIO0->FIOPIN = 0x00040000 ;
delay();
LPC_GPIO0->FIOPIN = 0x00020000 ;
delay();
LPC_GPIO0->FIOPIN = 0x00010000 ;
delay();
LPC_GPIO0->FIOPIN = 0x00008000 ;
delay();
}
rotate=1;
}
else if(!(LPC_GPIO2->FIOPIN & 0x00001000))
{
while(!(LPC_GPIO2->FIOPIN & 0x00001000));
rotate=0;
}
}
}
pg. 12
Experiment No 4:-Display digital output for given analog input using internal ADC
#include "lpc17xx.h"
#include "lcd.h"
#define VREF 3.3 //Reference Voltage at VREFP pin, given VREFN = 0V(GND)
#define ADC_CLK_EN (1<<12)
#define SEL_AD0_2 (1<<2) //Select Channel AD0.2
#define CLKDIV 1 //ADC clock-divider (ADC_CLOCK=PCLK/CLKDIV+1) = 12.5Mhz @ 25Mhz PCLK
#define PWRUP (1<<21) //setting it to 0 will power it down
#define START_CNV (1<<24) //001 for starting the conversion immediately
#define ADC_DONE (1U<<31) //define it as unsigned value or compiler will throw #61-D warning
#define ADCR_SETUP_SCM ((CLKDIV<<8) | PWRUP)
////////// Init ADC0 CH2 /////////////////
Init_ADC()
{
// Convert Port pin 0.25 to function as AD0.2
LPC_SC->PCONP |= ADC_CLK_EN; //Enable ADC clock
LPC_ADC->ADCR = ADCR_SETUP_SCM | SEL_AD0_2;
LPC_PINCON->PINSEL1 |= (1<<18) ; //select AD0.2 for P0.25
}
}
////////// DISPLAY ADC VALUE /////////////////
Display_ADC()
{
unsigned int adc_value = 0;
char buf[4] = {5};
float voltage = 0.0;
adc_value = Read_ADC();
sprintf((char *)buf, "%3d", adc_value); // display 3 decima place
lcd_putstring16(0,"ADC VAL = 000 "); //1st line display
lcd_putstring16(1,"Voltage 00 V"); //2nd line display
lcd_gotoxy(0,10);
lcd_putstring(buf);
voltage = (adc_value * 3.3) / 4095 ;
lcd_gotoxy(1,8);
sprintf(buf, "%3.2f", voltage);
lcd_putstring(buf);
}
////////// MAIN /////////////////
int main (void)
{
init_lcd();
Init_ADC();
lcd_putstring16(0,"** MICROLAB **");
lcd_putstring16(1,"** INSTRUMENTS **");
delay(60000);
delay(60000);
delay(60000);
lcd_putstring16(0,"ADC Value.. ");
lcd_putstring16(1,"voltage.......");
while(1)
{
Display_ADC();
delay(100000);
pg. 13
}
}
LCD Code:-
#include "lpc17xx.h"
#include "lcd.h"
void Lcd_CmdWrite(unsigned char cmd);
void Lcd_DataWrite(unsigned char dat);
#define LCDRS 9
#define LCDRW 10
#define LCDEN 11
#define LCD_D4 19
#define LCD_D5 20
#define LCD_D6 21
#define LCD_D7 22
#define LcdData LPC_GPIO0->FIOPIN
#define LcdControl LPC_GPIO0->FIOPIN
#define LcdDataDirn LPC_GPIO0->FIODIR
#define LcdCtrlDirn LPC_GPIO0->FIODIR
#define LCD_ctrlMask ((1<<LCDRS)|(1<<LCDRW)|(1<<LCDEN))
#define LCD_dataMask ((1<<LCD_D4)|(1<<LCD_D5)|(1<<LCD_D6)|(1<<LCD_D7))
void delay(unsigned int count)
{
int j=0, i=0;
for (j=0;j<count;j++)
for (i=0;i<50;i++);
}
delay(10000);
delay(1000);
}
lcd_gotoxy( line, 0 );
while(*string != '\0' && len--)
{
lcd_putchar( *string );
string++;
}
}
void init_lcd( void )
{
LcdDataDirn |= LCD_dataMask; // Configure all the LCD pins as output
LcdCtrlDirn |= LCD_ctrlMask;
Lcd_CmdWrite(0x03);//
delay(2000);
Lcd_CmdWrite(0x03);//
delay(1000);
Lcd_CmdWrite(0x03);//
delay(100);
pg. 15
Lcd_CmdWrite(0x2);// Initialize LCD in 4-bit mode
Lcd_CmdWrite(0x28);// enable 5x7 mode for chars
Lcd_CmdWrite(0x0e);// Display OFF, Cursor ON
Lcd_CmdWrite(0x06);//Entry mode
Lcd_CmdWrite(0x01);// Clear Display
delay(1);
}
pg. 16
Experiment No 5:-Interface DAC and generate Triangular and Square Waveform
#include "LPC17xx.h"
uint32_t val;
int main()
{
SystemInit();
LPC_PINCON->PINSEL1 |= 0x02<<20; //p0.26 pinsel bits 20 and 21
while(1)
{
while(1)
{
val++;// increment values by 6
LPC_DAC->DACR=(val<<6);//send values to dac
if(val>=0x3ff)// if value exceeds 1024
{
break;
}
}
while(1)
{
val--; // decrement value by 6
LPC_DAC->DACR=(val<<6);// send value to dac
if(val<=0x000)// if value come down by 0
{
break;
}
}
}
pg. 17
Square Wave generation:-
#include "LPC17xx.h"
void delay(unsigned int ms)// delay subroutine
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<2000;j++);
}
int main()
{
SystemInit();
LPC_PINCON->PINSEL1 |= 0x02<<20;//p0.26 pinsel bits 20 and 21
while(1)
{
LPC_DAC->DACR=0xffff;// send maximum values to dac
delay(20); // delay
delay(20);
}
pg. 18
Experiment No 6:-Interface 4X4 Matrix Keypad and display in LCD
Main code:-
#include "lpc17xx.h"
#include "lcd.h"
/////////////////////////////////////////////
// Matrix Keypad Scanning Routine
//
// COL1 COL2 COL3 COL4
// 0 1 2 3 ROW 1
// 4 5 6 7 ROW 2
// 8 9 A B ROW 3
// C D E F ROW 4
//////////////////////////////////////////////
#define COL1 0
#define COL2 1
#define COL3 4
#define COL4 8
#define ROW1 9
#define ROW2 10
#define ROW3 14
#define ROW4 15
KEY_CTRL_CLR |= COLMASK;
KEY_CTRL_SET |= temp;
}
pg. 19
lcd_putstring16(0,"Press HEX Keys..");// 1st line display
lcd_putstring16(1,"Key Pressed = ");// 2nd line display
while (1)
{
key = 0;
for( i = 0; i < 4; i++ )
{
// turn on COL output one by one
col_write(rval[i]);
key++;
if (!(KEY_CTRL_PIN & (1<<ROW2)))
break;
key++;
if (!(KEY_CTRL_PIN & (1<<ROW3)))
break;
key++;
if (!(KEY_CTRL_PIN & (1<<ROW4)))
break;
key++;
}
if (key == 0x10)
lcd_putstring16(1,"Key Pressed = ");
else
{
lcd_gotoxy(1,14);
lcd_putchar(keyPadMatrix[key]);
}
}
LCD code:-
#include "lpc17xx.h"
#include "lcd.h"
void Lcd_CmdWrite(unsigned char cmd);
void Lcd_DataWrite(unsigned char dat);
#define LCDRS 9
#define LCDRW 10
#define LCDEN 11
#define LCD_D4 19
#define LCD_D5 20
#define LCD_D6 21
#define LCD_D7 22
#define LcdData LPC_GPIO0->FIOPIN
#define LcdControl LPC_GPIO0->FIOPIN
#define LcdDataDirn LPC_GPIO0->FIODIR
#define LcdCtrlDirn LPC_GPIO0->FIODIR
#define LCD_ctrlMask ((1<<LCDRS)|(1<<LCDRW)|(1<<LCDEN))
#define LCD_dataMask ((1<<LCD_D4)|(1<<LCD_D5)|(1<<LCD_D6)|(1<<LCD_D7))
void delay(unsigned int count)
pg. 20
{
int j=0, i=0;
for (j=0;j<count;j++)
for (i=0;i<30;i++);
}
delay(10000);
delay(1000);
}
delay(1000);
delay(1000);
}
void lcd_clear( void)
{
Lcd_CmdWrite( 0x01 );
}
int lcd_gotoxy( unsigned char x, unsigned char y)
{
unsigned char retval = TRUE;
pg. 21
if( (x > 1) && (y > 15) )
{
retval = FALSE;
}
else
{
if( x == 0 ) Lcd_CmdWrite( 0x80 + y );
else if( x==1 ) Lcd_CmdWrite( 0xC0 + y );
}
return retval;
}
void lcd_putchar( unsigned char c )
{
Lcd_DataWrite( c );
}
void lcd_putstring( char *string )
{
while(*string != '\0')
{
lcd_putchar( *string );
string++;
}
}
void lcd_putstring16( unsigned char line, char *string )
{
unsigned char len = 16;
lcd_gotoxy( line, 0 );
while(*string != '\0' && len--)
{
lcd_putchar( *string );
string++;
}
}
void init_lcd( void )
{
LcdDataDirn |= LCD_dataMask; // Configure all the LCD pins as output
LcdCtrlDirn |= LCD_ctrlMask;
pg. 22
Experiment No 7:-Using external interrupt switches toggle the led’s
Main code:-
#include <lpc17xx.h>
void EINT1_IRQHandler(void)
{
LPC_SC->EXTINT = (1<<SBIT_EINT1); /* Clear Interrupt Flag */
LPC_GPIO1->FIOPIN ^= (1<< LED1); /* Toggle the LED1 everytime INTR1 is generated */
}
void EINT2_IRQHandler(void)
{
LPC_SC->EXTINT = (1<<SBIT_EINT2); /* Clear Interrupt Flag */
LPC_GPIO1->FIOPIN ^= (1<< LED2); /* Toggle the LED2 everytime INTR2 is generated */
}
int main()
{
SystemInit();
while(1)
{
// Do nothing
}
}
pg. 23
Experiment No 8:-Display 0-F in 7 segment display
Main Code:-
#include <lpc17xx.h>
for(i=0;i<ms;i++)
for(j=0;j<40000;j++);
}
while(1)
{
pg. 24
LPC_GPIO1->FIOSET = 0x00000300;//set e to make 9
delay_ms(200);
LPC_GPIO1->FIOCLR = 0x00004713;//clear all segments
LPC_GPIO1->FIOSET = 0x00000100;//set d to make A
delay_ms(200);
LPC_GPIO1->FIOCLR = 0x00004713;//clear all segments
LPC_GPIO1->FIOSET = 0x00000003;//set a,b to make b
delay_ms(200);
LPC_GPIO1->FIOCLR = 0x00004713;//clear all segments
LPC_GPIO1->FIOSET = 0x00004012;//set set b,c,g to make C
delay_ms(200);
LPC_GPIO1->FIOCLR = 0x00004713;//clear all segments
LPC_GPIO1->FIOSET = 0x00000401;//set a,f to make d
delay_ms(200);
LPC_GPIO1->FIOCLR = 0x00004713;//clear all segments
LPC_GPIO1->FIOSET = 0x00000012;//set b,c to make E
delay_ms(200);
LPC_GPIO1->FIOCLR = 0x00004713;//clear all segments
LPC_GPIO1->FIOSET = 0x00000112;//set b,c,d to make F
delay_ms(200);
}
}
pg. 25
Experiment No 9:-Interface SPI ADC and display Ambient temperature
Main code:-
#include <LPC17xx.H>
#include <stdint.h>
#include <stdio.h>
#include "delay.h"
#include "spi_manul.h"
#include "lcd.h"
#define pulse_val 2
main()
float vin;
char buf[20];
SystemInit ();
lcd_init();
lcd_str("SPI 3202-b");
delay(60000);
delay(60000);
while(1)
lcd_clr();
lcd_cmd(0x80);
spi_rsv = spi_data1(15);
lcd_str(buf);
delay(50000);
delay(50000);
pg. 26
}
#include <LPC17xx.H>
#include "delay.h"
#define pulse_val 2
#define CLK 1<<27
#define CS 1<<28
#define DDOUT 26
#define DOUT 1<<25
#define DIN 1<<26
#define spi_stst 0
unsigned int spi_data(char sel)
{
char clks = 4;
LPC_GPIO0->FIODIR |= CS|CLK;
LPC_GPIO3->FIODIR = DOUT;
LPC_GPIO0->FIOSET = CS|CLK;
LPC_GPIO3->FIOCLR = DOUT;
nop_delay(100);
#if spi_stst
if ( LPC_GPIO3->FIOPIN & DIN )
{
return 'P';
}
#endif
LPC_GPIO0->FIOCLR = CS;
nop_delay(pulse_val);
while(clks)
{
LPC_GPIO0->FIOCLR = CLK;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
nop_delay(pulse_val);
clks--;
}
LPC_GPIO0->FIOCLR = CLK;
nop_delay(pulse_val);
if (!( LPC_GPIO3->FIOPIN & DIN ) )
{
return 'U';
}
clks = 12;
while(clks)
{
clks--;
LPC_GPIO0->FIOCLR = CLK;
pg. 27
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
nop_delay(pulse_val);
}
nop_delay(pulse_val);
if (!( LPC_GPIO3->FIOPIN & DIN ) )
{
return 'U';
}
return 'Z';
}
unsigned int spi_data1(char sel)
{
unsigned int spi_reg=0;
char clks = 12;
LPC_GPIO0->FIODIR |= CS|CLK;
LPC_GPIO3->FIODIR = DOUT;
LPC_GPIO0->FIOSET = CS|CLK;
LPC_GPIO3->FIOSET = DOUT;
LPC_GPIO3->FIOPIN = DIN;
nop_delay(100);
LPC_GPIO0->FIOCLR = CS;
//start condi
LPC_GPIO0->FIOCLR = CLK;
LPC_GPIO3->FIOSET = DOUT;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
nop_delay(5);
//single mode
LPC_GPIO0->FIOCLR = CLK;
LPC_GPIO3->FIOSET = DOUT;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
nop_delay(5);
//chanl 1
LPC_GPIO0->FIOCLR = CLK;
LPC_GPIO3->FIOSET = DOUT;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
nop_delay(5);
//msb first
LPC_GPIO0->FIOCLR = CLK;
LPC_GPIO3->FIOSET = DOUT;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
nop_delay(5);
//smpling
// LPC_GPIO0->FIOCLR = CLK;
pg. 28
// nop_delay(pulse_val);
// LPC_GPIO0->FIOSET = CLK;
// nop_delay(2);
//null bit
LPC_GPIO0->FIOCLR = CLK;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
// while ( ( LPC_GPIO3->FIOPIN & DIN ) == DIN );
// if( !( LPC_GPIO3->FIOPIN & DIN ) );
// {
// return 'U';
// }
nop_delay(5);
clks = 12;
while(clks)
{
LPC_GPIO0->FIOCLR = CLK;
nop_delay(pulse_val);
LPC_GPIO0->FIOSET = CLK;
if( ( LPC_GPIO3->FIOPIN & DIN ) )
{
spi_reg |= 1<<(clks-1);
}
else
{
spi_reg = spi_reg;
}
clks--;
nop_delay(5);
}
nop_delay(1);
return spi_reg;
}
#include <LPC17xx.H>
#include "delay.h"
#define RRW (7<<9)
#define DATA_L (15<<19)
void lcd_pin(void)
{
LPC_GPIO0->FIODIR |= RRW|DATA_L;
}
LPC_GPIO0->FIOCLR |= RRW|DATA_L;
delay(10);
pg. 29
LPC_GPIO0->FIOPIN = ( ( ( cmd & 0xf ) ) << 19 )| (1<<11);
delay(200);
LPC_GPIO0->FIOPIN = ( ( ( cmd & 0xf ) ) << 19 );
LPC_GPIO0->FIOCLR |= RRW|DATA_L;
delay(10);
void lcd_clr(void)
{
lcd_cmd(0x03);
delay(10);
lcd_cmd(0x2);
lcd_cmd(0x28);
lcd_cmd(0x0e);
lcd_cmd(0x06);
lcd_cmd(0x01);
delay(10);
}
pg. 30