Monday, 14 November 2011

GRID VIEW DATA WITH SILVERLIGHT


GridView for Silverlight

Overview

GridView
RadGridView is the ultimate Silverlight grid control that features unrivalled performance through LINQ-based data engine, remarkably flexible hierarchy model, advanced features such as Excel-like filtering, row details, totals, export to Word/Excel/CSV and many more. And as good looks count, we’ve created a truly lookless Silverlight Grid that can be easily customized to blend perfectly into your applications. See a detailed features comparison of Telerik RadGridView and Microsoft Data Grid.

Features

  • LINQ-Based Data Engine and Native UI Virtualization

    Telerik Silverlight Grid handles millions of records without affecting the user experience. The grid utilizes horizontal and vertical UI virtualization and introduces container recycling for further improvement of speed and memory footprint, especially when bound to large data sets. The UI virtualization technique ensures that the grid creates only the needed containers (rows/cells) which are shown in the viewport of the grid. The container recycling pushes further the speed of scrolling horizontally and vertically. This feature enables RadGridView to reuse the existing containers over and over for different data items, instead of creating new ones. These techniques combined with our outstanding LINQ-based data engine guarantee the exceptional fast performance of Telerik’s RadGridView.

    The example below demonstrates how thanks to the content recycling, performance is unhurt even when the Grid has 50 million data items in use.

    Get Microsoft Silverlight
    Top
  • Quick Responsiveness

    Additionally, RadGridView's advanced UI virtualization enables exceptional responsiveness even when working with huge data sets.  Scrolling through 1 billion cells is easy, check out this example.
    Top
  • Powerful Databinding

    Databinding with RadGridView is as simple as setting a single property. The binding sources the Silverlight grid supports include:
    • .NET object
    • ADO.NET data services
    Top
  • Support for .NET RIA Services

    Telerik Grid for Silverlight provides support for .NET RIA Services. It now can handle an enormous amount of records server-side in no time. All data operations are executed on the server, which results in speedier sorting, filtering and paging. Telerik Silverlight Grid can be directly bound to a RIA Service through its ItemSource property, or to a Silverlight DomainDataSource control. Either way, no coding is required, as both approaches allow you to declaratively set the RIA Service.

    See an example showing how to bind RadGridView completely codelessy to RIA Services using DomainDataSource
    Top
  • Built-in Paging UI

    It provides you with a navigation interface to page through your data quickly. The pager control itself can be used as a standalone component in order to provide paged data source to other data-bound controls.





    See demo

  • Direct Data Operations

    With Telerik Silverlight Grid data operations (sorting, grouping, filtering) work directly with your data objects. In a common scenario when a Silverlight grid is performing data operations, you need to create your own collection view. With Telerik Silverlight grid there is no requirement for wrapping your data in collection views to do sorting, grouping and filtering.
    Top
  • Asynchronous Databinding

    To provide better user experience Telerik Silverlight Grid allows asynchronous databinding, which means that the application is responsive even while a large dataset is being loaded. A background Thread is used to load the data asynchronously without blocking the main application flow.
    Top
  • Data Source Updates

    To achieve better testability and loose coupling in your code it may be more convenient to manipulate data in the original data source instead of using the RadGridView API.  Telerik Silverlight Grid supports that scenario by listening to data source collection change events and reflecting those changes in its visual representation.
    Top
  • RadCompression Module

    RadCompression is an HttpModule allowing you to compress the entire Web Service traffic in a codeless manner resulting in less traffic and faster page load. RadCompression intercepts the bits that the server is sending back to a browser (or Silverlight-client, for that matter) and compresses them. Once the compressed bits reach the browser, standard browser technology takes-over and decompresses the response so your application can work with it normally. It is extremely useful in shared hosting environments, where the users usually don’t have the ability to enable the integrated compression of IIS.

    Learn how to compress the response from ADO.NET DataServices in Silverlight
    Top
  • Truly Lookless, Blend Skinnable, Completely Customizable Control

    Telerik Silverlight Grid can have its appearance and animations completely customized through Microsoft Expression Blend. You can use your own theme or you can use one of the several themes shipped with the grid control, which will help you deliver a consistent look and feel in your application.

    Top
  • Custom Layout

    You have full control over the way the data is presented in the Silverlight grid through cell customization, row layout customization and column’s cell templates. You can combine the built-in appearance of the grid cells with a custom view you have defined. You can let some of your cells get generated automatically and provide your own styles and templates for the rest. Or you can customize the grid’s column templates and use unbound data columns in RadGridView.
    To break away from the standard tabular view, you can customize the row appearance inside the grid. Designers can unleash their imagination and present the information in a visually appealing way well-suited to your application. 



    Top
  • Formatting

    To give you more control on how the data is displayed Telerik Silverlight Grid allows displaying your data as currency, percentage and any other format that suits your needs. You can use a standard .NET format string applied to your grid cells. You can customize the way the content of the RadGridView cells is arranged and displayed or can completely replace the control template of the grid cells with a custom template. Furthermore you can completely replace the control template of the grid cells with a custom template.
    Pushing further the styling capabilities of the Telerik grid control alternating rows and disabled state features are available. The disable state allows better showing the inactive state for the entire grid as well as a chosen row/cell/column.
     
    Top
  • Grouping and Aggregates

    Data can be grouped according to several criteria effectively creating a tree of groups with the leaf nodes holding the actual data records. Users can group data by dragging a column header and dropping it in the group area above the Silverlight grid. Users can also rearrange the grouping headers in the group area (again by dragging and dropping).
    The grid supports UI virtualization even when grouping, thus saving memory and reducing load time.
    To empower users to get more value from their data  the Silverlight grid provides aggregates display that calculate values taking into account every data item in the group. You can add a variety of aggregate functions, such as Sum, Count, Min, Max, Average, etc, to your data model and see the results they produce in the RadGridView. Of course, in the spirit of Silverlight, aggregate result display is fully customizable. 

     
    Top
  • Totals Row with Aggregate Functions

    Summarizing the data from a column in a single cell is a feature that is widely used in numerous scenarios. Telerik Silverlight Grid control offers a built-in totals row which makes it easy and fast to add a cell which represents the calculated values across a range of data. The summary row with aggregates is available for each column in the whole grid and/or for each individual group. The user can choose to show in the footer row from a variety of aggregate functions such as Sum, Count, Min, Max, Average and etc.

     
    Top
  • Sorting

    You can have Telerik Silverlight Grid automatically sort its columns by setting a single property. There are three sorting modes: ascending, descending and no sort.
    In addition to the simple one-column sorting Telerik grid allows you to sort data by several columns just like in Microsoft Excel. Furthermore, you can define column sorted color for better user experience.
    Top
  • Filtering and Excel-like Filtering

    Telerik Silverlight Grid allows end users to filter data by applying filter patterns or their own filter criteria, hiding the records that do not match the filter thus accessing only the data they need. For each column RadGridView creates a filtering dropdown menu with the expressions applicable for the respective data type.



    You can filter data against single or multiple columns, search as you type or filter in an Excel-like fashion.



    Top
  • Hierarchy

    Telerik Silverlight Grid has an extremely flexible hierarchy model, which allows for meaningful organization of complex data. The grid can automatically detect hierarchical relationship if bound to an ADO.NET DataSet and display the data accordingly.
    The control provides:
    • Table hierarchy – allowing you to define your hierarchy settings when binding to different data tables
    • Property hierarchy - the Silverlight grid hierarchy support also extends to .NET objects and can display them in a hierarchical fashion
    • Custom hierarchy - Telerik Silverlight Grid triggers an event that you can use to implement your own child data access logic. You can use this feature to define your hierarchy even when child data comes from legacy systems, XML files, COM, etc.
    • Self-reference hierarchy – allows you to define a relation that points back to the same table


    Top
  • Built-in Data Validation

    Telerik Silverlight Grid supports metadata-driven validation via data annotations. You can use the grid with the Validation Summary class to implement the automatic validation UI provided by the platform and also benefit from the server-side validation attributes provided by RIA Services. The built-in validation operates on two layers – UI and Data. Furthermore, using the extensible event based API of RadGridView users can plug their own data validation mechanism.


     
    Top
  • Column Types

    The Grid allows you choose from several predefined column types. The supported out-of-the-box columns are: Data, Hyperlink, DynamicHyperlink, Image, Select, ToggleRowDetailsVisibility and MaskedTextBox. They provide a built-in validation support for editing which cover most of the editing scenarios. If there are specific requirements, the built-in columns can be inherited and their editing validation mechanism can be used without any problem. Furthermore RadGridView offers flexible appearance model through the CellEditTemplate property of the column which allows any control to be used as editor.

     
    Top
  • Frozen Columns

    RadGridView allows you to keep part of your data in your Silverlight grid always visible putting the rest of the data in context. To freeze columns, you simply set the FrozenColumnCount property on the Grid to the number of columns you want to freeze.
    Top
  • Row Details

    Telerik Silverlight Grid supports Row Details, which can be used to present additional information related to the row in a visually appealing manner. The Row Details is a very convenient feature when the space at hand is insufficient for the data that needs to be presented.
    Row Details can also be used for providing a more convenient editing environment for end-users. Defined through a data template, Row Details can present virtually anything to the user, be it for viewing-only or editing.

    Top
  • Selecting and Navigating

    Telerik Silverlight Grid provides a familiar selection API that will make Silverlight developers feel at home. The control supports single and multiple record selection that can be manipulated both with the mouse and the keyboard.
    Top
  • Multiple Cells Selection

    This Excel-like feature brings the user experience in RadGrid to another level and is the most important building block for the Copy and Paste functionality.
    Top
  • Copy/Paste in RadGrid and to/from Excel

    Copy/paste from Grid to Excel or from Excel to RadGridView is very useful when the data comes in Excel format and should be easily put in RadGridView.

    Top
  • Localization Support

    Telerik Silverlight Grid provides advanced Localization support.  Two new properties were added, so that  you don’t have to always create an instance of the LocalizationManager:
    • Default Culture property -  you can change localized values without changing the UI culture of the current thread
    • DefaultResourceManager  - you change localized values using a new resource manager, i.e. a new resource file.
    In addition, as RadGridView for Silverlight and WPF share the same API, once a control has been localized for Silverlight, the control's declaration can be reused in WPF.
    Top
  • Export to Word/Excel/CSV

    With RadGridView you can easily export data to Microsoft Excel/Microsoft Word/CSV..
    Top
  • Printing

    RadGridView for Silverlight now supports printing by using PrintToHtml() method.
    Top
  • VS Plug-in for Testing RadControls

    Finally an automated testing tool built for developers. Record cross-browser tests, customize them in code within Visual Studio or convert them to unit tests. What’s more, Test Studio is the best way to test RadControls for Silverlight. The powerful test recorder automatically detects the controls and exposes commonly used verifications. Learn more
    Top
  • WPF/Silverlight Code Compatibility

    The Silverlight Grid shares a common codebase and API with its WPF counterpart. This means that you can achieve close to 100% code reuse for your grid logic if you have parallel Silverlight/WPF development.

    Top
  • Expression Column

    The Expression column in RadGridView calculates and displays information from the business object’s properties. The displayed information can be a result form mathematical or logical operations described as LINQ Expression trees.

