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

18CSL48 Merged

This document is a laboratory manual for the Microcontroller and Embedded Systems Laboratory course at Jnana Vikas Institute of Technology. It contains 16 experiments to be conducted using an ARM7TDMI/LPC2148 microcontroller evaluation board. The experiments include programs to multiply binary numbers, find sums and factorials, sort arrays, and interface with hardware like DC motors, keyboards, and 7-segment displays. The manual provides objectives, program listings, and instructions for each experiment. It is intended to help students develop and test programs for the ARM7TDMI microcontroller using embedded C programming and the Keil μVision toolchain.

Uploaded by

Abhishek n
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
136 views

18CSL48 Merged

This document is a laboratory manual for the Microcontroller and Embedded Systems Laboratory course at Jnana Vikas Institute of Technology. It contains 16 experiments to be conducted using an ARM7TDMI/LPC2148 microcontroller evaluation board. The experiments include programs to multiply binary numbers, find sums and factorials, sort arrays, and interface with hardware like DC motors, keyboards, and 7-segment displays. The manual provides objectives, program listings, and instructions for each experiment. It is intended to help students develop and test programs for the ARM7TDMI microcontroller using embedded C programming and the Keil μVision toolchain.

Uploaded by

Abhishek n
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 48

JNANAVIKAS INSTITUTE OF TECHNOLOGY

(Affiliated to VTU Belgaum, Approved by AICTE, New Delhi)


Vidya Soudha, Padmashree G.D.Goyalji campus, Off Bangalore-Mysore Highway, Bidadi – 562109,
Ramanagara Taluk & District, Bengaluru

DEPARTMENT OF ELECTRONICS AND COMMUNICATION ENGINEERING

LABORATORY MANUAL OF

MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY


(Academic year 2021-2022)
SUBJECT CODE: 18CSL48
SEMESTER IV
[As per Choice Based Credit System (CBCS) scheme]

PREPARED BY
Mr. ABHISHEK N B.E., M.Tech.,
ASSISTANCE PROFESSOR
DEPARTMENT OF ELECTRONICS AND COMMUNICATION ENGINEERING
JNANAVIKAS INSTITUTE OF TECHNOLOGY
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY
(Effective from the academic year 2021 -2022)
SEMESTER – IV

Course Code: 18CSL48 CIE Marks: 40 Number of Contact Hours/Week: 0:2:2 SEE Marks: 60
Total Number of Lab Contact Hours: 36 Exam Hours: 03 Credits – 2

Course Learning Objectives: This course (18CSL48) will enable students to:
• Develop and test Program using ARM7TDMI/LPC2148
• Conduct the experiments on an ARM7TDMI/LPC2148 evaluation board using evaluation version of
Embedded 'C' & Keil Uvision-4 tool/compiler.

Programs List:
PART A

Conduct the following experiments by writing program using ARM7TDMI/LPC2148 using an


evaluation board/simulator and the required software tool.

1. Write a program to multiply two 16 bit binary numbers.

2. Write a program to find the sum of first 10 integer numbers.

3. Write a program to find factorial of a number.

4. Write a program to add an array of 16 bit numbers and store the 32 bit result in internal RAM

5. Write a program to find the square of a number (1 to 10) using look-up table.

6. Write a program to find the largest/smallest number in an array of 32 numbers.

7. Write a program to arrange a series of 32 bit numbers in ascending/descending order.

8. Write a program to count the number of ones and zeros in two consecutive memory locations.

PART –B

Conduct the following experiments on an ARM7TDMI/LPC2148 evaluation board using evaluation


version of Embedded 'C' & Keil Uvision-4 tool/compiler.

9. Display “Hello World” message using Internal UART.

10. Interface and Control a DC Motor.

11. Interface a Stepper motor and rotate it in clockwise and anti-clockwise direction.

12. Determine Digital output for a given Analog input using Internal ADC of ARM controller.

13. Interface a DAC and generate Triangular and Square waveforms.

14. Interface a 4x4 keyboard and display the key code on an LCD.

15. Demonstrate the use of an external interrupt to toggle an LED On/Off.

16. Display the Hex digits 0 to F on a 7-segment LED interface, with an appropriate delay in between.
TABLE OF CONTENTS

SL NO NAME OF PROGRAM PAGE


NUMBER

1 Introduction 1-5

2 Write a program to multiply two 16 bit binary numbers. 7

3 Write a program to find the sum of first 10 integer numbers. 8

4 Write a program to find factorial of a number. 9

5 Write a program to add an array of 16 bit numbers and store the 32 bit 10-11
result in internal RAM

6 Write a program to find the square of a number (1 to 10) using look-up 12


table.

7 Write a program to find the largest/smallest number in an array of 32 13-15


numbers.

8 Write a program to arrange a series of 32 bit numbers in 16-19


ascending/descending order.

9 Write a program to count the number of ones and zeros in two 20-21
consecutive memory locations.

10 Introduction to hardware 23-24

11 Display “Hello World” message using Internal UART. 25-26

12 Interface and Control a DC Motor. 27

13 Interface a Stepper motor and rotate it in clockwise and anti-clockwise 28-29


direction.

14 Determine Digital output for a given Analog input using Internal ADC of 30-33
ARM controller.

15 Interface a DAC and generate Triangular and Square waveforms. 34-35

16 Interface a 4x4 keyboard and display the key code on an LCD. 36-41

17 Demonstrate the use of an external interrupt to toggle an LED On/Off. 42-43

18 Display the Hex digits 0 to F on a 7-segment LED interface, with an 44-45


appropriate delay in between.
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

INTRODUCTION
An embedded system is an electronic/electro-mechanical system designed to perform a specific
function and is a combination of both hardware and firmware (software). An embedded system
combines mechanical, electrical, and chemical components along with a computer, hidden inside, to
perform a single dedicated purpose.

There are more computers on this planet than there are people, and most of these computers are
single-chip microcontrollers that are the brains of an embedded system. Embedded systems are a
ubiquitous component of our everyday lives. We interact with hundreds of tiny computers every day that
are embedded into our houses, our cars, our bridges, our toys, and our work. As our world has become
more complex, so have the capabilities of the microcontrollers embedded into our devices. Therefore, the
world needs a trained workforce to develop and manage products based on embedded microcontrollers.

A general-purpose computing system is a combination of generic hardware and general-purpose


