美文网首页
单片机小白学习之路(四十四)---LCD12864液晶编码

单片机小白学习之路(四十四)---LCD12864液晶编码

作者: 飞向深空 | 来源:发表于2018-11-06 13:35 被阅读0次

    lcd12864.c

    #include "lcd12864.h"
    
    void LcdSt7565_WriteCmd(cmd)    //写入一个命令到12864
    {
        LCD12864_CS = 0;   //chip select,打开片选
        LCD12864_RD = 1;   //disable read,读使能
        LCD12864_RS = 0;   //select command,选择命令
        LCD12864_RW = 0;   //select write,选择写模式
        _nop_();
        _nop_();
    
        DATA_PORT = cmd;   //put command,写入命令
        _nop_();
        _nop_();
    
        LCD12864_RW = 1;   //command writing,写入命令
    }
    
    
    void LcdSt7565_WriteData(dat)   //写入一个数据到12864
    {
        LCD12864_CS = 0;   //chip select,打开片选
        LCD12864_RD = 1;   //disable read,读使能
        LCD12864_RS = 1;   //select data,选择数据
        LCD12864_RW = 0;   //select write,选择写模式
        _nop_();
        _nop_();
    
        DATA_PORT = dat;   //put data,写入数据
        _nop_();
        _nop_();
    
        LCD12864_RW = 1;   //data writing,写入数据
    }
    
    
    void Lcd12864_Init()
    {
        uchar i;
        LCD12864_RSET = 0;
        for(i=0;i<100;i++);
        LCD12864_CS = 0;
        LCD12864_RSET = 1;
    
        LcdSt7565_WriteCmd(0xE2);
        for(i=0;i<100;i++);
    
        LcdSt7565_WriteCmd(0xa0); //表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)
    
        LcdSt7565_WriteCmd(0xC8); //表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向
    
        LcdSt7565_WriteCmd(0xA6); //-表格第9个命令,0xA6为设置字体为黑色,背景为白色. 0xA7为设置字体为白色,背景为黑色
    
        //--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//
        LcdSt7565_WriteCmd(0xA4);  //normal display
        
        //--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//
        LcdSt7565_WriteCmd(0xA2);  //bias set 1/9
        
        //--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
        //--0xF801,选择增压为5X,其实效果差不多--//  
        LcdSt7565_WriteCmd(0xF8);  //Boost ratio set
        LcdSt7565_WriteCmd(0x01);  //x4
        
        //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
        //--选择从0x00到0X3F。用来设置背景光对比度。---/
        LcdSt7565_WriteCmd(0x81);  //V0 a set
        LcdSt7565_WriteCmd(0x23);
    
        //--表格第17个命令,选择调节电阻率--//
        LcdSt7565_WriteCmd(0x25);  //Ra/Rb set
        
        //--表格第16个命令,电源设置。--//
        LcdSt7565_WriteCmd(0x2F);
        for (i=0; i<100; i++);
    
        //--表格第2个命令,设置显示开始位置--//
        LcdSt7565_WriteCmd(0x40);  //start line
    
        //--表格第1个命令,开启显示--//
        LcdSt7565_WriteCmd(0xAF);  // display on
        for (i=0; i<100; i++);
    }
    
    
    void Lcd12864_ClearScreen()
    {
        uchar i,j;
    
        for(i=0;i<8;i++){
            //y轴有64个,一个坐标8位,就总共有8个坐标//
            //所有我们所使用的坐标是0xb0到0xb7//
            LcdSt7565_WriteCmd(0xb0+i); // y轴坐标
            
            //上面48行,当初始化是0xa1时,x坐标从(0x10,0x04)到(0x18,0x04),一共128位//
            //当你的段初始化为0xA0时,X坐标从(0x10,0x00)到(0x18,0x00),一共128位//
            LcdSt7565_WriteCmd(0x10); // 我们初始化是0xa0,设置x轴坐标
            LcdSt7565_WriteCmd(0x00);
    
            for(j=0;j<128;j++){   //x轴有128位,就一共刷128次,x坐标会自动加1,所以不需要再次设置坐标
    
                LcdSt7565_WriteData(0x00);  
            }
        }
    }
    
    
    #ifdef CHAR_CODE
    #include "charcode.h"
    
    uchar Lcd12864_Write16CnCHAR(uchar x,uchar y,uchar *cn)
    {
        uchar j,x1,x2,wordNum;
    
        if(y > 7){
            return 0;
        } //Y的坐标只能从0到7,大于则直接返回
    
        if(x > 128){
            return 0;
        } //X的坐标只能从0到128,大于则直接返回
        y += 0xb0;    //得到y坐标的值
    
        LcdSt7565_WriteCmd(y); //设置Y坐标
        while(*cn !='\0')
        {
            LcdSt7565_WriteCmd(y);
            x1 = (x>>4)&0x0f;
            x2 = x&0x0f;
    
            LcdSt7565_WriteCmd(0x10+x1);
            LcdSt7565_WriteCmd(0x00+x2); //设置x坐标
    
            for(wordNum=0;wordNum<50;wordNum++) //在字库里搜索,我们这里假设有50个汉字
            {
                if ((CN16CHAR[wordNum].Index[0] == *cn)
                     &&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
                {
                    for(j=0;j<32;j++)   //写入相应汉字的显示矩阵共32个数
                    {    
                        if(j==16)
                        {    //汉字的上面一半写完了,重新定义下面一半的坐标
                            LcdSt7565_WriteCmd(y+1);
    
                            LcdSt7565_WriteCmd(0x10+x1);  //x坐标的高4位
                            LcdSt7565_WriteCmd(0x00+x2);  //x坐标的低4位
                        }
                        LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]); //显示汉字的上面一半
                    }
                    x +=16; //第一个汉字写完了,坐标右移,汉字占的是16*16  
                }//if查字结束
            }  //for查字结束
            cn +=2; // 指针加2,指向第二个数字
        }
        return 1;
    
    }
    
    #endif
    

    main.c

    #include "reg52.h"
    #include "lcd12864.h"
    
    typedef unsigned int u16;
    typedef unsigned char u8;
    
    void Delay10ms(uint c)
    {
        uchar a,b;
        for(;c>0;c--)
            for(b=38;b>0;b--)
                for(a=130;a>0;a--);
    }
    
    
    void main()
    {
        u8 i;
        Lcd12864_Init();
        Lcd12864_ClearScreen();
        while(1){
            for(i=0;i<8;i+=2){   //两行构成一个汉字,可写四行汉字
                Lcd12864_ClearScreen();
    
                Lcd12864_Write16CnCHAR(0,i,"欢迎使用--开拓者");
                Delay10ms(100);
            }
        }
    }
    

    lcd12864.h

    //自定义头文件名//
    #ifndef _lcd12864_h
    #define _lcd12864_h
    
    //包含头文件//
    #include<reg52.h>
    #include<intrins.h>
    
    #define CHAR_CODE
    
    
    //快捷定义//
    #ifndef uint
    #define uint unsigned int
    #endif
    
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    //引脚//
    #define DATA_PORT P0
    sbit LCD12864_CS = P3^2;
    sbit LCD12864_RD = P2^6; 
    sbit LCD12864_RW = P2^5;
    sbit LCD12864_RSET = P3^3;  
    sbit LCD12864_RS  = P2^7;
    
    
    //函数//
    void LcdSt7565_WriteCmd(cmd);
    void LcdSt7565_WriteData(dat);
    void Lcd12864_Init();
    void Lcd12864_ClearScreen();
    uchar Lcd12864_Write16CnCHAR(uchar x,uchar y,uchar *cn);
    
    #endif
    

    charcode.h

    #ifndef __CHARCODE_H
    #define __CHARCODE_H
    
    #ifdef CHAR_CODE
    
    // ------------------  汉字字模的数据结构定义 ------------------------ //
    struct Cn16CharTypeDef                  // 汉字字模数据结构 
    {
        unsigned char  Index[2];            // 汉字内码索引,一个汉字占两个字节 
        unsigned char  Msk[32];             // 点阵码数据(16*16有32个数据) 
    };
    //纵向取模,字节倒序, 宋体小四
    struct Cn16CharTypeDef code CN16CHAR[]=
    {
    /*--  文字:  欢  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "欢",0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
    0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,
    
    /*--  文字:  迎  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "迎",0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,
    0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,
    
    /*--  文字:  使  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "使",0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00,
    0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00,
    
    /*--  文字:  用  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "用",0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
    0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
    
    /*--  文字:  —  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "--",0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    
    /*--  文字:  开  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "开",0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
    0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
    
    /*--  文字:  拓  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "拓",0x10,0x10,0x10,0xFF,0x10,0x90,0x04,0x04,0x84,0xE4,0x9C,0x84,0x84,0x84,0x04,0x00,
    0x04,0x44,0x82,0x7F,0x01,0x04,0x02,0x01,0xFF,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,
    
    /*--  文字:  者  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    "者",0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00,
    0x10,0x08,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
    
    };
    
    #endif  //end of CHAR_CODE
    
    #endif
    
    

    相关文章

      网友评论

          本文标题:单片机小白学习之路(四十四)---LCD12864液晶编码

          本文链接:https://www.haomeiwen.com/subject/cyjkxqtx.html