Wednesday, 13 August 2014

PROGRAM FOR BUBBLE SORT


  • Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorithm that works by repeatedly stepping through the list to be sorted, comparing each pair of adjacent items and swapping them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted. The algorithm gets its name from the way smaller elements "bubble" to the top of the list. Because it only uses comparisons to operate on elements, it is a comparison sort. Although the algorithm is simple, most of the other sorting algorithms are more efficient for large lists.

Step-by-step example[edit]

  • Let us take the array of numbers "5 1 4 2 8", and sort the array from lowest number to greatest number using bubble sort. In each step, elements written in bold are being compared. Three passes will be required.
    First Pass:
    5 1 4 2 8 ) \to ( 1 5 4 2 8 ), Here, algorithm compares the first two elements, and swaps since 5 > 1.
    ( 1 5 4 2 8 ) \to ( 1 4 5 2 8 ), Swap since 5 > 4
    ( 1 4 5 2 8 ) \to ( 1 4 2 5 8 ), Swap since 5 > 2
    ( 1 4 2 5 8 ) \to ( 1 4 2 5 8 ), Now, since these elements are already in order (8 > 5), algorithm does not swap them.
    Second Pass:
    1 4 2 5 8 ) \to ( 1 4 2 5 8 )
    ( 1 4 2 5 8 ) \to ( 1 2 4 5 8 ), Swap since 4 > 2
    ( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
    Now, the array is already sorted, but our algorithm does not know if it is completed. The algorithm needs one whole pass without any swap to know it is sorted.
    Third Pass:
    1 2 4 5 8 ) \to ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
  • DYNAMIC MEMORY ALLOCATION :=
when the the memory needs of a program can only be determined during runtime,this is called dynamic memory allocation.

 For example, when the memory needed depends on user input. On these cases, programs need to dynamically allocate memory, for which the C++ language integrates the operators new and delete.

THE PROGRAM WRITTEN BELOW IS SELF TESTED AND VERY TRUE.THE CODE IS GIVEN BELOW.

#include<iostream>
using namespace std;
void main()
{
int temp;
    
int n;
int *a;       //pointer
cout<<"enter the size of array\n";
cin>>n;
a=new int[n]; //dynamic memory allocation
for(int z=0;z<n;z++)  //get elements of array
{
cin>>a[z];
}
for(int i=1;i<n-2;i++)  //compare and swap
{
    for(int z=1;z<n;z++)
{
if(a[z]<a[z-1])
{
temp=a[z-1];
a[z-1]=a[z];
a[z]=temp;
      }
}}
for(int z=0;z<n;z++) //display the array after comparing has been done
{
cout<<"\t"<<a[z];}
system("pause");
}

Friday, 1 August 2014

CREATING A GUI AND DISPLAYING TWO IMAGES

  1. MATLAB IS AN VERY EFFICIENT TOOL FOR VARIOUS ENGINEERING PURPOSES.
  2. GUI(GRAPHICAL USER INTERFACE)  is a type of interface that allows users to interact with electronic devices through graphical icons and visual indicators such as secondary notation, as opposed to text-based interfaces, typed command labels or text navigation. GUIs were introduced in reaction to the perceived steep learning curve of command-line interfaces  which require commands to be typed on the keyboard.
  3. WE ARE GONNA CREATE A GUI TO DISPLAY TWO IMAGES IN THE SAME AXES VIA SAME BUTTON.

  • FIRST CLICK ON THE NEW BUTTON FROM THE MENU BAR. GO FOR A GRAPHICAL USER INTERFACE.
  • SAVE YOUR FIGURE . A POP-UP WINDOW WILL APPEAR WHERE YOU CAN DESIGN AND BUILT YOUR GUI. A ".m" FILE ASSOCIATED WITH YOUR FIGURE WILL BE AUTOMATICALLY GENERATED.
  • THE WINDOW WILL APPEAR LIKE THIS.
     
  • YOU CAN CHANGE THE PATTERN IN WHICH YOUR COMPONENTS ARE TO BE APPEARED.



  • SELECT A PUSH BUTTON AND TWO AXES WHERE YOU WILL BE DISPLAYING YOUR IMGAGES.
  • YOU CAN THE STRING OF THE BUTTON BY CHANING ITS STRING IN THE PROPERTY INSPECTOR. AS SHOWN


  • CALLBACK IS A FUNCTION ASSOCIATED WITH EVERY GUI COMPONENTS WHERE THE FUNCTION WHICH IS TO BE PERFORMED BY THAT COMPONENT IS WRITTEN.
  •  OPENING FUNCTION PRESENT IN ANY GUI ".m" FILE IS THE FUNCTION WHICH IS FIRST OPENED WHEN THE GUI IS RUNNED,.
  • DO THE SAME IN YOUR PROGRAM BUT WITH THE MODIFICATIONS THAT "n" SHOULD BE THE A STRING WHICH IS THE DEFAULT DIRECTORY FOR YOUR CURRENT MATLAB FOLDER.

  •  