operating system for executing a variety of application, whereas an embedded system is a combination
system is a combination of special purpose hardware and embedded OS/firmware for executing a specific
set of applications.

The ARM microcontroller stands for Advance Risk Machine; it is one of the extensive and most
licensed processor cores in the world. The first ARM processor was developed in the year 1978 by
Cambridge University, and the first ARM RISC processor was produced by the Acorn Group of
Computers in the year 1985.

These processors are specifically used in portable devices like digital cameras, mobile phones,
home networking modules and wireless communication technologies and other embedded systems due
to the benefits, such as low power consumption, reasonable performance, etc. This article gives an
overview of ARM architecture with each module’s principle of working.

Keil MDK is the complete software development environment for a wide range of ARM Cortex-
M based microcontroller devices. MDK includes the μVision IDE and debugger, Arm C/C++ compiler,
and essential middleware components. It supports all silicon vendors with more than 6,000 devices and is
easy to learn and user.

1 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Features of ARM Processor


AIM: To study of ARM processor system and describe the features of architecture 1.1.

Features of ARM DEVELOPMENT KIT Processor:

• 16-bit/32-bit ARM7TDMI-S microcontroller in a tiny LQFP64 package.8 kB to 40 kB of on-chip static


RAM and 32 kB to 512 kB of on-chip flash memory. 128- bit wide interface/accelerator enables high-
speed 60 MHz operation. In System/In-Application Programming (ISP/IAP) via on-chip boot loader
software.

• Single flash sector/full chip erase in 400 ms and programming of 256 bytes in 1 ms.USB 2.0
Full-speed compliant device controllers with 2 kB of endpoint RAM. The LPC2146/48 provides 8
kB of on-chip RAM accessible to USB by DMA.

• One or two (LPC2141/42 vs. LPC2144/46/48) 10-bit ADCs provide a total of 6/14 analog inputs, with
conversion times as low as 2.44 μs per channel. Single 10-bit DAC provides variable analog output
(LPC2142/44/46/48 only). Two 32-bit timers/external event counters (with four capture and four compare
channels each), PWM unit (six outputs) and watchdog.

• Low power Real-Time Clock (RTC) with independent power and 32 kHz clock input. Multiple serial
interfaces including two UARTs (16C550), two Fast I2Cbus (400 kbit/s), SPI and SSP with buffering
and variable data length capabilities.

• Vectored Interrupt Controller (VIC) with configurable priorities and vector addresses. Up to 45 of
5 V tolerant fast general purpose I/O pins in a tiny LQFP64 package. Up to 21
externals interrupt pins available.

• 60MHz maximum CPU clock available from programmable on-chip PLL with settling time of
100μs.On-chip integrated oscillator operates with an external crystal from 1 MHz to 25 MHz Power
saving modes include Idle and Power down.

• Individual enable/disable of peripheral functions as well as peripheral clock scaling for additional
power optimization. Processor wake-up from Power-down mode via external interrupt or BOD.
Single power supply chip with POR and BOD circuits: CPU operating voltage range of 3.0 V to 3.6 V
(3.3 V ± 10 %) with 5 V tolerant I/O pads.

2 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

1.2. General Block Diagram:

1.3. Power Supply:

• The external power can be AC or DC, with a voltage between (9V/12V, 1A output) at 230V AC
input. The ARM board produces +5V using an LM7805 voltage regulator, which provides supply
to the peripherals.
• LM1117 Fixed +3.3V positive regulator used for processor & processor related peripherals.

1.4. Flash Programming Utility

• NXP (Philips) NXP Semiconductors produce a range of Microcontrollers that feature both on-chip
Flash memory and the ability to be reprogrammed using In-System Programming technology.

3 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

PIN DIAGRAM

1.5. On-board Peripherals:

• 8-Nos. of Point LED’s (Digital Outputs)


• 8-Nos. of Digital Inputs (slide switch)
• 2 Lines X 16 Character LCD Display
• I2C Enabled 4 Digit Seven-segment display
• 128x64 Graphical LCD Display
• 4 X 4 Matrix keypad
• Stepper Motor Interface
• 2 Nos. Relay Interface
• Two UART for serial port communication through PC
• Serial EEPROM
• On-chip Real Time Clock with battery backup
• PS/2 Keyboard interface(Optional)
• Temperature Sensor
• Buzzer(Alarm Interface)
• Traffic Light Module(Optional)

4 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

KEIL UVISION4 IDE INSTALLATION:

Installation of keiluVision4 as follows.

1. Go to EXE folder and then uvision4.2 in the CD and run Keil4 Arm.exe file.
2. Next
3. Click on the option “I agree to all the terms of...” and then give Next
4. Next
5. Give name and the mail id (it might be any mail id) and then Next
6. Click Finish to complete the installation.

PROJECT CREATION IN KEILUV4 IDE:

7. Create a project folder before creating NEW project.

8. Open Keil uVision4 IDE software by double clicking on “Keil Uvision4” icon.

9. Go to “Project” then to “New uVision Project” and save it with a name in the respective project
folder, already you created.
10. Select the device as “NXP” In that “LPC2148” then press OK and then press “YES” button to add
“startup’s” file.
11. In startup file go to Configuration Wizard. In Configuration Wizard window uncheck PLL Setup and
check VPBDIV Setup.
12. Go to “File” In that “New” to open an editor window. Create your source file and use the header file
“lpc21xx.h” in the source file and save the file. Colour syntax highlighting will be enabled once the file is
saved with a extension such as “.C “.
13. Right click on “Source Group 1” and select the option “Add Existing Files to Group Source
Group 1“add the *.C source file(s) to the group.
14. After adding the source file you can see the file in Project Window.

15. Then go to “Project” in that “Translate” to compile the File (s). Check out the Build output window.

16. Right click on Target1 and select options for Target Target1.

Then go to option “Target” in that


1. Xtal 12.0MHz

2. Select “Use MicroLIB”.

3. Select IROM1 (starting 0x0 size 0x80000).

4. Select IRAM1 (starting 0x40000000 size 0x8000).

Then go to option “Output”

1. Select “Create Hex file”.


2. Then go to option “Linker”
Select “Use Memory Layout for Target Dialog”. To come out of this window press OK.
17. Go to “Project” in that “Build Target” for building all source files such as “.C”,”.ASM”, “.h”, files,
etc…This will create the *.HEX file if no warnings & no Errors. Check out the Build output window.