Introduction to C and the PIC Microcontroller Real-World Interfacing




In this lab you will be introduced to the programming language C, and the PIC16F873, a popular and very widely used m-controller (read micro-controller). m-controllers find use in devices that needs some intelligence but not a huge amount of processing power (eg, fancy graphical interfaces, massive computing needs). You can find these devices in cars (engine control, anti-lock brakes...), in appliances, etc... There are many ways to program these devices, but you will be using C to program the PIC to perform some fairly simple tasks. C is often used with m-controllers because of its small size, high speed, and the access it allows to the real-world. This week you will get a short introduction to C as well as a brief look at some of the capabilities of the PIC.
A good resource for help with the PIC programmed with the CCS C-compiler is given at http://www.ccsinfo.com/forum/.
The PIC microcontroller comes in a wide range of variants.  You can check them out in data books that are in the lab, or at the MicroChip web site.  A m-controller is distinguished from a m-processor in that it has many capabilities useful for real-world interfacing built into the chip.  The PIC has a RISC-based Harvard architecture with separate memory for data and program.  The one we will be using is the PIC16F873  (link to data sheet)   It has an on-board RAM (Random Access Memory), EPROM (Erasable Programmable Read Only Memory), an oscillator, a couple of timers, and several Input/Output (I/O) pins, serial ports and 8 channel A/D convertor (if you don’t know what all of those things are don’t worry; suffice it to say there can be an impressive array of peripherals built into the chip). However, the m-controller is less computationally capable than most m-processors due to the fact that they are used for simple control applications rather than spreadsheets and elaborate calculations. As an example, the PIC16F873 has 4096 words of memory for program, and only 192 bytes of RAM, and can only operate with clocks up to 20 MHz on 8 bits of data (compared to megabytes of RAM, Speeds of a GHZ or more and 32 or even 64 bits of data for many desktop systems).  It also has no facilities for floating point numbers... A pinout of the PIC16F873 is shown below.
There are several pins that are used to power the device.   Many of the other pins have multiple uses depending on how the device is programmed. 
This week, and the next, you will be using a m-controller in the lab. These laboratories will serve as a brief introduction to the processor and to programming in C.