THE CODE IS GIVEN AS :

RUN YOUR GUI AND SELECT ANY IMAGE. 



Wednesday, 9 July 2014

LCD INTERFACING IN 8051


  • LCD display is an inevitable part in almost all embedded projects and this article is about  interfacing 16×2 LCD with 8051 micro controller. Many guys find it hard to interface LCD module with the 8051 but the fact is that if you learn it properly, its a very easy job and by knowing it you can easily design embedded projects like digital voltmeter / ammeter, digital clock, home automation displays, status indicator display, digital code locks, digital speedometer/ odometer, display for music players etc etc. In order to understand the interfacing first you have to know about the 16×2 LCD module
  • 16×2 LCD module is a very common type of LCD module that is used in 8051 based embedded projects. It consists of 16 rows and 2 columns of 5×7 or 5×8 LCD dot matrices. 
  • In this LCD each character is displayed in 5x7 pixel matrix.

16×2 LCD module commands.

16×2 LCD module has a set of preset command instructions. Each command will make the module to do a particular task. The commonly used commands and their function are given in  the  table below.
Command                      Function
0FLCD ON, Cursor ON, Cursor blinking ON
01    Clear screen
2Return home
4Decrement cursor
06Increment cursor
EDisplay ON ,Cursor ON
80Force cursor to the beginning of  1st line
C0Force cursor to the beginning of 2nd line
38Use 2 lines and 5×7 matrix
83Cursor line 1 position 3
3CActivate second line
0C3Jump to second line, position3
OC1Jump to second line, position1

  • The pin numbers, their name and corresponding functions are shown in the table  below.
  1. VEE pin is meant for adjusting the contrast of the LCD display and the contrast can be adjusted by varying the voltage at this pin. This is done by connecting one end of a POT to the Vcc (5V), other end to the Ground and connecting the center terminal (wiper) of of the POT to the VEE pin. 
  2. This LCD has two registers.
    1.      Command/Instruction Register - stores the command instructions given to the LCD. A command is an instruction given to LCD to do a predefined task like initialising, clearing the screen, setting the cursor position, controlling display etc.
     2.      Data Register - stores the data to be displayed on the LCD. The data is the ASCII value of the character to be displayed on the LCD.
  3. High logic at the RS pin will select the data register and  Low logic at the RS pin will select the command register. If we make the RS pin high and the put a data in the 8 bit data line (DB0 to DB7) , the LCD module will recognise it as a data to be displayed .  If we make RS pin low and put a data on the data line, the module will recognise it as a command.
  4. R/W pin is meant for selecting between read and write modes. High level at this pin enables read mode and low level at this pin enables write mode.
  5. E pin is for enabling the module. A high to low transition at this pin will enable the module.
  6. DB0 to DB7 are the data pins. The data to be displayed and the command  instructions are  placed on these pins. 
  • LCD initialisation.

     The steps that has to be done for initialising the LCD display is given below and these steps are common for almost all applications.
    • Send 38H to the 8 bit data line for initialisation
    • Send for 0CH making LCD ON, cursor ON and cursor blinking ON.
    • Send 06H for incrementing cursor position.
    • Send 01H for clearing the display and return the cursor.
    • Send 80H for the display of the character from column 0 and on line 1

  • Sending data to the LCD.

    The steps for sending data to the LCD module is given below. I have already said that the LCD module has pins namely RS, R/W and E. It is the logic state of these pins that make the module to determine whether a given data input  is a command or data to be displayed.
    • Make R/W low.
    • Make RS=0 if data byte is a command and make RS=1 if the data byte is a data to be displayed.
    • Place data byte on the data register.
    • Pulse E from high to low.

  • we will see how to display "hello world"  on LCD.
  • THE CIRCUIT DIAGRAM IS GIVEN BELOW:

HERE IS THE CODE FOR THE SAME:-


#include<reg51.h>     //THIS HEADER FILE CONTAINS ALL THE INBUILT LIBRARIES….
sfr port=0x80;         //SFR STANDS FOR SPECIAL FUNCTION REGISTER. HERE WE HAVE                                       // USED  PORT-0 . PORT-0 STARTS FROM THE MEMORY LOCATION 80.                                     //NOTE   HERE THE DIFFERENCE HOW WE HAVE WRITTEN 80 IN HEX. I.E                                 // 0X80 WHEREAS IN ASSEMBLY WE USED TO WRITE 80H. TO SEE ALL THE                               //  MEMORY LOCATIONS OF ALL PORT JUST DOUBLE CLICK ON THE                                       //  REG51 FILE YOU HAVE ADDED TO YOUR GROUP.
sbit rs=P2^0;     //SBIT IS A KEYWORD TO SELECT A SINGLE BIT.HERE WE HAVE                                                //CONNECTED THE R/S PIN OF THE LCD WITH THE P2^0
sbit rw=P2^1;    // R/W  FOR READ OR WRITE
sbit en=P2^2;   // ENALE .
void delay(unsigned int t);     //DELAY FUNCTION DECLARATION WITH AN UNSIGNED INT                                                  //ARGUMENT.
void lcdcmd(unsigned char value); //LCDCMD FUNCTION DECLARATION WITH UNSINGED                                                    // CHAR ARGUMENT TO LOAD INSTRUCTIONS INTO THE                                                                                         //COMMAND REGISTERS OF THE LCD
void lcddata(unsigned char value1);   // LCDDATA FUNCTION DECLARATION WITH UNSINGED                                                             //CHAR ARGUMENT TO LOAD INSTRUCTIONS INTO THE                                                   //DATA REGISTERS OF THE LCD.THE CHARACTER PASSED AS A                                                ARGUMENT WILL BE DISPLAYED ON LCD

