lho 22 c and the 8051. the silicon labs ise uses the keil c51 compiler. the code size is limiter...

34
LHO 22 C and the 8051

Upload: garry-harrington

Post on 06-Jan-2018

229 views

Category:

Documents


2 download

DESCRIPTION

Assembly Code Object Code Assembler C Code Object Code Linker Machine Code Compiler Code Generation Flow for assembler and C.

TRANSCRIPT

Page 1: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

LHO 22

C and the 8051

Page 2: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

      The Silicon Labs ISE uses the Keil C51 compiler.      The code size is limiter to 2K      C has replaced PL/M (the original Intel high level language (HLL) for imbedded systems).      Versions of basic and a few other HLL such as FOUTH are available for the 8051.      The Keil C51 is a complete implementation of ANSI C with extensions.o   The extensions support various features of the 8051.o   See Chapter 3 of the C51 compiler manual. You can find this using the Help menu.

Page 3: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

Assembly Code

Object Code

Assembler

C Code

Object Code

Linker

Machine Code

Compiler

Code Generation Flow for assembler and C.

Page 4: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

Include c8051F020.h in each C file. c8051F020.h defines the special function registers (SFR) of the 8051F020./* BYTE Registers */sfr P0 = 0x80; /* PORT 0 */sfr SP = 0x81; /* STACK POINTER */sfr DPL = 0x82; /* DATA POINTER - LOW BYTE */sfr DPH = 0x83; /* DATA POINTER - HIGH BYTE */sfr P4 = 0x84; /* PORT 4 */…/* BIT Registers *//* TCON 0x88 */sbit TF1 = TCON ^ 7; /* TIMER 1 OVERFLOW FLAG */sbit TR1 = TCON ^ 6; /* TIMER 1 ON/OFF CONTROL */

Page 5: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

uni.c;Version 1.1 11/29/07#include <c8051f020.h> // SFR declarations#include <stdio.h>//----------------------------------------------------------------// Init - Configure UDC// Returns : None// Parameters : None//----------------------------------------------------------------void init_crossbar(void);void init_ports(void);void init_osc(void);

Page 6: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

void Init (void){// Disable interrupts EA = 0;// Disable watchdog timer WDTCN = 0xde; WDTCN = 0xad; init_osc();// Enable crossbar switch init_crossbar();// Set up ports init_ports();}

Page 7: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

//------------------------------------------------------------------// rd_buttons - Configure IO ports// Returns : Value of buttons connected to P5.3 - P5.0. // Pressing a button// sets bit to a '1'.// Parameters : None//------------------------------------------------------------------unsigned char rd_buttons(void){ unsigned char btns; btns = (~P5) & 0x0f; return(btns);}

Page 8: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

//------------------------------------------------------------------// wr_leds - Outsput to led's// Returns : None// Parameters : leds//------------------------------------------------------------------void wr_leds(unsigned char leds){ P5 = (leds << 4) | 0x0f;}

Page 9: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

//------------------------------------------------------------------ // init_ports - Configure IO ports // Returns : None // Parameters : None //------------------------------------------------------------------ void init_ports(void) { P0MDOUT = 0x00; P1MDOUT = 0x00; P2MDOUT = 0x00; P3MDOUT = 0x00; P5 = 0x0f; //TURN ON LEDS P74OUT = 0x08; //SET PORT 5 OUT AS PUSH PULL P4 = 0xff; ; }

Page 10: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

//-----------------------------------------------------------------// Init_crosbar - Configure crossbar switch// Returns : None// Parameters : None//-----------------------------------------------------------------void init_crossbar (void){ XBR0 = 0x0; XBR1 = 0x0; XBR2 = 0x48; // Enable cross bar}

Page 11: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

//------------------------------------------------------------------// init_osc - Use external 22.1184 XTAL as clock// Returns : None// Parameters : None//------------------------------------------------------------------void init_osc (void){ OSCXCN = 0x67; //enable 22.1184 MHz XTAL OSC while ((OSCXCN & 0x80) == 0); // Wait till XTLVLD // pin is set See Fig 14.3 OSCICN = 0x88; //config internal oscillator }

Page 12: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

//-----------------------------------------------------------------// delay - delay for visiable blink// Returns : None// Parameters : None//-----------------------------------------------------------------void delay(void){ unsigned int x; unsigned char y; while(x++) { y = 10; while(y--); }

Page 13: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 14: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 15: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 16: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 17: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

External data memory, up to 64 kB, can be read from and written to and is physically located externally from the CPUAccess to external data in XDATA space is very slow when compared to access to internal dataThis is because external data memory is accessed indirectly through the data pointer register (DPTR) which must be loaded with a 16-bit address before accessing the external memoryThere are two different data types in Cx51 used to access external data: xdata and pdataThe xdata memory specifier refers to any location in the 64 kB address space of external data memory (default for LARGE memory model)The pdata memory type specifier refers to only 1 page or 256 bytes of external data memory (default for COMPACT memory model)The pdata area is accessed using registers R0 and R1 indirectly (@R0 or @R1) instead of the DPTR (@DPTR), so accessing pdata is slightly faster than xdata. This is also what limits pdata to 256 bytes (R0 and R1 are 8 bits).

Page 18: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

Arithmetic operators perform basic arithmetic operations

All arithmetic operators except the negation (–) operator have two operands.

The negation (unary minus) operator returns the 2’s complement value of the operandThis is especially useful to specify a count that will be counted up rather than counted downExample: unsigned int count = 0x0F;

// TMR2RL gets 0xFFFF-0x0F+1 = 0xFFF1TMR2RL = -count;

Operator Description

+ Add

– Subtract

* Multiply

/ Divide

% Modulo (remainder of division)

– Negation (unary minus)

Page 19: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

Relational operators compare data and the outcome is either True or False

if statements, for loops and while loops often make use of relational operators

Operator Description

== Equal to

!= Not Equal to

< Less than

> Greater than

<= Less than or equal to

>= Greater than or equal to

Page 20: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

Logical operators operate on Boolean data (True and False values) and the outcome is also Boolean

Operator Description

&& Logical AND

|| Logical OR

! Logical NOT

Page 21: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

The C language also has several bitwise operators

Bitwise operators affect a variable on a bit-by-bit basisExample: Result = Value1 & Value2;

If Value1 = 00100100b and Value2 = 10100000b, the result of Value1 & Value2 is:00100100b & 10100000b = 00100000b

Operator Description

& Bitwise AND

| Bitwise OR

~ Bitwise NOT (1’s Compliment)

^ Bitwise Exclusive OR

<< Shift Left

>> Shift Right

Page 22: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high

Turning Bits OnTurn on a particular bit by ORing with a 1

Turning Bits OffTurn off a particular bit by ANDing with a 0

Toggling BitsTurning a bit from off to on or on to off by EXCLUSIVELY ORing with a 1

Bit wise Operators

Page 23: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 24: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 25: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 26: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 27: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 28: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 29: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 30: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 31: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 32: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 33: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high
Page 34: LHO 22 C and the 8051.  The Silicon Labs ISE uses the Keil C51 compiler.  The code size is limiter to 2K  C has replaced PL/M (the original Intel high