5 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

PART -A

6 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 1 Write a program to multiply two 16 bit binary numbers.


AIM: To write a program to multiply two 16 bit binary numbers using ARM7TDMI/LPC2148 using an
evaluation board/simulator and the required software tool.

AREA RESET, CODE, READONLY


START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R1, #6400 ; STORE FIRST NUMBER IN R1
MOV R2, #3200 ; STORE SECOND NUMBER IN R2
MUL R3, R1, R2 ; MULTIPLICATION
STOP B STOP
END ; MARK END OF FILE

RESULT:

7 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 2 write a program to find the sum of first 10 integer numbers.

AIM: To write a program to find the sum of first 10 integer numbers using ARM7TDMI/LPC2148 using
an evaluation board/simulator and the required software tool.

AREA RESET, CODE, READONLY


START
ENTRY
MOV R1, #10 ; LOAD 10 TO REGISTER
MOV R2, #0 ; EMPTY THE REGISTER TO STORE RESULT
LOOP
ADD R2, R2, R1 ; ADD THE CONTENT OF R1 WITH RESULT AT R2
SUBS R1, #0X01 ; DECREMENT R1 BY 1
BNE LOOP ; REPEAT TILL R1 GOES 0
STOP B STOP ; JUMPS BACK TO C CODE
END

RESULT:

8 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL4

Program No: 3 write a program to find factorial of a number.

AIM: To write a program to find factorial of a number using ARM7TDMI/LPC2148 using an


evaluation board/simulator and the required software tool.

AREA RESET, CODE, READONLY


START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R0, #4 ; STORE FACTORIAL NUMBER IN R0
MOV R1, R0 ; MOVE THE SAME NUMBER IN R1
FACT SUBS R1, R1, #1 ; SUBTRACTION
CMP R1, #1 ; COMPARISON
BEQ STOP ; BRANCH TO STOP THE LOOP IF EQUAL
MUL R3, R0, R1 ; MULTIPLICATION
MOV R0, R3 ; RESULT
BNE FACT ; BRANCH TO THE LOOP IF NOT EQUAL
STOP B STOP
END ; MARK END OF FILE

RESULT:

9 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 4 write a program to add an array of 16 bit numbers and store the 32
bit result in internal RAM
AIM: To write a program to add an array of 16 bit numbers and store the 32 bit results in internal RAM using an
evaluation board/simulator and the required software tool.

AREA RESET, CODE, READONLY


START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R1, #3 ; STORE 3 IN R1
MOV R3, #0X40000000 ; STORE INTERNAL RAM MEMORY IN R3
LDR R4, [R3] ; STORE R3 IN R4
LOOP ADD R3, R3, #4 ; ADDITION
LDR R5, [R3] ; STORE R3 IN R5
ADD R4, R5 ; ADDITION
SUBS R1, R1, #1 ; SUBTRCTION
CMP R1, #0 ; COMPARE
BNE LOOP ; BRANCH TO THE LOOP IF NOT EQUAL
MOV R6, #0X4000001C
STR R4, [R6] ; STORE R6 IN R4
B1 B B1
NOP ; NO OPERATION
NOP ; NO OPERATION
END ; MARK END OF FILE

10 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

RESULT:

11 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:5 Write a program to find the square of a number (1 to 10) using look-
up table.
AIM: To write a program to find the square of a number (1 to 10) using look-up table. using
ARM7TDMI/LPC2148 using an evaluation board/simulator and the required software tool.

AREA RESET, CODE, READONLY


START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
LDR R0, = TABLE1 ; LOAD START ADDRESS OF LOOKUP TABLE
LDR R1,= 3 ; LOAD NO WHOSE SQUARE IS TO BE FIND
MOV R1, R1, LSL#0X2 ; GENERATE ADDRESS CORRESPONDING TO ;
SQUARE OF GIVEN NO
ADD R0, R0, R1 ; LOAD ADDRESS OF ELEMENT IN LOOKUP TABLE
LDR R3, [R0] ; GET SQUARE OF GIVEN NO IN R3
STOP B STOP ; LOOKUP TABLE CONTAINS SQUARES OF NOS FROM 0
; TO 10 (IN HEX)
TABLE1 DCD 0X00000000 ; SQUARE OF 0=0
DCD 0X00000001 ; SQUARE OF 1=1
DCD 0X00000004 ; SQUARE OF 2=4
DCD 0X00000009 ; SQUARE OF 3=9
DCD 0X00000010 ; SQUARE OF 4=16
DCD 0X00000019 ; SQUARE OF 5=25
DCD 0X00000024 ; SQUARE OF 6=36
DCD 0X00000031 ; SQUARE OF 7=49
DCD 0X00000040 ; SQUARE OF 8=64
DCD 0X00000051 ; SQUARE OF 9=81
DCD 0X00000064 ; SQUARE OF 10=100
END ; MARK END OF FILE

RESULT:

12 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 6 Write a program to find the largest/smallest number in an array of 32


numbers.
AIM: To write a program to find the largest/smallest number in an array of 32 numbers using
ARM7TDMI/LPC2148 using an evaluation board/simulator and the required software tool.

