用开源硬件netduino将数据显示在lcd吧

在netduino.com的论坛里看到很多人提出lcd的显示问题,因为没测试过,所以不知道情况如何,一直想试试。这几天因为我们需要将我们做的即插即用的网络技术展现出来,如果显示不了不就失去了很多特点了吗?加上手头上有成都智能盒子做的lcd12864的lcd,选择他们的lcd的原因很简单,好看,好用这就够了。以下是在成都智能盒子的淘宝上看到的lcd12864的简介:

Openjumpr 12864 LCD模块

一、概述:

mini12864 LCD模块是一款基于12864液晶显示器开发的显示模块。这款模块SPI为接口的显示模块,配合12864LCD库文件,便可轻松显示汉字,字符和图形。并有背光LED控制,可使显示效果更美观。

二、模块参数:

外形尺寸 (长×宽×高):47mm×38mm×6mm(不含插针)

LCD视域(长×宽):33.7mm×33.5mm

LCD有效显示区域(长×宽):30.7mm×23mm

背光模式:白色LED支架背光

工作电压:3.3V ~ 5.5V(内置升压电路,无需高压)

控制IC :UC1701

点阵格式:128列×64行

显示效果:白底蓝字

三、模块特点:

1、结构轻、薄、带背光

2、IC采用UC1701,功能强大,稳定性好

3、功耗低:
LCD工作电流:0.2mA(背光LED关闭状态)
背光LED工作电流:≤4.5mA
总功耗:≤23.5mW(5V)、≤15.5mW(3.3V)

4、显示内容:
可显示128列×64行点阵单色图片
可显示16×16点阵和12×12点阵汉字及图片
可显示8字/行×4行(16×16点阵汉字)
可显示16字/行×8行(8×8点阵的英文、数字、符号)

5、接口简单方便:采用3线SPI串行接口以及一条命令/数据控制线,最多只需5个端口(3线SPI接口加命令/数据控制线,再加上复位信号线)

6、模块上分别设计有上下位置引脚引出,上部已焊接有2.54mm间距插针,下部预留有焊盘,方便进行模块化连接。

四、引脚定义:

 

标示符号 名 称 功  能
R RESET 低电平复位,复位完成后,回到高电平,液晶模块开始工作。如果不需软件给芯片复位,可不连接
A A0 数据和命令选择。L:命令 H:数据
CS CS SPI 片选(内部已拉高),低有效
C SCK 串行时钟
D MOSISID 数据传输
GND 电源地
VCC DC 3.3V5.5V
L LED 背光LED使能,低有效

 (注明:该模块有手册;需要进一步了解的可联系客服接收PDF文档)

更多资料请参见OpenJumper资料库:http://x.openjumper.com/

 

