查看: 2995|回复: 0

[原创] 我为LPC代言] 实验二 LPC824驱动黑白LCD显示

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-12-18 20:24:41 | 显示全部楼层 |阅读模式
    本帖最后由 zhjb1 于 2016-12-18 20:33 编辑

    实验二 LPC824驱动黑白LCD显示
    因为是采用MBED工程,因此直接照搬KL25的LCD实验,连接好后就直接出结果了。只是改了里面定义的4根信号线的管脚号——在PinNames.h文档中。
    为了不破坏源文档,我们将定义和初始化LCD的代码单独设立一个文件,并且在工程文件夹下建立一个新文件夹inc,将12864.h文档拷贝到里面。12864.h:

    DigitalOut dat(P0_26);
    DigitalOut clk(P0_25);
    DigitalOut reg(P0_24);
    DigitalOut res(P0_4);

    //6903 102X64LCD
    const unsigned char asc2[][6]={//8x6 Dots 32-126[0-94]
    {0x00,0x3E,0x45,0x49,0x51,0x3E},//0
    {0x00,0x00,0x21,0x7F,0x01,0x00},//1
    {0x00,0x31,0x43,0x45,0x49,0x31},//2
    {0x00,0x22,0x49,0x49,0x49,0x36},//3
    {0x00,0x04,0x0C,0x14,0x7F,0x04},//4
    {0x00,0x72,0x51,0x51,0x51,0x4E},//5-5
    {0x00,0x3E,0x49,0x49,0x49,0x06},//6
    {0x00,0x40,0x43,0x4C,0x50,0x60},//7
    {0x00,0x36,0x49,0x49,0x49,0x36},//8
    {0x00,0x30,0x48,0x48,0x48,0x3F},//9
    {0x00,0x1F,0x24,0x64,0x24,0x1F},//A-10
    {0x00,0x41,0x7F,0x49,0x49,0x36},//B
    {0x00,0x3E,0x41,0x41,0x41,0x22},//C
    {0x00,0x41,0x7F,0x41,0x41,0x3E},//D
    {0x00,0x41,0x7F,0x49,0x49,0x63},//E
    {0x00,0x41,0x7F,0x49,0x5C,0x60},//F-15
    {0x00,0x3E,0x41,0x45,0x47,0x24},//G
    {0x41,0x7F,0x08,0x08,0x08,0x7F},//H
    {0x00,0x00,0x41,0x7F,0x41,0x00},//I
    {0x00,0x42,0x41,0x7F,0x40,0x40},//J
    {0x00,0x41,0x7F,0x59,0x24,0x43},//K-20
    {0x00,0x40,0x7F,0x41,0x01,0x03},//L
    {0x00,0x7F,0x20,0x1E,0x20,0x7F},//M
    {0x00,0x7F,0x30,0x18,0x06,0x7F},//N
    {0x00,0x3E,0x41,0x41,0x41,0x3E},//O
    {0x00,0x41,0x7F,0x49,0x48,0x30},//P-25
    {0x00,0x3E,0x41,0x47,0x42,0x3D},//Q
    {0x00,0x41,0x7F,0x49,0x4C,0x33},//R
    {0x00,0x32,0x49,0x49,0x49,0x26},//S
    {0x00,0x60,0x41,0x7F,0x41,0x60},//T
    {0x00,0x7E,0x01,0x01,0x01,0x7E},//U-30
    {0x00,0x7C,0x02,0x01,0x02,0x7C},//V
    {0x00,0x7C,0x03,0x3C,0x03,0x7C},//W
    {0x00,0x43,0x24,0x18,0x24,0x43},//X
    {0x00,0x60,0x18,0x07,0x18,0x60},//Y
    {0x00,0x63,0x45,0x49,0x51,0x63},//Z-35
    {0x00,0x00,0x00,0x01,0x00,0x00},//.
    {0x00,0x14,0x14,0x14,0x14,0x14},//=
    {0x00,0x08,0x08,0x3E,0x08,0x08},//+
    {0x00,0x08,0x08,0x08,0x08,0x08},//-
    {0x00,0x00,0x00,0x24,0x00,0x00},//:-40
    };
    //DELAYER
    void delay0(int counter){
    int i,j;
    for(i=0;i<counter;i++){for(j=0;j<i;j++){;}}
    }
    //Write Plus
    void wri(void){clk=0;clk=1;}
    //使用SPI接口写数据到LCD,dt:写入的数据 command: 1-数据/0-命令
    void b2l(unsigned char dt,unsigned char command){
    unsigned char i;
    //cs=0;  
    reg=command;  
    for(i=0;i<8;i++){
      if(dt&0x80) dat=1;else dat=0;
      dt=dt<<1;   
      wri();
    }  
    //cs=1;  
    }
    //名称: 设置坐标函数,参数:X:0-83 Y:0-5
    void setXY(unsigned char X,unsigned char Y){
    b2l(0x40+Y,0);//column
    b2l(0x80+X,0);//row
    }
    //名称: LCD清屏函数
    void lcdClear(void){
    unsigned char t,k;
    setXY(0,0);
    for(t=0;t<9;t++){for(k=0;k<102;k++){b2l(0x00,1);}}
    }
    //名称: 显示英文字符,参数:c:显示的字符在asc2表格中的位置
    void c2l(unsigned char x,unsigned char y,unsigned char c){
    unsigned char line;
    setXY(x*6,y);   
    for(line=0;line<6;line++)b2l(asc2[c][line],1);
    }
    //名称: 写汉字到LCD函数,row,page:写入汉字的地址 c: 写入汉字在han表格中的位置
    void h2l(unsigned char row,unsigned char page,unsigned char c){//row:列 page:页 dd:字符
    unsigned char i;
    setXY(row*8,page);// 列,页
    for(i=0;i<16;i++){b2l(hanzi[c*2],1);}
    setXY(row*8,page+1);// 列,页
    for(i=16;i<32;i++){b2l(hanzi[c*2],1);}  
    }
    //名称: 6903LCD初始化函数
    void lcdInit(void){
    wait(0.001);
    res=0;
    wait(0.001);
    res=1;
    wait(0.001);        
    b2l(0x25,0);//00100 PD=1dcOn|=0Dcoff V=0Up|=1Left H==1
    wait(0.0005);
    b2l(0x14,0);//脉宽L000~111=1/6-1/7-1/8-1/9//14=1/7
    wait(0.0005);
    b2l(0xAC,0);//设置VOP值,约为8.96V
    wait(0.0005);
    b2l(0x20,0);//PD=0,H=0,V=0
    //b2l(0x40+y,0);//Y地址40+L0000~1111=0~63
    //b2l(0x80+x,0);//x地址80+L0000000~1111111=0~102
    //Test
    //b2l(0x09,0);//08+/09=全黑显示/08=全白显示/0C=正常/0D=翻转显示
    //wait(1.0f);
    //b2l(0x08,0);//全白显示
    //wait(1.0f);
    //b2l(0x0D,0);//翻转显示
    //wait(1.0f);
    b2l(0x0C,0);//LCD设置完成
    wait(0.005);
    }
    //Display ASCII Test
    void dispAsc(void){
    int i,j,k=0;
    for(i=0;i<8;i++){
      for(j=0;j<17;j++){
       c2l(j,i,k);
       if(k>39){k=0;}else{k++;}
      }
    }
    }
    //END Files//


    由于不需要读LCD,因此片选线cs直接接地,只用4根信号线。
    main如下:
    #include "mbed.h"
    #include "6903.h"

    DigitalOut myled0(P0_15);

    int main(){
    lcdInit();
    lcdClear();
    while(true){
      myled0 =!myled0;
      dispAsc();
      wait(0.5);
      lcdClear();
    }
    }

    结果见照片图21。此实验可以看出像设置和驱显LCD较为复杂的模块,采用mbed也都非常简单。

    21-驱显12864LCD.JPG

    21-驱显12864LCD.JPG
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 20:58 , Processed in 0.080150 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表