12864液晶深入学习笔记1—基于msp430g2553

qinkaiabc   2013-5-29 15:23 楼主
这是我对12864的学习笔记,12864液晶功能很全面,使用起来也很方便,能够满足一般的研究和工程应用的需求。
下面我就对几个方面讲述一下我对它学习过程中的一些体会。我会尽量全面的介绍,并且会主要针对一些特殊的应用和一些我认为要特别注意的地方进行较为详细的说明。而对于那些较为固定的,常用的方面会简略一些。
其中的不管串行模式还是并行模式,对液晶的写指令,写数据,读操作等这些基本的操作都是一些比较固定的,基础的东西。我认为只要能够看懂,并且能够在不同的处理器上移植就够了,没有必要非要自己对着手册时序图写出来。因为有人已经写好了,而且工作稳定,我们只要在它的基础上学会应用就可以了。现在是知识爆炸时期,知识,信息迅速膨胀,我们要学会使用已有的成果,然后在这个基础上自己再进行开发应用的研究。我们不必一定要从底层开始把别人已经做的很成熟的东西再做一遍,这样不但效率不高,而且我们一般人的精力也不允许。
好了,不说废话了,下面就开始介绍,当然,那些基础层面的东西我也会介绍的。
下面所涉及到的程序,是针对msp430g2553的,都是我已经调通的,可以直接应用。
一,12864的介绍
1,液晶显示模块是128×64 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312 码简体中文字库(16X16 点阵)、128 个字符(8X16 点阵)及64X256 点阵显示RAMGDRAM)。可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。
2,常用的12864液晶内部都是使用ST7920控制器。
    1),ST7920提供8位元,4位元及串行三种微处理器控制方式,大陆常用的是8位元和串行控制方式。
2),ST7920可以控制显示字母,数字符号,中文字型和自定义的图画。可以用来显示图形,演示动画,绘制曲线等。
3),字符显示RAM (DDRAM)
ST7920的字符显示RAM (DDRAM)最多可以控制16字元*4行,LCD的显示范围为16字元*2行。
这里要注意,其实ST7920DDRAM每一行可以控制16个汉字的,共有4行。但是LCD的每行只能显示8个字符,为了显示观察的方便,在lcd制作的过程中,是将DDRAM的其中两行拆分开成四行,然后在lcd上显示,也即是DDRAM只用到了一半。
lcd的显示字符的坐标地址如下表:
汉字显示坐标
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
从上表不难看出,其中第一行和第三行是DDRAM中的同一行拆分来的,同理2 4 行也是DDRAM中的同一行拆分而来的。
了解了这一点就不难理解下面程序中在换行显示时,要认为手动地指定下一行的地址。例如:如果第一行显示完了,下面的数据我要接着显示在第二行,这样才符合人观察的习惯,那么我就要在换第二行显示之前要手动地把显示地址切换到第二行。要不然的话,第一行显示完了,地址会自动增加,就会显示到第三行上去,这样的话我们观察起来就不自然了。程序实例会在下面涉及到的。
    4),中文字库ROM (CGROM)
内置的是GB2312码简体中文字库,共提供了819216*16点的中文字型。
5),半宽字型ROM (HCGROM)
提供12616*8点半字宽的字母符号字型。
6),图画显示RAM (GDRAM)
提供64*256位元的GDRAM
其中我们常用的RAM就是上面所提到的,还有一些CGRAM IRAM这些我们不经常使用,就不再介绍了。
上面介绍的DDRAM控制显示汉字,字符。GDRAM控制显示图画,上电后,默认DDRAM是打开的,控制液晶显示。GDRAM默认不打开,它里面的数据是随机的,如果此时打开了GDRAM的话,lcd会同时受到DDRAMGDRAM的控制,由于GDRAM中的数据是随机的,所以会显示乱码。所以在使用GDRAM之前要先清除里面的随机数据。
清除GDRAM的函数如下:
void Clear_GDRAM(void)   //清除GDRAM中的的随机数据。因为上电后GDRAM中的数据是随机的,如果不清除而直接打开GDRAM显示时,会显示乱码
                        //所以在局部使用GDRAM显示图形时,要先清除随机数据。如果是全局使用GDRAM,即整个lcd屏全部设置显示数据,则可以
                       //不必清除,因为新数据会把随机数据给覆盖掉
{
    uchar i,j,k;
    wr_lcd(comm,0x34);        //打开扩展指令集   操作GDRAM是扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
wr_lcd(comm,i++);
wr_lcd(comm,0x80);
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,0x00);   //写入空字符,就相当于清零
   }
}
i = 0x80;
  for(j = 0;j < 32;j++)
{
  wr_lcd(comm,i++);
  wr_lcd(dat,0x88);
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,0x00);
    }
}
  wr_lcd(comm,0x30);        //回到基本指令集
}
   312864有两种工作模式
   1),并行模式和串行模式。并行模式就是常用的8位数据线,4为控制线。这种方式虽然占用的IO口较多,但是向液晶收发数据较容易实现,数据传输速度较快。所以在一些连续显示多幅图画,演示动画或对显示的实时性要求较高的场合应该考虑这种方式。其中在并行模式中,在向液晶写数据或命令前,要进行液晶忙标志判断 BF,要确定液晶显示不忙了,才能进行操作。