在openjumper的资料库里我并没有找到netduino版本的驱动,咋办??当然是自己写咯,先偷懒,让俺的学生去写,俺的学生经过一番查看,告诉我,不好写,不得不逼我这个老家伙动手,好吧,我写。经过半天的努力,俺写好了,并交付给学生调试,再做了一下修改,俺改好了,现在先附上驱动代码:

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;


    public class Lcd12864
    {

        Microsoft.SPOT.Hardware.OutputPort LAO;
        Microsoft.SPOT.Hardware.OutputPort LCS;
        Microsoft.SPOT.Hardware.OutputPort LSCK;
        Microsoft.SPOT.Hardware.OutputPort LSID;
        Microsoft.SPOT.Hardware.OutputPort LRST;
        Microsoft.SPOT.Hardware.SPI spi;
        public Lcd12864()
        {
            LAO = new Microsoft.SPOT.Hardware.OutputPort(SecretLabs.NETMF.Hardware.Netduino.Pins.GPIO_PIN_D10, false);
            LCS = new Microsoft.SPOT.Hardware.OutputPort(SecretLabs.NETMF.Hardware.Netduino.Pins.GPIO_PIN_D8, false);
            LSCK = new Microsoft.SPOT.Hardware.OutputPort(SecretLabs.NETMF.Hardware.Netduino.Pins.GPIO_PIN_D13, false);
            LSID = new Microsoft.SPOT.Hardware.OutputPort(SecretLabs.NETMF.Hardware.Netduino.Pins.GPIO_PIN_D11, false);
            LRST = new Microsoft.SPOT.Hardware.OutputPort(SecretLabs.NETMF.Hardware.Netduino.Pins.GPIO_PIN_D9, false);

            LCS.Write(false);
            LRST.Write(false);
            System.Threading.Thread.Sleep(200);
            LRST.Write(true);
            System.Threading.Thread.Sleep(1000);

            write_cmd(Convert.ToChar(0xe2));//system reset
            System.Threading.Thread.Sleep(200);

            write_cmd(Convert.ToChar(0x24));//SET VLCD RESISTOR RATIO
            write_cmd(Convert.ToChar(0xa2));//BR=1/9
            write_cmd(Convert.ToChar(0xa0));//set seg direction
            write_cmd(Convert.ToChar(0xc8));//set com direction
            write_cmd(Convert.ToChar(0x2f));//set power control
            write_cmd(Convert.ToChar(0x40));//set scroll line
            write_cmd(Convert.ToChar(0x81));//SET ELECTRONIC VOLUME
            write_cmd(Convert.ToChar(0x20));//set pm: 通过改变这里的数值来改变电压 
            //write_cmd(0xa6);//set inverse display	   a6 off, a7 on
            //write_cmd(0xa4);//set all pixel on
            write_cmd(Convert.ToChar(0xaf));//set display enable
            LcmClear();
        }
        public void SendByte(byte Dbyte)
        {
            byte a,TEMP;
            TEMP = Dbyte;
            for(int i=0;i<8;i++)
            {
                LSCK.Write(false);
                //digitalWrite(LSCK,LOW);
                TEMP = (byte)((Int32)(Dbyte << i) & 0X80);
                LSID.Write((TEMP=='\0'?false:true));
                LSCK.Write(true);
                //digitalWrite(LSID,TEMP);
                //digitalWrite(LSCK,HIGH);
            }
        }
        public void write_cmd(char Cbyte)
        {
            LCS.Write(false);
            LAO.Write(false);
            SendByte((byte)Cbyte);
        }
        /***************
        * 写数据
         ******************/
        public void write_data(byte Dbyte)
        {
            LCS.Write(false);
            LAO.Write(true);
            SendByte(Dbyte);
        }
        void LcmClear()
        {
            short x, y;
            for (y = 0; y < 8; y++)
                write_cmd(Convert.ToChar((ushort)(0xb0 + y)));
            write_cmd(Convert.ToChar(0x10));
            write_cmd(Convert.ToChar(0x00));
            for (x = 0; x < 132; x++) write_data(0x0);
        }
        /*************************
 * 8*8字符,取模顺序是列行式,
 * 从上到下,高位在前,从左到右;
 * 先选择页地址0-7,再选择列0-130
 * 页码是直接读取8位数据作为地址;
 * 列是先读取高四位,后读取低四位;
 **********************/
        void PUTchar8x8(char row, char col, char count, byte[] put)
        {
            int X = 0;
            int i = 0, j = 0;
            write_cmd((char)(0xb0 + row));
            write_cmd((char)(0x10 + (8 * col / 16)));
            write_cmd((char)(0x00 + (8 * col % 16)));
            for (j = 0; j < count; j++)
                for (i = 0; i < 8; i++) write_data(put[X++]);

        }
        /*****************
         * 8*16字符,取模顺序是列行式,
         * 从上到下,高位在前,从左到右;
         * 先选择页地址0-7,再选择列0-127
         * 页码是直接读取8位数据作为地址;
         * 列是先读取高四位,后读取低四位;
         **********************/
        void PUTchar8x16(char row, char col, char count, byte[] put)
        {
            int X = 0;
            int i = 0, j = 0;
            write_cmd((char)(0xb0 + row));
            write_cmd((char)(0x10 + (8 * col / 16)));
            write_cmd((char)(0x00 + (8 * col % 16)));
            for (j = 0; j < count; j++)
            {
                for (i = 0; i < 8; i++) write_data(put[X++]);
                write_cmd((char)(0xb1 + row));
                write_cmd((char)(0x10 + (8 * col / 16)));
                write_cmd((char)(0x00 + (8 * col % 16)));
                for (i = 0; i < 8; i++) write_data(put[X++]);
                write_cmd((char)(0xb0 + row));
                col = (char)(col + 1);
            }

        }
        /*****************
         * 16*16字符,取模顺序是列行式,
         * 从上到下,高位在前,从左到右;
         * 先选择页地址0-7,再选择列0-127
         * 页码是直接读取8位数据作为地址;
         * 列是先读取高四位,后读取低四位;
         **********************/
        void PUTchar16x16(char row, char col, char count, byte[] put)
        {
            int X = 0;
            int i = 0, j = 0;
            write_cmd((char)(0xb0 + row));
            write_cmd((char)(0x10 + (8 * col / 16)));
            write_cmd((char)(0x00 + (8 * col % 16)));
            for (j = 0; j < count; j++)
            {
                for (i = 0; i < 16; i++) write_data(put[X++]);
                write_cmd((char)(0xb1 + row));
                write_cmd((char)(0x10 + (8 * col / 16)));
                write_cmd((char)(0x00 + (8 * col % 16)));
                for (i = 0; i < 16; i++) write_data(put[X++]);
                write_cmd((char)(0xb0 + row));
                col = (char)(col + 2);
            }

        }
        /*****************
         * 24*24字符,取模顺序是列行式,
         * 从上到下,高位在前,从左到右;
         * 先选择页地址0-7,再选择列0-127
         * 页码是直接读取8位数据作为地址;
         * 列是先读取高四位,后读取低四位;
         **********************/
        public void PUTchar24x24(char row, char col, char count, byte[] put)
        {
            int X = 0;
            int i = 0, j = 0;
            write_cmd((char)(0xb0 + row));
            write_cmd((char)(0x10 + (8 * col / 16)));
            write_cmd((char)(0x00 + (8 * col % 16)));
            for (j = 0; j < count; j++)
            {
                for (i = 0; i < 24; i++) write_data(put[X++]);
                write_cmd((char)(0xb1 + row));
                write_cmd((char)(0x10 + (8 * col / 16)));
                write_cmd((char)(0x00 + (8 * col % 16)));
                for (i = 0; i < 24; i++) write_data(put[X++]);
                write_cmd((char)(0xb2 + row));
                write_cmd((char)(0x10 + (8 * col / 16)));
                write_cmd((char)(0x00 + (8 * col % 16)));
                for (i = 0; i < 24; i++) write_data(put[X++]);
                write_cmd((char)(0xb0 + row));
                col = (char)(col + 3);
            }
        }
        /*****************
         * 图片;取模顺序是列行式,
         * 从上到下,低在前,从左到右;
         * 先选择页地址0-7,再选择列0-127
         * 页码是直接读取8位数据作为地址;
         * 列是先读取高四位,后读取低四位;
         **********************/
        public void PUTBMP(byte[] put)
        {
            int X = 0;
            int i = 0, j = 0;
            for (j = 0; j < 8; j++)
            {
                write_cmd((char)(0xb0 + j));
                write_cmd((char)(0x10));
                write_cmd((char)(0x00));
                for (i = 0; i < 128; i++) write_data(put[X++]);
            }

        }
        /*****************
         * 图片反显;取模顺序是列行式,
         * 从上到下,位在前,从左到右;
         * 先选择页地址0-7,再选择列0-127
         * 页码是直接读取8位数据作为地址;
         * 列是先读取高四位,后读取低四位;
         **********************/
        public void PUTREVERSEBMP(byte[] put)
        {
            int X = 0;
            int i = 0, j = 0;
            for (j = 0; j < 8; j++)
            {
                write_cmd((char)(0xb0 + j));
                write_cmd((char)(0x10));
                write_cmd((char)(0x00));
                for (i = 0; i < 128; i++) write_data(put[X++]);
            }

        }
    }