LARGEST
AREA RESET, CODE, READONLY
START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R5, #6 ; INTIALISE COUNTER TO 6(I.E. N=7)
LDR R1,=VALUE1 ; LOADS THE ADDRESS OF FIRST VALUE
LDR R2, [R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LOOP
LDR R4,[R1], #4 ; WORD ALIGN T0 ARRAY ELEMENT
CMP R2, R4 ; COMPARE NUMBERS
BHI LOOP1 ; IF THE FIRST NUMBER IS > THEN GOTO LOOP1
MOV R2, R4 ; IF THE FIRST NUMBER IS < THEN MOV CONTENT R4 TO R2
LOOP1
SUBS R5, R5, #1 ; DECREMENT COUNTER
CMP R5, #0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY ENDS
LDR R4,=RESULT ; LOADS THE ADDRESS OF RESULT
STR R2, [R4] ; STORES THE RESULT IN R2
STOP B STOP ; ARRAY OF 32 BIT NUMBERS(N=7)
VALUE1
DCD 0X44444444
DCD 0X22222222
DCD 0X11111111
DCD 0X33333333
DCD 0XAAAAAAAA
DCD 0X88888888
DCD 0X99999999
AREA DATA2, DATA, READWRITE ; TO STORE RESULT IN GIVEN ADDRESS
RESULT DCD 0X400000000
END ; MARK END OF FILE

13 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

RESULT:

SMALLEST

AREA RESET, CODE, READONLY


START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R5,#6 ; INTIALISE COUNTER TO 6(I.E. N=7)
LDR R1,=VALUE1 ; LOADS THE ADDRESS OF FIRST VALUE
LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LOOP
LDR R4,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
CMP R2,R4 ; COMPARE NUMBERS
BLS LOOP1 ; IF THE FIRST NUMBER IS < THEN GOTO LOOP1
MOV R2,R4 ; IF THE FIRST NUMBER IS > THEN MOV CONTENT R4 TO R2
LOOP1
SUBS R5, R5,#1 ; DECREMENT COUNTER
CMP R5,#0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY ENDS
LDR R4,=RESULT ; LOADS THE ADDRESS OF RESULT
STR R2, [R4] ; STORES THE RESULT IN R2
STOP B STOP ; ARRAY OF 32 BIT NUMBERS (N=7)
VALUE1
DCD 0X44444444
DCD 0X22222222
DCD 0X11111111
DCD 0X33333333
DCD 0XAAAAAAAA
DCD 0X88888888
DCD 0X99999999
AREA DATA2, VDATA, VREADWRITE ; TO STORE RESULT IN GIVEN ADDRESS
RESULT DCD 0X400000000
END

14 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

RESULT:

15 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 7 Write a program to arrange a series of 32 bit numbers


in ascending/descending order.
AIM: To write a program to arrange a series of 32 bit numbers in ascending/descending order using
ARM7TDMI/LPC2148 using an evaluation board/simulator and the required software tool.

ASCENDING

AREA RESET, CODE, READONLY


START
ENTRY ;MARK FIRST INSTRUCTION TO EXECUTE
MOV R8,#4 ; INTIALISE COUNTER TO 4(I.E. N=4)
LDR R2,=CVALUE ; ADDRESS OF CODE REGION
LDR R3,=DVALUE ; ADDRESS OF DATA REGION
LOOP0
LDR R1,[R2],#4 ; LOADING VALUES FROM CODE REGION
STR R1,[R3],#4 ; STORING VALUES TO DATA REGION
SUBS R8,R8,#1 ; DECREMENT COUNTER
CMP R8,#0 ; COMPARE COUNTER TO 0
BNE LOOP0 ; LOOP BACK TILL ARRAY ENDS
START1
MOV R5,#3 ; INTIALISE COUNTER TO 3(I.E. N=4)
MOV R7,#0 ; FLAG TO DENOTE EXCHANGE HAS
OCCURED
LDR R1,=DVALUE ; LOADS THE ADDRESS OF FIRST VALUE
LOOP
LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LDR R3,[R1] ; LOAD SECOND NUMBER
CMP R2,R3 ; COMPARE NUMBERS
BLT LOOP2 ; IF THE FIRST NUMBER IS < THEN GOTO LOOP2
STR R2,[R1],#-4 ; INTERCHANGE NUMBER R2 & R3
STR R3,[R1] ; INTERCHANGE NUMBER R2 & R3
MOV R7,#1 ; FLAG DENOTING EXCHANGE HAS TAKEN PLACE
ADD R1,#4 ; RESTORE THE PTR
LOOP2
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY ENDS
CMP R7,#0 ; COMPARING FLAG
BNE START1 ; IF FLAG IS NOT ZERO THEN GO TO START1 LOOP
STOP B STOP ; ARRAY OF 32 BIT NUMBERS(N=4) IN CODE
CVALUE ;REGION
DCD 0X44444444
DCD 0X11111111
DCD 0X33333333
DCD 0X22222222
AREA DATA1, DATA, READWRITE ; ARRAY OF 32 BIT NUMBERS IN DATA
REGION
DVALUE
DCD 0X40000000
END ; MARK END OF FILE

16 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

RESULT:

17 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

DESCENDING
AREA RESET, CODE, READONLY
START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R8,#4 ; INTIALISE COUNTER TO 4(I.E. N=4)
LDR R2,=CVALUE ; ADDRESS OF CODE REGION
LDR R3,=DVALUE ; ADDRESS OF DATA REGION
LOOP0
LDR R1,[R2],#4 ; LOADING VALUES FROM CODE REGION
STR R1,[R3],#4 ; STORING VALUES TO DATA REGION
SUBS R8,R8,#1 ; DECREMENT COUNTER
CMP R8,#0 ; COMPARE COUNTER TO 0
BNE LOOP0 ; LOOP BACK TILL ARRAY ENDS
START1
MOV R5,#3 ; INTIALISE COUNTER TO 3(I.E. N=4)
MOV R7,#0 ; FLAG TO DENOTE EXCHANGE HAS
OCCURED
LDR R1,=DVALUE ; LOADS THE ADDRESS OF FIRST VALUE
LOOP
LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LDR R3,[R1] ; LOAD SECOND NUMBER
CMP R2,R3 ; COMPARE NUMBERS
BGT LOOP2 ; IF THE FIRST NUMBER IS > THEN GOTO LOOP2
STR R2,[R1],#-4 ; INTERCHANGE NUMBER R2 & R3
STR R3,[R1] ; INTERCHANGE NUMBER R2 & R3
MOV R7,#1 ; FLAG DENOTING EXCHANGE HAS TAKEN PLACE
ADD R1,#4 ; RESTORE THE PTR
LOOP2
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0 ; COMPARE COUNTER TO 0
BNE LOOP ; LOOP BACK TILL ARRAY ENDS
CMP R7,#0 ; COMPARING FLAG
BNE START1 ; IF FLAG IS NOT ZERO THEN GO TO START1 LOOP
STOP B STOP ; ARRAY OF 32 BIT NUMBERS(N=4) IN CODE REGION

18 DEPT. DEPT. OF ECE JVIT


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

CVALUE
DCD 0X44444444
DCD 0X11111111
DCD 0X33333333
DCD 0X22222222
AREA DATA1, DATA, READWRITE ; ARRAY OF 32 BIT NUMBERS IN DATA
DVALUE ;REGION
DCD 0X40000000
END ; MARK END OF FILE

19 DEPT. DEPT. OF ECE JVIT


BIDADI OF ECE JVIT BIDADI
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 8 Write a program to count the number of ones and zeros in two
consecutive memory locations.
AIM: To Write a program to count the number of ones and zeros in two consecutive memory locations
using ARM7TDMI/LPC2148 using an evaluation board/simulator and the required software tool
AREA RESET, CODE, READONLY
START
ENTRY ; MARK FIRST INSTRUCTION TO EXECUTE
MOV R2,#0 ; COUNTER FOR ONES
MOV R3,#0 ; COUNTER FOR ZEROS
MOV R7,#2 ; COUNTER TO GET TWO WORDS
LDR R6,=VALUE ; LOADS THE ADDRESS OF VALUE
LOOP MOV R1, #32 ; 32 BITS COUNTER
LDR R0,[R6],#4 ; GET THE 32 BIT VALUE
LOOP0 MOVS R0,R0, ROR #1 ; RIGHT SHIFT TO CHECK CARRY BIT (1'S/0'S)
BHI ONES ; IF CARRY BIT IS 1 GOTO ONES BRANCH OTHERWISE NEXT
ZEROS ADD R3,R3,#1 ; IF CARRY BIT IS 0 THEN INCREMENT THE COUNTER BY 1(R3)
B LOOP1 ; BRANCH TO LOOP1
ONES ADD R2,R2,#1 ; IF CARRY BIT IS 1 THEN INCREMENT THE COUNTER BY 1(R2)
SUBS R1,R1,#1 ; COUNTER VALUE DECREMENTED BY 1
BNE LOOP0 ; IF NOT EQUAL GOTO TO LOOP0 CHECKS 32BIT
SUBS R7,R7,#1 ; COUNTER VALUE DECREMENTED BY 1
CMP R7,#0 ; COMPARE COUNTER R7 TO 0
BNE LOOP ; IF NOT EQUAL GOTO TO LOOP
STOP B STOP
VALUE DCD 0X00000003, 0X00000002 ; TWO VALUES IN AN ARRAY
END ; MARK END OF FILE

20 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

RESULT:

21 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

PART- B

22 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

PROCEDURE: PROJECT CREATION IN KEILUV4 IDE:

1. Create a project folder before creating NEW project.


2. Open Keil uVision4 IDE software by double clicking on “Keil Uvision5” icon.
3. Go to “Project” then to “New uVision Project” and save it with a name in the respective
project folder, already you created.
4. Select the device as “NXP” In that “LPC2148” then press OK and then press “YES” button to add
“startup.s” file.
5. In startup file go to Configuration Wizard. In Configuration Wizard window uncheck PLL Setup
and check VPBDIV Setup.
6. Go to “File” In that “New” to open an editor window. Create your source file and use the header file
“lpc21xx.h” in the source file and save the file. Color syntax highlighting will be enabled once the file is
saved with a extension such as “.C “.
7. Right click on “Source Group 1” and select the option “Add Existing Files to Group Source Group
1“add the *.C source file(s) to the group.
8. After adding the source file you can see the file in Project Window.
9. Then go to “Project” in that “Translate” to compile the File (s). Check out the Build output window.
10. Right click on Target1 and select options for Target Target1. Then go to option “Target” in that
1. Xtal 12.0MHz
2. Select “Use MicroLIB”.
3. Select IROM1 (starting 0x0 size 0x80000).
4. Select IRAM1 (starting 0x40000000 size 0x8000).

1. Then go to option “Output”


1. Select “Create Hex file”.
2. Then go to option “Linker”

Select “Use Memory Layout for Target Dialog”. To come out of this window press OK.

11. Go to “Project” in that “Build Target” for building all source files such as “.C”,”.ASM”, “.h”, files,
etc…This will create the *.HEX file if no warnings & no Errors. Check out the Build output window.

23 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

FLASHMAGIC:

Options -> Advanced options -> Hardware Config


Enable these options only
Use DTR and RTS to control RST and ISP pin Keep RTS asserted while COM port open
Press OK then do the below settings

Step1. Communications:
1. Device : LPC2148
2. Com Port : COM1
3. Baud Rate: 9600
4. Interface : None(ISP)
5. Oscillator : 12MHz

Step2. ERASE:
1. Select “Erase Blocks Used By Hex File”.

Step3. Hex file:

1. Browse and select the Hex file which you want to download.

Step4. Options
1. Select “Verify after programming”.

Step5. Start:
2. Click Start to download the hex file to the controller.

After downloading the code the program starts executing in the hardware, then remove the
ISP jumper JP7.

24 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:9 Display “Hello World” message using Internal UART.


AIM: To write a program to Display “Hello World” message using Internal UART using an ARM7TDMI/LPC2148
evaluation board using evaluation version of Embedded 'C' & Keil Uvision-4 tool/compiler.

#include <lpc214x.h>
void uart_interrupt(void)__irq;

unsigned char temp;


unsigned char rx_flag=0,tx_flag=0;

int main(void)
{
PINSEL0=0X0000005; //select TXD0 and RXD0 lines
U0LCR = 0X00000083; //enable baud rate divisor loading and
U0DLM = 0X00; //select the data format
U0DLL = 0x13; //select baud rate 9600 bps
U0LCR = 0X00000003;
U0IER = 0X03; //select Transmit and Receive interrupt

VICVectAddr0 = (unsigned long)uart_interrupt; //UART 0 INTERRUPT


VICVectCntl0 = 0x20|6; // Assign the VIC channel uart-0 to interrupt priority 0
VICIntEnable = 0x00000040; // Enable the uart-0 interrupt

rx_flag = 0x00;
tx_flag = 0x00;

while(1)
{
while(rx_flag == 0x00); //wait for receive flag to set
rx_flag = 0x00; //clear the flag
while(tx_flag == 0x00); //wait for transmit flag to set
tx_flag = 0x00; //clear the flag
}
}

// Do this forever
void uart_interrupt(void)__irq
{
temp = U0IIR;
temp = temp & 0x06;

if(temp == 0x02)
{

25 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

tx_flag = 0xff;
VICVectAddr=0;
}
else if(temp == 0x04)
{
U0THR = U0RBR;
rx_flag = 0xff;
VICVectAddr=0;
}
}

26 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:10 Interface and Control a DC Motor


AIM: To write a program to Interface and Control a DC Motor using an ARM7TDMI/LPC2148 evaluation board
using evaluation version of Embedded 'C' & Keil Uvision-4 tool/compiler.

#include<lpc214x.h> void
clock_wise (void); void
anti_clock_wise (void);
unsigned int j=0;

int main()
{
IO0DIR= 0X00000900;
IO0SET= 0X00000100;
//P0.8 should always high.
while(1)
{
clock_wise();
for(j=0;j<400000;j++);
anti_clock_wise(); //delay
for(j=0;j<400000;j++);
} //delay
} //End of while(1)
//End of Main
void clock_wise(void)
{
IO0CLR = 0x00000900;
for(j=0;j<10000;j++); //stop motor and also turn off relay
IO0SET = 0X00000900; //small delay to allow motor to turn off motor
//Selecting the P0.11 line for clockwise and turn on
}

void anti_clock_wise(void)
{
IO0CLR = 0X00000900;
for(j=0;j<10000;j++); //stop motor and also turn off relay
IO0SET = 0X00000100; //small delay to allow motor to turn off
} //not selecting the P0.11 line for Anti clockwise

27 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:11 Interface a Stepper motor and rotate it in clockwise and anti-
clockwise direction

AIM: To write a program to Interface a Stepper motor and rotate it in clockwise and anti-clockwise direction using an
ARM7TDMI/LPC2148 evaluation board using evaluation version of Embedded 'C' & Keil Uvision-4 tool/compiler.

#include <LPC21xx.H>

void clock_wise(void);
void anti_clock_wise(void);

unsigned long int var1,var2;


unsigned int i=0,j=0,k=0;

int main(void)
{
PINSEL0 = 0x00FFFFFF; //P0.12 to P0.15 GPIo
IO0DIR |= 0x0000F000; //P0.12 to P0.15 output

while(1)
{
for(j=0;j<50;j++) // 20 times in Clock wise Rotation
clock_wise();

for(k=0;k<65000;k++); // Delay to show anti_clock Rotation

for(j=0;j<50;j++) // 20 times in Anti Clock wise Rotation


anti_clock_wise();

for(k=0;k<65000;k++); // Delay to show clock Rotation

} // End of while(1)

} // End of main

void clock_wise(void)
{
var1 = 0x00000800; //For Clockwise
for(i=0;i<=3;i++) // for A B C D Stepping
{
var1 = var1<<1; //For Clockwise
var2 = ~var1;
var2 = var2 & 0x0000F000;

IO0PIN = ~var2;

for(k=0;k<3000;k++); //for step speed variation


}

void anti_clock_wise(void)
{
var1 = 0x00010000; //For Anticlockwise

28 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

for(i=0;i<=3;i++) // for A B C D Stepping


{
var1 = var1>>1; //For Anticlockwise
var2 = ~var1;
var2 = var2 & 0x0000F000;

IO0PIN = ~var2;
for(k=0;k<3000;k++); //for step speed variation

}
}

29 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:12 Determine Digital output for a given Analog input using Internal
ADC of ARM controller

AIM: To write a program to Interface Determine Digital output for a given Analog input using Internal ADC of ARM
controller using an ARM7TDMI/LPC2148 evaluation board using evaluation version of Embedded 'C' & Keil
Uvision-4 tool/compiler.

#include <lpc214x.h>
#include <Stdio.h>

void lcd_init(void);
void wr_cn(void);
void clr_disp(void);
void delay(unsigned int);
void lcd_com(void);
void wr_dn(void);
void lcd_data(void);

unsigned int data_lcd=0;


unsigned int adc_value=0,temp_adc=0,temp1,temp2;
float temp;
char var[15],var1[15];
char *ptr,arr[]= "ADC O/P= ";
char *ptr1,dis[]="A I/P = ";

#define vol 3.3 //Reference voltage


#define fullscale 0x3ff //10 bit adc

int main()
{
PINSEL1 = 0X00040000; //AD0.4 pin is selected(P0.25)
IO0DIR = 0x000000FC; //configure o/p lines for lcd

delay(3200);
lcd_init(); //LCD initialization
delay(3200);
clr_disp(); //clear display
delay(3200); //delay

ptr = dis;
temp1 = 0x80; //Display starting address of first line 1 th pos
lcd_com();
delay(800);

while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}

ptr1 = arr;

30 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

temp1 = 0xC0; //Display starting address of second line 4 th pos


lcd_com();
delay(800);

while(*ptr1!='\0')
{
temp1 = *ptr1;
lcd_data();
ptr1 ++;
}

//infinite loop
while(1)
{
//CONTROL register for ADC
AD0CR = 0x01200010; //command register for ADC-AD0.4

while(((temp_adc = AD0GDR) &0x80000000) == 0x00000000); //to check the interrupt bit

adc_value = AD0GDR; //reading the ADC value


adc_value >>=6;
adc_value &= 0x000003ff;
temp = ((float)adc_value * (float)vol)/(float)fullscale;
sprintf(var1,"%4.2fV",temp);
sprintf(var,"%3x",adc_value);

temp1 = 0x89;
lcd_com();
delay(1200);
ptr = var1;

while(*ptr!='\0')
{
temp1=*ptr;
lcd_data();
ptr++;
}

temp1 = 0xc9;
lcd_com();
delay(1200);

ptr1 = var;
while(*ptr1!='\0')
{
temp1=*ptr1;
lcd_data();
ptr1++;
}
} // end of while(1)
} //end of main()

31 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

//lcd initialization
void lcd_init()
{
temp2=0x30;
wr_cn();
delay(800);

temp2=0x30;
wr_cn();
delay(800);

temp2=0x30;
wr_cn();
delay(800);

temp2=0x20;
wr_cn();
delay(800);

temp1 = 0x28;
lcd_com();
delay(800);

temp1 = 0x0c;
lcd_com();
delay(800);

temp1 = 0x06;
lcd_com();
delay(800);

temp1 = 0x80;
lcd_com();
delay(800);
}

void lcd_com(void)
{
temp2= temp1 & 0xf0;
wr_cn();
temp2 = temp1 & 0x0f;
temp2 = temp2 << 4;
wr_cn();
delay(500);
}

// command nibble o/p routine


void wr_cn(void) // write command reg
{
IO0CLR = 0x000000FC; // clear the port lines.
IO0SET = temp2; // Assign the value to the PORT lines

32 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

IO0CLR = 0x00000004; // clear bit RS = 0


IO0SET = 0x00000008; // E=1
delay(10);
IO0CLR = 0x00000008;
}

// data nibble o/p routine


void wr_dn(void)
{
IO0CLR = 0x000000FC; // clear the port lines.
IO0SET = temp2; // Assign the value to the PORT lines
IO0SET = 0x00000004; // set bit RS = 1
IO0SET = 0x00000008; // E=1
Delay (10);
IO0CLR = 0x00000008;
}

// data o/p routine which also outputs high nibble first


// and lower nibble next
void lcd_data(void)
{
temp2 = temp1 & 0xf0;
wr_dn();
temp2= temp1 & 0x0f;
temp2= temp2 << 4;
wr_dn();
delay(100);
}

void delay(unsigned int r1)


{
unsigned int r;
for(r=0;r<r1;r++);
}
void clr_disp(void)
{
temp1 = 0x01;
lcd_com();
delay(500);
}

33 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 13 Interface a DAC and generate Triangular and Square waveforms

AIM: To write a program to Interface a DAC and generate Triangular and Square waveforms using an
ARM7TDMI/LPC2148 evaluation board using evaluation version of Embedded 'C' & Keil Uvision-4 tool/compiler.

TRIANGULAR WAVEFORM
#include <LPC21xx.h>

int main ()
{
unsigned long int temp=0x00000000;
unsigned int i=0;

IO0DIR=0x00FF0000;

while(1)
{
// output 0 to FE
for(i=0;i!=0xFF;i++)
{
temp=i;
temp = temp << 16;
IO0PIN=temp;
}

// output FF to 1
for(i=0xFF; i!=0;i--)
{
temp=i;
temp = temp << 16;
IO0PIN=temp;
}
} //End of while(1)
} //End of main()

34 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

SQUARE WAVEFORM
#include <lpc21xx.h>

void delay(void);

int main ()
{
PINSEL0 = 0x00000000 ; // Configure P0.0 to P0.15 as
GPIO
PINSEL1 = 0x00000000 ; // Configure P0.16 to P0.31 as
GPIO
IO0DIR = 0x00FF0000 ;

while(1)
{
IO0PIN = 0x00000000;
delay();
IO0PIN = 0x00FF0000;
delay();
}
}

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

35 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No: 14 Interface a 4x4 keyboard and display the key code on an LCD

AIM: To write a program to a 4x4 keyboard and display the key code on an LCD

#include<lpc21xx.h>
#include<stdio.h>

void lcd_init(void);
void clr_disp(void);
void lcd_com(void);
void lcd_data(void);
void wr_cn(void);
void wr_dn(void);
void scan(void);
void get_key(void);
void display(void);
void delay(unsigned int);
void init_port(void);

unsigned long int scan_code[16]= {0x00EE0000,0x00ED0000,0x00EB0000,0x00E70000,


0x00DE0000,0x00DD0000,0x00DB0000,0x00D70000,
0x00BE0000,0x00BD0000,0x00BB0000,0x00B70000,
0x007E0000,0x007D0000,0x007B0000,0x00770000};

unsigned char ASCII_CODE[16]= {'0','1','2','3',


'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};

unsigned char row,col;

unsigned char temp,flag,i,result,temp1;


unsigned int r,r1;
unsigned long int var,var1,var2,res1,temp2,temp3,temp4;
unsigned char *ptr,disp[] = "4X4 KEYPAD"; unsigned
char disp0[] = "KEYPAD TESTING"; unsigned char
disp1[] = "KEY = "; int main()

{
// __ARMLIB_enableIRQ();
init_port(); //port intialisation
delay(3200); //delay
lcd_init(); //lcd intialisation
delay(3200); //delay
clr_disp(); //clear display
delay(500); //delay

//........LCD DISPLAY TEST.........//

36 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

ptr = disp;
temp1 = 0x81; // Display starting address
lcd_com();
delay(800);

while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}

//........KEYPAD Working.........//
while(1)
{
get_key();
display();
}

} //end of main()

void get_key(void) //get the key from the keyboard


{
unsigned int i;
flag = 0x00;
IO1PIN=0x000f0000;
while(1)
{
for(row=0X00;row<0X04;row++) //Writing one for col's
{
if( row == 0X00)
{
temp3=0x00700000;
}
else if(row == 0X01)
{
temp3=0x00B00000;
}
else if(row == 0X02)
{
temp3=0x00D00000;
}
else if(row == 0X03)
{
temp3=0x00E00000;
}
var1 = temp3;
IO1PIN = var1; // each time var1 value is put to port1
IO1CLR =~var1; // Once again Conforming (clearing all other bits)

37 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

scan();
delay(100); //delay
if(flag == 0xff)
break;
} // end of for
if(flag == 0xff)
break;
} // end of while

for(i=0;i<16;i++)
{
if(scan_code[i] == res1) //equate the scan_code with res1
{
result = ASCII_CODE[i]; //same position value of ascii code
break; //is assigned to result
}
}
} // end of get_key();

void scan(void)
{
unsigned long int t;
temp2 = IO1PIN; // status of port1
temp2 = temp2 & 0x000F0000; // Verifying column key
if(temp2 != 0x000F0000) // Check for Key Press or Not
{
delay(1000); //delay(100)//give debounce delay check again
temp2 = IO1PIN;
temp2 = temp2 & 0x000F0000; //changed condition is same

if(temp2 != 0x000F0000) // store the value in res1


{
flag = 0xff;
res1 = temp2;
t = (temp3 & 0x00F00000); //Verfying Row Write
res1 = res1 | t; //final scan value is stored in res1
}
else
{
flag = 0x00;
}
}
} // end of scan()

void display(void)
{
ptr = disp0;
temp1 = 0x80; // Display starting address of first line lcd_com();

38 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}

ptr = disp1;
temp1 = 0xC0; // Display starting address of second line lcd_com();

while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}
temp1 = 0xC6; //display address for key value lcd_com();