其中并行模式的液晶的读写数据,命令函数如下:
void Write_Cmd(uchar cmd)
{
    uchar lcdtemp = 0;
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;    //数据输入单片机
    do                       //判忙
    {
        LCD_EN_H;
        _NOP();
        lcdtemp = LCD2MCU_Data;
        LCD_EN_L;
    }
    while(lcdtemp & 0x80);  //判断忙标志   等待忙
    LCD_DataOut;   //数据输出到lcd
    LCD_RW_L;
    MCU2LCD_Data = cmd;   //单片机向lcd输入命令
    LCD_EN_H;
    _NOP();
    LCD_EN_L;
}
void  Write_Data(uchar dat)
{
    uchar lcdtemp = 0;
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;
    do                       //判忙
    {
        LCD_EN_H;
        _NOP();
        lcdtemp = LCD2MCU_Data;
        LCD_EN_L;
    }
    while(lcdtemp & 0x80);     //等待忙
    LCD_DataOut;
    LCD_RS_H;
    LCD_RW_L;
    MCU2LCD_Data = dat;   //单片机向lcd中输入数据
    LCD_EN_H;
    _NOP();
    LCD_EN_L;
}
   2),串行模式只用到了两根线WR  EN于单片机进行通信。这种方式可以大大减少单片机IO口的开销,适用于IO口资源有限的单片机(如msp430g2553)。但是这种方式实现起来较麻烦,数据的传输效率不高。对于一般的文字,简单图形的显示还是可以的。(有可能是因为msp430g2553的处理能力较强,我现在用串行连接方式,显示下面的几幅图画,显示效果很好,看不出有什么数据传输速度慢的问题)。
由于我用的是msp430g2553,所以我一直都是使用串行的控制模式。
//下面重点讲一下串行的时序
//SCLK:串行同步时钟线,每操作一位数据都要有一个SCLK跳变沿,而且在这里是上升沿有效。也即是说,每次SCLK由低电平变为高电平的瞬间,液晶控
//制器将SID上的数据读入或输出。
//SID:串行数据,每一次操作都由三个字节数据组成,第一个字节向控制器发送命令控制字,告诉控制器接下来是什么操作,若为写指令则发送11111000
//(0xf8),若为若为写数据则发送11111010(0xfa),若为读状态则发送11111100(0xfc),若为读数据则发送11111110(0xfe)
//第二个字节的高4位为发送指令或数据的高4位,第二个字节的低4位补0.
//第三个字节的高4位为发送指令或数据的低4位,第三个字节的低4位补0
//具体的可以观察时序进行理解