void main()                      //ITS HERE WHERE THE PROGRAMS START.
{           lcdcmd(0x38);   //TO INITIALISE THE 16x2 LCD WITH 5x7 MATRIX.
                delay(20);            //WAIT FOR 20 mSec
                lcdcmd(0x0C);    //DISPLAY ON ,CURSOR OFF
                delay(20);            //AGAIN WAIT
                lcdcmd(0x01);   //CLEAR THE SCREEN
                delay(20);
                lcdcmd(0x06);  //INCREATMENT CURSOR (SHIFT CURSOT TO RIGHT)
                delay(25);
                lcdcmd(0x80);  //FORCE THE DISPLAY OF THE CHARACTER IN FIRST LINE AND                                                     ZERO BLOCK.
                delay(25);
                lcddata('H');   //LOADS  CHARACTER ‘H’ ON PORT-0 AND THE SAME WILL BE                                                    DISPLAYED
                delay(25);      //WAIT FOR FEW  MILLISECONDS
lcddata('E');     //LOADS  CHARACTER ‘E’ ON PORT-0 AND THE SAME WILL BE                                      // DISPLAYED BUT IN      THE SUBSEQUENT BLOCK. ALL THE LETTERS                      //  ARE DISPLAYED IN THE SAME MANNER.
                delay(25);
                lcddata('L'); 
                delay(25);
                lcddata('L'); 
                delay(25);
                lcddata('0'); 
                delay(25);
                lcddata(' '); 
                delay(25);
                lcddata('W'); 
                delay(25);
                lcddata('0'); 
                delay(25);
                lcddata('R'); 
                delay(25);
                lcddata('L'); 
                delay(25);
                lcddata('D'); 
                delay(25);
                }             


               
                void lcdcmd(unsigned char value)       //LCDCMD DUNCTION DEFINATION
{
port=value;                                                        //LOADS THE ARGUMENT ON PORT-0
rs=0;                                                  //R/S PIN LOW FOR WRITING INTO COMMAND                                                                              //  REGISTERS .
rw=0;                                               //R/W PIN LOW .THIS IS BECAUSE WE ARE USING LCD IN                                                 WRITING MODE                                
en=1;                                        //A HIGH –TO-LOW PULSE MUST BE GIVEN TO  ENABLE.
delay(1);
en=0;
return;                                  //RETURNS THE OUTPUT OF THE FUNCTION
}             

                void lcddata(unsigned char value1) //LCDDATA FUNCTION DEFINATION
{
port=value1;                               //LOADS THE ARGUMENT ON PORT-0
rs=1;                                               //R/S PIN HIGH FOR WRITING INTO DATA REGISTERS .
rw=0;                                           //R/W PIN LOW .THIS IS BECAUSE WE ARE USING LCD IN                                                          WRITING MODE                                  
en=1;     ;                                  //A HIGH –TO-LOW PULSE MUST BE GIVEN TO  ENABLE.
delay(1);
en=0;
return;                              //RETURNS THE OUTPUT OF THE FUNCTION

}
void delay(unsigned int t)     //DELAY FUNCTION DEFINATION
{
                int i,j;                             //INTIALISATION
for(i=0;i<=t;i++)             //THE LOOP WILL EXECUTE TILL  i IS LESS THAN  t. HERE t  IS THE                                            //VALUE GIVEN BY US
    for(j=0;j<=1275;j++);  //FOR EVERY I THIS LOOP WILL BE EXECUTED FOR 1275 TIMES.SO                                         //ULTIMATELY THE DELAY WOULD BE ix1275.

}





Sunday, 29 June 2014

CREATING A SIMPLE PROGRAM TO BLINK A LED USING ASSEMBLY


A microcontroller is a self-contained system with peripherals, memory and a processor that can be used as an embedded system. Most programmable microcontrollers that are used today are embedded in other consumer products or machinery including phones, peripherals, automobiles and household appliances for computer systems. Due to that, another name for a microcontroller is "embedded controller." Some embedded systems are more sophisticated, while others have minimal requirements for memory and programming length and a low software complexity. Input and output devices include solenoids, LCD displays, relays, switches and sensors for data like humidity, temperature or light level, amongst others.


General architecture of a microcontroller 
The architecture of a microcontroller depends on the application it is built for. For example, some designs include usage of more than one RAM, ROM and I/O functionality integrated into the package.

  • BEFORE PROCEEDING TO THE PROGRAM HERE ARE SOME OF THE IMPORTANT THINGS YOU SHOULD KNOW ABOUT PROGRAMMING FOR MCU(MICRO-CONTROLLER UNIT). 
  1. ITS A 8 BIT MICRO-CONTROLLER WITH FOUR REGISTER BANKS. B0,B1,B2,B3. EACH BANK CONSIST OF 7 REGISTERS NAMELY   r0,r1,r2,r3,r4,r5,r6.r7 .EACH REGISTER  CAN STORE A VALUE FROM 0 TO 255 (IN DECIMAL) OR FROM 00h TO FFh. HERE h STANDS FOR HEXADECIMAL .
  2. SO HERE IS A BASIC PROGRAM TO BLINK A LED WITH A DELAY SO THAT THE OUTPUT CAN BE SEEN.
  3. WE USE DELAY BECAUSE THE CODE EXECUTION TIME OF THE MCU IS EXTREMELY FAST. SO BY CALLING THE DELAY FUNCTION WE MAKE A HALT BEFORE THE EXECUTION OF THE NEXT  STEP.
  4. NOW WE GONNA DISCUSS  EVERY ASPECT OF THE DELAY FUNCTION.
  5. Delay:              :-   //WE HAVE CREATED A LABEL/FUNCTION FOR DELAY