temp1 = result;
lcd_data();
}

void lcd_init (void)


{
temp = 0x30;
wr_cn();
delay(3200);

temp = 0x30;
wr_cn();
delay(3200);

temp = 0x30;
wr_cn();
delay(3200);

temp = 0x20;
wr_cn();
delay(3200);

// load command for lcd function setting with lcd in 4 bit mode,
// 2 line and 5x7 matrix display
temp = 0x28;
lcd_com();
delay(3200);

39 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

// load a command for display on, cursor on and blinking off

temp1 = 0x0C;
lcd_com();
delay(800);

// command for cursor increment after data dump


temp1 = 0x06;
lcd_com();
delay(800);

temp1 = 0x80;
lcd_com();
delay(800);
}

void lcd_data(void)
{
temp = temp1 & 0xf0;
wr_dn();
temp= temp1 & 0x0f;
temp= temp << 4;
wr_dn();
delay(100);
}

void wr_dn(void) ////write data reg


{
IO0CLR = 0x000000FC; // clear the port lines.
IO0SET = temp; IO0SET // Assign the value to the PORT lines
= 0x00000004; IO0SET // set bit RS = 1
= 0x00000008; // E=1
delay(10);
IO0CLR = 0x00000008;
}

void lcd_com(void)
{
temp = temp1 & 0xf0;
wr_cn();
temp = temp1 & 0x0f;
temp = temp << 4;
wr_cn();
delay(500);
}

