美文网首页
单片机小白学习之路(四十四)---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