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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容