Getting started with C.

A simple C program
A very simple C program is shown below.
/*simple.c -- sets a pin low, then high*/
#INCLUDE <16F873.h>
#USE DELAY (CLOCK=4000000)
void main() {
 output_low(pin_C1);
 output_high(pin_C1);
}
This program has many common features of C programs. The first line is a comment that is ignored by the compiler.  It is simply there to document what the program code does.  A comment is anything that occurs between a "/*" and the subsequent "*/".  The next line is a "directive".  All directives begin with a "#" and are used to convey information to the compiler.   The directive in this program tells the compiler to include a header file ("16F873.h") which is necessary when using the microcontroller’s input and output capabilities.   The next two directives tell it how to configure the device, and how fast it goes.  The next line tells the compiler that this is the "main" program, and that everything between the opening brace, {, and the matching closing brace, , constitutes the main program. The main program itself is only two lines.   The first  line (not a comment) is a call to the "output_low" function, which sets output pin pin_C1 low, and a call to output_high, which sets it high. . Note that after every program statement there is a semi-colon. This is very important.

Variables
Almost all programs will use variables which are simply units of information stored in the computers memory. The standard C language has a wide variety of variable types available, however the dialect we will be using is more restricted. The version of C that we will be using has a quite unstandard set of variable types that are suited to its architecture.
Type Specifier Size Range
unsigned 8 bit unsigned 0 to 255
unsigned int
int
char
int8
long 16 bit unsigned 0 to 65535
long int
int16
signed 8 bit signed -128 to 127
signed int
signed int8
signed long 16 bit signed -32768
to 32767
signed int8
int32 32 bit unsigned 4*109
signed int32 32 bit signed ±2*109
float 32 bit floating point ±0.5*2-128 to 1-(2-15)*2128
short one bit 0 to 1
short int
int1
The program below shows how variables are used.
#INCLUDE <16F873.h>
#USE DELAY (CLOCK=4000000)
void main() {   char i, j, k; /* declare characters */
    i=2;
    j=3;
    k=i+j;
}
Again we have a fairly simple program that shows many different features of C. Note the semicolon after every program statement. We declare 3 char’s, "i", "j" and "k".   A char is simply an 8 bit variable.  You should use chars whenever possible because the PIC is designed to work on data 8 bits at a time.

Numerical manipulations
C has a variety of built in operations for performing math. These are listed below along with an example where a=0x03, and b=0x11:
  Name of Operand Symbol Example Result a=0x03 b=0x11
Binary Operators (Two Operands)
Addition
+ a+b 0x14
Subtraction
- b-a 0x0E
Multiplication
* a*b 0x33
Division
/ b/a 0x05
Modulus
(remainder)
% b%a 0x02
Bitwise and
& b&a 0x01
Bitwise or
| b|a 0x13
Bitwise xor
^ b^a 0x12
Shift right
>> b>>a 0x02
Shift left
<< b<<a 0x88
Unary Operators (One Operand)
increment
++ ++a 0x04
decrement
-- --a 0x03
negate
- -a -0x03
logical complement
~ ~a 0xFC

Logical Expressions
In addition ot manipulating numbers, C is also capable of handling logical expressions. When using these expressions TRUE is taken to be anything that is not zero, and FALSE is always equal to zero. Again, a=0x03, and b=0x11:
Binary operators (two operands)

Name of Operand
Symbol
Example
Result
a=0x03 b=0x11
Binary Operators Greater than > a>b FALSE
Less than
< a<b TRUE
Equal
== a==b FALSE
Greater than or equal
>= a>=b FALSE
Less than or equal
<= a<=b TRUE
Not equal
!= a!=b TRUE
Logical AND
&& a&&b TRUE
Logical OR
|| a||b TRUE
Unary operators (one operand)
Logical complement
! !a FALSE


Manipulating addresses (somewhat advanced topic, may be skipped)
There are two operators used for manipulating addresses and you have already been briefly introduced to one of them, the indirection operator, *. The other one is the address operator &. If you have an address k, the value stored at that address is *k. If you have a variable j, the address of the variable is given by &j. Therefore it is obvious that *(&j)=j.

I/O (Input/Output) Ports
It is possible with with a PIC to interact with the real world.   This is done thourgh the use of I/O ports.  The PIC16F873 has 3 I/O ports, labeled "a", "b" and "c".  We will use Port A for analog input, though it has other uses. Ports B and C will be used for digital I/O.  On the schematic the pins are labeled RB0 through RB7, but the compiler refers to them as pin_B0 through pin_B7.   Likewise for port C.  The pins can be used for either input or output. 
Your circuit has the pushbutton switch connected to RB0, and the LED's to pins RC0 through RC7.
Digital Output
There are several functions that are used for output from the PIC.   A full listing is in the PCB manual.  Four commonly used functions are:
  • Output_high(pin)
    Sets the specified pin to a logic 1 (about 5 volts).
  • Output_low(pin)
    Sets the specified pin to a logic 0 (about 0 volts)
  • Output_float(pin)
    Sets the specified pin to a high-impedance (or tri-state) state.  In this state it is as if the pin has no connections to the chip.  Current can neither go in or out of the pin.
  • Output_bit(pin, value)
    This function sets the specified pin to the specified value (which must be 0 or 1).
Digital Input
There is only one input function you will need for the PIC.
  • Input(pin)
    Reads the value on a specified pin.  The value is returned in a short int.   A proper use of the function would be something like:

        while( !input(pin_B0)) { ... }

    which would repeat the commands in the braces as long as RB0 was low.
"High level" I/O
If the PIC is connected to the PIC C development software via the debugger it is possible to do some higher level input and output.  These  interactions take place via the debugger's "Monitor" window.
You specify that IO is to take place through the debugger by properly defining serial connections (usually in your codes header file):
#use rs232(DEBUGGER)
You can then print to the monitor window by using "putc()" which sends a character to the monitor window, "puts()" which sends a string, or "printf()" which sends a formatted string.  The "printf()" command is most useful, but also the most complicated (and takes the most memory).
The syntax of printf is the following:
printf(format-string, [arg_1] , ... , [arg_N] )
This is best illustrated by some examples.

Printing Examples

Example 1: Printing a message. The following statement prints a text string to the screen.
printf("Hello, world!\n");
In this example, the format string is simply printed to the screen.
The character \n at the end of the string signifies end-of-line. When an end-of-line character is printed, the LCD screen will be cleared when a subsequent character is printed. Thus, most printf statements are terminated by a \n.
Example 2: Printing a number. The following statement prints the value of the integer variable x with a brief message.
printf("Value is %d\n", x);
The special form %d is used to format the printing of an integer in decimal format.
Example 3: Printing a character. The following statement prints the ascii equivalent of the integer variable x with a brief message.   Here is an ascii table.
printf("Value is %d, ascii = %c\n", x, x);
Example 4: Printing a number in binary. The following statement prints the value of the integer variable x as a binary number.
printf("Value is %b\n", x);
The special form %b is used to format the printing of an integer in binary format. Only the low byte of the number is printed.
Example 5: Printing a floating point number. The following statement prints the value of the floating point variable n as a floating point number.
printf("Value is %f\n", n);
The special form %f is used to format the printing of floating point number.
Example 6: Printing two numbers in hexadecimal format.
printf("A=%x  B=%x\n", a, b);
The form %x formats an integer to print in hexadecimal.

Formatting Command Summary

%d
Type: int Description: decimal number
%x
Type: int Description: hexadecimal number
%b
Type: int Description: low byte as binary number
%c
Type: int Description: low byte as ASCII character
%f
Type: float Description: floating point number
%s
Type: char array Description: char array (string)
Format Command Data Type Description
%d int decimal number
%x int hexadecimal number
%b int low byte as binary number
%c int low byte as ASCII character
%f float floating point number
%s char array char array (string)

Your circuit has the pushbutton switch connected to RB0, and the LED's to pins RC0 through RC7.
Input
Unfortunately, you can only receive input from the keyboard one character at a time using the getc() command.  Be aware:
  • getc() returns the ascii equivalent of the character entered into the keyboard.
  • the keyboard I/O is implemented in software on the PIC.  That means, it won't receive input from the keyboard unless it is explicitly looking for it.  Therefore, your program must stop in order to look for input from the keyboard.  (Hardware communications could receive a character in the background, without requiring software support).
As an example, the following code gets the ascii value in k, converts to a number, and prints the number.
k=getc();                %Get ascii value of keyboard input.
k=k-'0';                 %Subtract value of '0' to convert to number.
printf(" ... k=%d\n",k); %print the number.

Control of Flow
What you have learned up to this point has been useful but is of limited utility because it does not allow for decision making capabilities by the computer. C has a variety of mechanisms to control the flow of a program. These are listed below:
The if...then construct
if (logical expression) {
    ...statements...
}
If the logical expression is true then evaluate the statements between the braces. The following code sets RC1 if a is even.
if ((a%2) == 0) {
   Output_high(pin_C1);
}
The if...then...else construct
if (logical expression) {
   ...if statements...
}
else {
   ...else statements...
}
If the logical expression is true then evaluate the "if" statements between the braces, otherwise execute the "else" statements. The following code decides if a number if is even or odd.
if ((a%2) == 0) {
   Output_high(pin_C1);
}
else {
   Output_low(pin_C1);
}

while (logical expression) {
    ...statements...
}
While the logical expression is true, the statments (of which there is an arbitrary number) between the braces is executed. The following code cycles through the even numbers from 0 to 9 (the variables must have been declared elsewhere in the program).
a=0;
while (a<10) {
    ...statements...
    a=a+2;
} 

The for loop
for (initial condition; logical expression; change loop counter variable) {
    ...statements...
}
Set the initial condition, then while the logical expression is true execute the statement between the braces while changing the loop counter as specified once at the end of each loop. This code segment is functionally equivalent to the one for the "while" loop.
for (a=0; a<10; a=a+2) {
    ...statements...
}

The case...switch construct
Case..switch is used in place of a series of "if...else" clauses when a variable can take on several values.  The "default" clause at the bottom takes care of any cases not covered explicitly.
switch (variable) {
   case val1: ...statements 1...
   break;
   case val2: ...statements 2...
   break;
   case val3: ...statements 3...
   break;
   default: ...statements default...
   break;
}

Functions
Often a series of instruction must be repeated over and over again. Instead of repeating the same operations repetitively it is useful to use a function that performs the repetitive operations. For instance to set a value on RC1 and then read from RB0 and set RC0 to that value, and returning the value of RB0 you might use a function called "RB0toRC0".  (Note: this program isn't meant to be particularly useful, but to introduce the syntax for function declaration, and use).
/*simpleFunc.c -- to demonstrate function calls*/
#INCLUDE <16F873.h>
#USE DELAY (CLOCK=4000000)
short int RB0toRC0(RC1val)
short int RC1val;
{
   Output_bit(pin_C1, RC1val);  /*Set RC1 to the specified value*/
   if (input(pin_B0)) {         /*Read RB0*/      
      Output_high(pin_C0);      /*If RB0 is high, RC0 set high*/
   } 
   else {
      Output_low(pin_C0);       /*else set RC0 low*/
   }
   return(input(pin_B0));       /*Return RB0*/
}
void main() {
   short int b;

   b=RB0toRC0(1);
   b=RB0toRC0(0);
}
This program introduces some new constructs. The most obvious is the function "RB0toRC0" which is at the top. The first line of the function declares that the function returns a short int, and has one argument. The type of the argument is given before the function's opening brace. The body of the function (between the braces) outputs a value to RC1, and reads from RB0 and echos to RC1.  The last line tells that compiler to return the value of RB0 to the calling function.
The function is called in the main program with different arguments.   The first call would set RC1 high, and return the current value of RB0 to the variable "b".  The next line would set RC1 low, and return the value of RB0 to the variable "b".
Wrapping up
You should now know enough to do some fairly simple things with the microcontroller. This has been a very brief introduction to C and did not even begin to touch the richness available with the language. If you would like to know more look in the manuals in the lab, or some of the books in the library.

Other Info
If you want to work with the LCD on the PICDEM2 Plus board, you will find that documentation ranges from poor to nonexistent.  Some working code is here.
Code for the PICDEMlcd board is equally poor/nonexistent/incorrect.  Some working code is here.


Comments or Questions?
Send me email