其中数据的传输的函数如下:
//12864串行连接写数据,写命令函数    按照手册上的时序进行编程
void wr_lcd(uchar dat_comm,uchar content)//
{   //              要写的数据
  uchar a,i,j;
      delay_us(50);
  a=content;
       LCD_SCLK0; //en=0;
       LCD_SID1;  //wr=1
  for(i=0;i<5;i++) //数据时序*****************8  前5个高电平的同步码
  {
  LCD_SCLK1;
  LCD_SCLK0;
  }
  LCD_SID0;       //wr=0  写操作
  LCD_SCLK1;      //en=1  来一个时钟
  LCD_SCLK0;      //en=0
  if(dat_comm)
   LCD_SID1;  //RS=1  写数据
  else
   LCD_SID0;   //RS=0  写指令

  LCD_SCLK1; //来一个时钟
  LCD_SCLK0;
  LCD_SID0;  //控制字的最后一位为0
  LCD_SCLK1;  //来一个时钟
  LCD_SCLK0;
   for(j=0;j<2;j++)//************一共2*4次循环写写一字节数据,第一次大循环写高4位,第二次大循环写低4位
  {
    for(i=0;i<4;i++)
    {
      if(a&0x80)
           LCD_SID1;
        else
           LCD_SID0;
      a=a<<1;
      LCD_SCLK1;
      LCD_SCLK0;
    }
      LCD_SID0;
   for(i=0;i<4;i++)  //时钟下面来4个时钟脉冲
    {
       LCD_SCLK1;
       LCD_SCLK0;
    }
  }
}
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
    uchar j;
    uchar k=0;
   // wr_lcd(comm,0x01);  //清屏,只能清除DDRAM
    wr_lcd(comm,0x34);  //使用扩展指令集,关闭绘图显示   打开扩展指令集
    for(j=0;j<16;j++)
    {
     wr_lcd(comm,Yaddr++);       //Y地址
     wr_lcd(comm,Xaddr);    //X地址
     wr_lcd(dat,dp[k++]);     //写入数据
     wr_lcd(dat,dp[k++]);
    }
    wr_lcd(comm,0x36);  //打开绘图显示
  //  wr_lcd(comm,0x30);  //回到基本指令集模式
}
5,向液晶全屏写图像的函数如下:
void Draw_PM(const uchar *ptr)    //整屏显示图形
{
    uchar i,j,k;
    wr_lcd(comm,0x34);        //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
wr_lcd(comm,i++);
wr_lcd(comm,0x80);
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,*ptr++);      //先写入32*16个数据
   }
}
i = 0x80;
  for(j = 0;j < 32;j++)
{
  wr_lcd(comm,i++);
  wr_lcd(comm,0x88);
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,*ptr++);      //再写入32*16个数据
    }
}
  wr_lcd(comm,0x36);        //打开绘图显示
  wr_lcd(comm,0x30);        //回到基本指令集
}
6,下面我就贴上一个对液晶功能测试的函数,其中用到了液晶的很多功能,可以有实现现象观察得到,注释的也较详细,代码如下:
#include  "msp430g2553.h"
#include  "ser_12864.h"
void main( void )
{
    uint i;
    uchar laba[]=     //16*16大小图形数据
    { 0x00,0x00,0x00,0xC0,0x01,0x48,0x02,0x44,0x04,0x52,0xF8,0x49,0x88,0x49,0x88,0x49,
      0x88,0x49,0x88,0x49,0xF8,0x49,0x04,0x52,0x02,0x44,0x01,0x48,0x00,0xC0,0x00,0x00};
    WDTCTL = WDTPW + WDTHOLD;    //关狗
    BCSCTL1 = CALBC1_12MHZ;  //设定cpu时钟DCO频率为12MHz
    DCOCTL = CALDCO_12MHZ;
    P2DIR |=BIT5+BIT4;      //液晶的两条线
    init_lcd();                 //初始化液晶
    //下面是显示液晶字符表中的字符
    wr_lcd(comm,0x80);            //写第一行的显示地址    写命令0x80
    for(i = 0; i < 16; i++)        //每一行可以显示16个字符
     wr_lcd(dat,0x00 + i);     //显示0x00~0x0f对应的字符  写数据
    wr_lcd(comm,0x90);            //写第二行的显示地址    因为128641 3行和2 4行分别由控制器ST7920的两行切割来的,为了看起来方便
    //这里要手动把地址切换到第二行。要不然的话,显示完了第一行,液晶会自动切换显示到第三行上去
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x10 + i);     //显示0x10~0x1f对应的字符
    wr_lcd(comm,0x88);            //写第三行的显示地址
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x20 + i);     //显示0x20~0x2f对应的字符
    wr_lcd(comm,0x98);            //写第四行的显示地址
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x30 + i);     //显示0x30~0x3f对应的字符
//     delay_ms(1000);   //延迟1s,观察效果
//调试时,可以在此处设置断点,单步执行下面的指令,观察结果
    //在显示时DDAMGDRAM是同时显示的,也就是它们的显示结果是叠加在一起的
   
    //1.设定DDRAM地址命令
     wr_lcd(comm,0x90);            //设定DDRAM地址,因为此时DDRAM地址已经溢出
    //2.显示状态命令
     wr_lcd(comm,0x08);            //整体显示关,游标关,游标位置关
     wr_lcd(comm,0x0c);            //整体显示开,游标关,游标位置关
     wr_lcd(comm,0x0e);            //整体显示开,游标开,游标位置关
     wr_lcd(comm,0x0f);            //整体显示开,游标开,游标位置开  游标闪烁
    //3.位址归位
     wr_lcd(comm,0x02);            //位址归位,游标回到原点
     wr_lcd(comm,0x84);            //DDRAM地址设为0x88,游标在此闪烁
    //4.点设定指令
    //(以下四个命令是控制写入字符以后光标及整屏显示的移动)
     wr_lcd(comm,0x07);            //光标右移整体显示左移
     wr_lcd(comm,0x20);           //写入两个空格
     wr_lcd(dat,0x20);
    wr_lcd(comm,0x05);            //光标左移整体显示右移
    wr_lcd(dat,0x20);           //写入两个空格
    wr_lcd(dat,0x20);
    wr_lcd(comm,0x06);            //光标右移整体显示不移动
    wr_lcd(dat,0x20);           //写入两个空格
    wr_lcd(dat,0x20);
    wr_lcd(comm,0x04);            //光标左移整体显示不移动
    wr_lcd(dat,0x20);           //写入两个空格
    wr_lcd(dat,0x20);
    //5.游标和显示移位控制
    //(以下四个命令无需写入显示数据,直接控制光标和整屏显示的移动,上面执行的命令是写入空格实现光标移动和整屏的移动)
    wr_lcd(comm,0x10);            //光标左移
    wr_lcd(comm,0x14);            //光标右移
    wr_lcd(comm,0x18);            //整体显示左移,光标跟随
    wr_lcd(comm,0x1c);            //整体显示右移,光标跟随
    wr_lcd(comm,0x0c);            //关闭光标
    //6.进入扩展功能模式命令
    wr_lcd(comm,0x34);            //打开扩展功能模式,绘图显示关闭
    //7.反白命令
    wr_lcd(comm,0x04);            //同时反白13
    wr_lcd(comm,0x04);            //再次反白13行,相当于关闭13行反白
    wr_lcd(comm,0x05);            //同时反白24
    wr_lcd(comm,0x05);            //再次反白24行,相当于关闭24行反白
    //8.睡眠模式命令
    wr_lcd(comm,0x08);            //进入睡眠模式  液晶的控制器ST7920关闭,降低功耗。但是背光还是亮的
    wr_lcd(comm,0x0c);            //退出睡眠模式   继续显示
    //9.待命模式命令
    wr_lcd(comm,0x01);            //进入待命模式  也是不显示内容的,液晶已经准备好接受数据或命令了
    //10.打开GDRAM显示                        //这样打开GDRAM显示,液晶的GDRAMDDRAM会同时控制液晶的显示
    wr_lcd(comm,0x36);            //打开扩展功能模式,打开绘图显示  由于上电后GDRAM中的数据是随机的,所以如果在显示之前不清除的话,会显示乱码
    Draw_TX(0x80,0x84,laba);    //显示16*16大小图形  显示上面定义的图像,是一个小喇叭
    Clear_GDRAM();              //清除上电复位后GDRAM中的随机数值,此时GDRAM显示空字符,但是DDRAM中还是有数据,所以此时会显示DDRAM中的数据
    Draw_TX(0x80,0x84,laba);    //重新显示设置16*16大小图形
   //11.关闭GDRAM显示
    wr_lcd(comm,0x34);            //打开扩展功能模式,关闭绘图显示   显示DDRAM中的数据
    //12.设定基本指令集
    wr_lcd(comm,0x30);              //回到基本指令集
    //13.清除显示命令
    wr_lcd(comm,0x01);            //清屏  只能清除DDRAM  此时液晶就什么都不显示了
     //下面是显示液晶字符表中的字符
     wr_lcd(comm,0x80);            //写第一行的显示地址
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x40 + i);     //显示0x40~0x4f对应的字符
    wr_lcd(comm,0x90);            //写第二行的显示地址
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x50 + i);     //显示0x50~0x5f对应的字符
    wr_lcd(comm,0x88);            //写第三行的显示地址
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x60 + i);     //显示0x60~0x6f对应的字符
    wr_lcd(comm,0x98);            //写第二行的显示地址
    for(i = 0; i < 16; i++)
     wr_lcd(dat,0x70 + i);     //显示0x70~0x7f对应的字符
    LPM4;
}