mov r0,#200       :-//WE  HAVE ASSIGNED A VALUE OF 200 TO THE REGISTER r0.
                          //FOR DOING IT WE HAVE USED THE KEYWORD ‘MOV’ WHICH STANDS FOR MOVE.    
h1:mov r1,#100  :-//AGAIN WE HAVE  CREATED A JUNCTION SO THAT WE CAN HAVE A LOOP HERE.
                                 //NOW WE HAVE MOVED A VALUE OF100 INTO THE REGISTER r1.
                                //’”h1:”  IS JUST A LABEL 

h2:djnz r1,h2 :-//AGAIN WE  HAVE CREATED A JUNCTION HERE  NAMED h2.
                       //DJNZ STANDS FOR DECREASE AND JUMP IF NOT EQUAL TO ZERO
//IT IS A CONDITIONAL STATEMENT  WHICH, ON BEING TRUE RESULTS IN JUMP OF THE  
    //EXECUTION  TO A DIFFERENT JUNCTION /LABEL.
//WHICH MEANS  IT  WILL DECREASE THE VALUE OF r1 BY 1,i.e  NOW THE VALUE OF
// r1  WILL BE  99. AFTER  DECREASING THE VALUE  IT  WILL  JUMP  TO  h2  LABEL WHICH IN TURN
//RESULT IN FURTHER DECREASE IN THE VALUE OF r1. THIS WILL CONTINUE  UNTILL THE
//VALUE IN r1 BECOMES ZERO. AFTER  DECREASING THE VALUE  IN r1 TO ZERO  PROGRAM 
//EXECUTION  WILL GO THE NEXT COMMAND.
                djnz r0,h1                 :-                                                                                                                     
//HERE AGAIN  IT  WILL START DECREASING THE VALUE PRESENT IN THE REGISTER r0. NOW    
//THE DIFFERENCE IS THAT , AFTER DECREASING THE VALUE THE PROGRAM EXECUTION WILL    
      //JUMP TO h1 LABEL. I.E IT WILL AGAIN  MOVE A VALUE OF 100 INTO THE REGISTER  r1.
//AGAIN IT WILL DECREASE THE REGISTER r1 TO ZERO . NOW THE VALUE  IN r0 WILL BE
//DECREASED AGAIN . AND THE EXECUTION WILL BE SHIFTED TO THE LABEL  h1.  SO
ULTIMATELY THE  THE DECREAMENT WILL  OCCUR FOR  200*100. 
Ret       :-  //IT IS A KEYWORD  USED TO GET OUTPUT FROM A FUNCTION  OR THE PROGRAM
// IT  IS NECESSARY  TO WRITE “ret” AT THE END OF THE PROGRAM CODE.
End    :-  //THIS IS ALSO A KEYWORD USED TO CLOSE THE MEMORY LOCATION  AND THE  PROGRAM .
                //IT IS ALSO NECESSARY TO WRITE "end " AT THE END OF THE PROGRAM CODE
  • AFTER YOU HAVE CREATED THE PROGRAM YOU CAN DEBUG TO SEE IF IT IS WORKING OR NOT.
  • BEFORE DEBUG BUILD THE TARGET AS SHOWN.

  • AFTER YOU HAVE BUILT YOUR TARGET GO TO  DEBUG TAB IN YOUR MENU BAR. CLICK ON IT AND START THE SESSION.
  • AFTER STARTING THE SESSION IT WILL SHOW A MESSAGE DIALOGUE. CLICK ON OK AND PROCEED. NOW CLICK ON THE PERIPHERALS. GO TO I/O-PORTS AND SELECT THE PORT WE HAVE USED OR WHOSE BIT WE HAVE USED.
  • NOW A POP UP WINDOW WILL OPEN  AS SHOWN.PRESS F11 TO CHECK THE OUTPUT OF YOUR PROGRAM.
  • YOU CAN CHECK THE VALUE OF THE REGISTERS IN THE WINDOW NAMED REGISTERS NEXT TO THE FILE WHERE YOU HAD WRITTEN  YOUR PROGRAM.