void wr_cn(void) //write command reg


{
IO0CLR = 0x000000FC; // clear the port lines.

40 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

IO0SET = temp; // Assign the value to the PORT lines


IO0CLR = 0x00000004; // clear bit RS = 0
IO0SET = 0x00000008; // E=1
delay(10);
IO0CLR = 0x00000008;
}

void clr_disp(void)
{
// command to clear lcd display
temp1 = 0x01;
lcd_com();
delay(500);
}

void delay(unsigned int r1)


{
for(r=0;r<r1;r++);
}

void init_port()
{
IO0DIR = 0x000000FC; //configure o/p lines for lcd
IO1DIR = 0XFFF0FFFF;
}

41 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:15 Demonstrate the use of an external interrupt to toggle an LED


On/Off.

AIM: To write a program to Demonstrate the use of an external interrupt to toggle an LED On/Off using an
ARM7TDMI/LPC2148 evaluation board using evaluation version of Embedded 'C' & Keil Uvision-4 tool/compiler.

#include<lpc214x.h>

// Function prototypes
void lcd_init(void);
void wr_cn(void);
void clr_disp(void);
void delay(unsigned int);
void lcd_com(void);
void wr_dn(void);
void lcd_data(void);
void LCD(void);
void Extint1_Isr(void) __irq; //declaration of ISR