回复评论 (16)

2推荐 hlwhlw 

写得很详细的,不错,顶一顶。。。。。。。。。。。。。
点赞  2014-10-29 11:35
lz V5了
点赞  2013-6-3 18:30

回复 楼主 qinkaiabc 的帖子

雪中送碳,这几天正忙着这个msp430g2553和12864做个东西呢,,,
点赞  2013-6-3 18:39
学习了,正在找这个呢!
点赞  2014-6-5 10:19
楼主,我用launchpad点亮lcd 一开始用5v 的 ,后来改成3.3v的lcd,程序上没error,就是没显示,还有V0口接VCC,或GND都没变化,下面是我的程序,麻烦你了


#include "msp430g2553.h"

#define uchar unsigned char
#define uint unsigned int


/****************************************************************
**12864         DB0~DB7       RS    R/W     E      BSP    RST
**
**Laundchpad    P1.0~P1.7     P2.3  P2.4    P2.5   P2.0  P2.1
**
**:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
****************************************************************/



#define LCM_RS_1 P2OUT|=BIT3//寄存器选择输入
#define LCM_RS_0 P2OUT&=~BIT3
#define LCM_RW_1 P2OUT|=BIT4//液晶读/写控制
#define LCM_RW_0 P2OUT&=~BIT4
#define LCM_E_1 P2OUT|=BIT5//液晶使能控制
#define LCM_E_0 P2OUT&=~BIT5