以上是openjumper版本的lcd12864的驱动,有兴趣的话可以自行进行扩展,下面附上的是调用的例子

public class Program
    {
       static byte[] bmp001= {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x00,0xE0,0x00,0xE0,0x20,0x00,0x20,0xE0,
0x00,0xE0,0x00,0xE0,0x20,0x00,0x20,0xE0,0x00,0xE0,0x00,0xE0,0x20,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0xA0,0xA0,0xC0,0x00,0x00,0x20,0x20,
0xE0,0x40,0x20,0x20,0x60,0x00,0x00,0xC0,0x20,0x20,0x20,0x24,0xFC,0x00,0x20,0xE0,
0x00,0x00,0x00,0x20,0xE0,0x00,0x00,0x20,0x2C,0xEC,0x00,0x00,0x00,0x00,0x20,0xE0,
0x40,0x20,0x20,0x20,0xC0,0x00,0x00,0x80,0x40,0x20,0x20,0x40,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x40,0x00,0x20,0xE0,
0x40,0x20,0x20,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x01,0x0E,0x01,0x00,0x00,0x00,0x01,
0x0E,0x01,0x0E,0x01,0x00,0x00,0x00,0x01,0x0E,0x01,0x0E,0x01,0x00,0x00,0x00,0x0C,
0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x09,0x08,0x08,0x0F,0x08,0x00,0x08,0x08,
0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x07,0x08,0x08,0x08,0x04,0x0F,0x08,0x00,0x07,
0x08,0x08,0x08,0x04,0x0F,0x08,0x00,0x08,0x08,0x0F,0x08,0x08,0x00,0x00,0x08,0x0F,
0x08,0x00,0x00,0x08,0x0F,0x08,0x00,0x03,0x04,0x08,0x08,0x04,0x03,0x00,0x00,0x0C,
0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x08,0x08,0x08,0x04,0x00,0x08,0x0F,
0x08,0x00,0x00,0x08,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
        public static void Main()
        {
            Lcd12864 x=new Lcd12864();
            while (1==1)
            {
                x.PUTBMP(bmp001); //液晶点阵正向显示1 秒
                System.Threading.Thread.Sleep(1000);
                x.PUTREVERSEBMP(bmp001); //反向显示1 秒
                System.Threading.Thread.Sleep(1000);
            }
        }
    }


如果你调用没有问题的话,接线没有错误的话,你将看到在屏幕的上面显示出www.arduino.cn,有没有www我忘记了,大概是这个意思,因为现在是在家里写博客,没有相关测试环境。netduino版本nfc读写器驱动和彩色液晶屏的驱动还在准备和测试中,做好了一并奉上。

lcd的淘宝地址是:

http://item.taobao.com/item.htm?spm=a230r.1.0.0.Z7vxT5&id=19563684137

netduino的淘宝地址是:

http://item.taobao.com/item.htm?spm=686.1000925.1000774.23.RwMzRt&id=21448079990

同时netduino的qq群欢迎大家加入群号是:331212289

你可能感兴趣的:(C#,LCD,开源硬件,Netduino)