unsigned char int_flag, flag;

int main(void)
{
IO1DIR |= 0X02000000; //P1.25 int led
IO1SET = 0X02000000;
PINSEL0 =0X000000c0; //P0.3 EINT1

EXTMODE =0x01; //edge i.e falling egge trigger and active low
EXTPOLAR= 0X00;
VICVectAddr0 = (unsigned long) //Assign the EINT0 ISR function
Extint1_Isr; VICVectCntl0 = 0x20 | 15; //Assign the VIC channel EINT1 to interrupt priority 0
VICIntEnable |= 0x00008000; //Enable the EINT1 interrupt

while(1) //waiting for interrupt to occur


{
if(int_flag == 0x01)
{
if(flag == 0)
{
IO1CLR = 0X02000000;
flag = 1;
}
else if(flag == 1)
{
IO1SET = 0x02000000;
flag = 0;
}
int_flag = 0x00;
}

42 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

}
}

void Extint1_Isr(void)__irq //whenever there is a low edge on EINT0


{
EXTINT = 0x02; //clear the interrupt
int_flag = 0x01;
VICVectAddr=0; //Acknowledge Interrupt
}

43 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

Program No:16 Display the Hex digits 0 to F on a 7-segment LED interface, with
an appropriate delay in between

AIM: To write a program to Demonstrate the use of an external interrupt to toggle an LED On/Off using an
ARM7TDMI/LPC2148 evaluation board using evaluation version of Embedded 'C' & Keil Uvision-4 tool/compiler.