Saturday, 28 June 2014

CREATING A PROJECT IN KEIL

  • KEIL IS AN INTEGRATED DEVELOPMENT ENVIRONMENT FOR PROGRAMMING IN ASSEMBLY AND EMBEDDED C FOR MICRO-CONTROLLERS
  • THIS ARTICLE IS ABOUT HOW TO CREATE A PROJECT IN KEIL. THE PROCEDURE IS SAME FOR ALL THE VERSIONS AND ILLUSTRATED BELOW.
  • AFTER READING THIS YOU WILL BE ABLE TO CREATE A PROJECT WITHOUT ANY DIFFICULTLY.


        THE STEPS ARE GIVEN BELOW.
  1.  OPEN KEIL FROM DESKTOP ICON OR FROM THE START UP MENU BY SELECTING THE KEIL ICON.
  2. THE SOFTWARE WILL TAKE TIME TO INITIALIZE .ONCE IT OPEN GO TO THE PROJECT TAB FROM THE MENU BAR  AS  SHOWN.
  3. A POP UP WINDOW WILL APPEAR AS SHOWN BELOW WITH THE LIST OF  DEVICE  (MICRO-CONTROLLER )  PROVIDERS/MANUFACTURERS.
  4. FOR ME I HAVE SELECTED NXP(POWERED BY PHILIPS) AS I M USING P89V51RD2. 

  5. A POP-UP WINDOW STATING 'COPY  'START.A51' TO THE PROJECT AND ITS FILES' WILL APPEAR  .CLICK ON NO AND PROCEED WITH THE STEPS.
  6. A WINDOW LIKE THIS WILL APPEAR WITH A TARGET AND A SOURCE  GROUP. THE WINDOW IS CALLED PROGRAM WINDOW AND ALL THE FILES ASSOCIATED IN THE GROUP ARE VISIBLE HERE.
  7. CLICK ON THE NEW FROM THE FILE TAB FROM THE MENU BAR.
  8. A NEW TEXT FILE WILL OPEN WITH THE DEFAULT NAME TEXT1. THIS IS WHERE WE GONNA WRITE OUR PROGRAM. BUT BEFORE THAT WE HAVE TO SAVE IT AND ADD IT TO THE  SOURCE GROUP.
  9. SAVE THE FILE WITH THE EXTENSION (.asm) WHERE .asm STANDS FOR ASSEMBLY. FOR A C FILE SAVE THE FILE WITH THE EXTENSION (.C)
  10. NOW THAT WE HAVE CREATED THE .ASM FILE  , WE HAVE TO ADD THE SAME WITH THE SOURCE GROUP. RIGHT CLICK ON THE SOURCE GROUP .A LIST OF ACTIONS WILL APPEAR. SELECT THE' ADD FILES TO THE GROUP.'
  11. A WINDOW WILL APPEAR ASKING FOR THE FILE TO BE ADDED TO THE SOURCE GROUP.MOSTLY IT WILL OPEN THE FOLDER WHERE YOU HAVE CREATED THE PROJECT. JUST TYPE THE NAME OF THE FILE WITH .asm  EXTENTSION AND CLICK ON ADD.

  12. THIS IS IT. YOU HAVE CREATED THE PROJECT AND CAN BEGAN WITH YOUR PROGRAMMING.

NOTE:- FOR PEOPLE WRITING IN C THE PROCEDURE TO CREATE THE PROJECT IS ALMOST  SIMILAR  OTHER THAN THAT THE FILE IS SAVED WITH THE EXTENSION .C AND A HEADER FILE IS ALSO ADDED TO THE SOURCE GROUP. I WILL POST THE SAME SOON.
IF THERE IS ANY DOUBT PLEASE DO LET ME KNOW.