#define LCM_Data P1OUT




void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,uint BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char  *DData);
void Delay5Ms(void);
void Delay400Ms(void);

unsigned char  uctech[] = {"uctech"};
unsigned char  net[] = {"uctech.icpcn.com"};
uint Busy;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;//停止看门狗   
  BCSCTL1 = CALBC1_8MHZ;//MCLK为DCO,8MHZ  
  DCOCTL = CALDCO_8MHZ;
  P1DIR=0xff; // 初始化IO
  P1OUT=0xff;
  P2DIR=0xff;
  P2OUT=0xff;

  
  Delay400Ms(); //启动等待,等LCM讲入工作状态
  LCMInit(); //LCM初始化
  Delay5Ms(); //延时片刻(可不要)

  DisplayListChar(0, 5, uctech);
  DisplayListChar(0, 0, net);
  ReadDataLCM();//测试用句无意义
  while(1);
}







//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS_1;
LCM_RW_0;
LCM_E_0; //若晶振速度太高可以在这后加小的延时
LCM_E_0; //延时
LCM_E_1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,uint BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS_0;
LCM_RW_0;
LCM_E_0;
LCM_E_0;
LCM_E_1;
}

//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS_1;
LCM_RW_1;
LCM_E_0;
LCM_E_0;
LCM_E_1;
return(LCM_Data);
}

//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS_0;
LCM_RW_1;
LCM_E_0;
LCM_E_0;
LCM_E_1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}

void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
{
unsigned char ListLength;

  ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
  {
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
  }
}

//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
  TempCycB=7269;
  while(TempCycB--);
}
}


























点赞  2014-6-7 08:58
楼主真厉害,新手受教了
点赞  2014-7-17 11:02
学习了
点赞  2014-7-17 11:30
MARK,收藏等屏幕到手试试
点赞  2014-7-21 10:40
学习下
点赞  2014-7-23 18:53
本文的前面几段不错 学习到了 谢谢
点赞  2014-10-24 16:48
引用: yliu098 发表于 2014-6-5 10:19
学习了,正在找这个呢!

是啊,我也是
点赞  2015-8-3 15:01
~~~大神看过来!~~~~~请问大神:OLED的12864和LCD的12864在使用时是一样的吗??
点赞  2015-8-4 10:36
虽然作为大白还需要长时间琢磨一下,但谢谢大神这么无私啦!
点赞  2016-5-29 16:55
大神,我是新手,我想问问这个
在扩展板上利用 LED1至LED8 八个LED灯实现流水灯和呼吸灯功能。
1、八个LED灯能以不同方式实现流水灯:LED1至LED8每隔N个依次亮灭,并循环,N=0,1,2,3;
2、八个LED灯在实现流水灯的同时,实现呼吸灯功能:LED1至LED8每隔N个依次亮灭,并循环,N=0,1,2,3;同时每个灯的亮度是渐变的(先渐亮再渐灭)。
3、在实现2中功能的时候,用电容触摸按键来控制呼吸频率,做到左快右慢。
4、在液晶屏上显示LED流水呼吸灯的相关信息。
点赞  2016-6-11 11:20
謝謝了!
点赞  2017-3-26 18:24
好。
点赞  2017-3-26 18:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复