// ****** changes made by JK 0n 090115

\\\\\\\\\\\\\\\DISPLAY ARE CONNECTED IN COMMON CATHODE


MODE\\\\\\\\\\\\\\\\\\\\\ Port0 Connected to data lines of all 7 segement displays
a
----
f| g |b
|----|
e| |c
---- . dot
d
a = P0.16
b = P0.17
c = P0.18
d = P0.19
e = P0.20
f = P0.21
g = P0.22
dot = P0.23

Select lines for four 7 Segments


DIS1 P0.28
DIS2 P0.29
DIS3 P0.30
DIS4 P0.31

Values Correspoinding to Alphabets 1, 2, 3 and 4


*/

#include <LPC21XX.h>

unsigned int delay;


unsigned int Switchcount=0;
unsigned int Disp[16]={0x003F0000, 0x00060000, 0x005B0000, 0x004F0000,
0x00660000,0x006D0000, 0x007D0000, 0x00070000, 0x007F0000, 0x006F0000,
0x00770000,0x007C0000,0x00390000, 0x005E0000, 0x00790000, 0x00710000 };

#define SELDISP1 0x10000000 //P0.28


#define SELDISP2 0x20000000 //P0.29
#define SELDISP3 0x40000000 //P0.30
#define SELDISP4 0x80000000 //P0.31
#define ALLDISP 0xF0000000 //Select all display
#define DATAPORT 0x00FF0000 //P0.16 to P0.23 Data lines connected to drive Seven
Segments

44 DEPT. OF ECE JVIT BIDADI


MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY 18CSL48

int main (void)


{
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000000;
IO0DIR = 0xF0FF0000;
IO1DIR = 0x00000000;

while(1)
{
IO0SET |= ALLDISP; // select all digits
IO0CLR = 0x00FF0000; // clear the data lines to 7-segment displays
IO0SET = Disp[Switchcount]; // get the 7-segment display value from the
array

if(!(IO1PIN & 0x00800000)) // if the key is pressed


{
for(delay=0;delay<100000;delay++) // delay
{}

if((IO1PIN & 0x00800000)) // check to see if key has been released


{
Switchcount++;
if(Switchcount == 0x10) // 0 to F has been displayed ? go back to 0
{
Switchcount = 0;
IO0CLR = 0xF0FF0000;
}
}
}
}
}

45 DEPT. OF ECE JVIT BIDADI

You might also like