找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4102|回复: 6
收起左侧

LCD12864.h的单片机驱动程序库下载 带详细代码注释

  [复制链接]
ID:398945 发表于 2019-9-14 18:36 | 显示全部楼层 |阅读模式
0.png

单片机源程序如下(带注释):

#include "lcd12864.h"

void Delayms_12864(unsigned int t)// 延时ms函数:
{
    unsigned int i,j;
    for(i=t;i>0;i--)
            for(j=0;j<120;j++);
}

void Check12864State(void)// 12864检查状态函数:
{
        LCD_DATE=0xff;
    E=0;//读状态前三控制线的状态
        RS=0;
        RW=1;
        E=1;//拉高,读状态
        while((LCD_DATE&0x80)==0x80);//等待空闲
        E=0;//写命令后三控制线的状态
        RS=1;
        RW=0;
}
               
void Write12864Command(unsigned char com)// 12864写命令函数:
{
    Check12864State();//检查状态
    LCD_DATE=com;//赋值
    E=0;//写命令前三控制线的状态
    RS=0;
    RW=0;
    E=1;//拉高,写命令
    E=0;//写命令后三控制线的状态
    RS=1;
    RW=1;
}

void Write12864Data( unsigned char dat)//12864写数据函数:
{
    Check12864State();//检查状态
    LCD_DATE=dat;//赋值
    E=0;//写数据前三控制线的状态
    RS=1;
    RW=0;   
    E=1;//拉高,写数据
    E=0;//写数据后三控制线的状态
    RS=0;
    RW=1;
}   

void LCD12864Goto(unsigned char y,unsigned char x)
{
        unsigned char row;
    Write12864Command(0x30);//基本指令
    Write12864Command(0x06);//地址计数器自动加以,光标右移
    switch(y)//根据行号选择行地址
    {
        case 0:row=0x80;break;//第一行首地址
        case 1:row=0x90;break;//第二行首地址
        case 2:row=0x88;break;//第三行首地址
        case 3:row=0x98;break;//第四行首地址
        default:;
    }
   Write12864Command(row+x);//写地址
}

void LCD12864DisplayValue( unsigned char y,unsigned char x,unsigned int digit,unsigned char value) //y-行数值0-3,x-列数值0-7,v-变量//在指定的位置显示变量值函数:
{
   unsigned char row;
   Write12864Command(0x30);//基本指令
   Write12864Command(0x06);//地址计数器自动加以,光标右移
   switch(y)//根据行号选择行地址
   {
        case 0:row=0x80;break;//第一行首地址
        case 1:row=0x90;break;//第二行首地址
        case 2:row=0x88;break;//第三行首地址
        case 3:row=0x98;break;//第四行首地址
        default:;
   }
   Write12864Command(row+x);//写地址
   switch(digit)//选择显示数字的位数
   {
        case 1:
            Write12864Data(0x30+value);//个位,先将数字化成ASCII码,再写入
            break;//第一行首地址
        case 2:
            Write12864Data(0x30+value/10);//十位/先将数字化成ASCII码,再写入
            Write12864Data(0x30+value%10);//个位,先将数字化成ASCII码,再写入
            break;//第二行首地址
        case 3:
            Write12864Data(0x30+value/100);//百位,先将数字化成ASCII码,再写入
            Write12864Data(0x30+value%100/10);//十位/先将数字化成ASCII码,再写入
            Write12864Data(0x30+value%10);//个位,先将数字化成ASCII码,再写入
            break;//第三行首地址
        case 4:
            Write12864Data(0x30+value/1000);//百位,先将数字化成ASCII码,再写入
            Write12864Data(0x30+value%1000/100);//百位,先将数字化成ASCII码,再写入
            Write12864Data(0x30+value%100/10);//十位/先将数字化成ASCII码,再写入
            Write12864Data(0x30+value%10);//个位,先将数字化成ASCII码,再写入
            break;//第四行首地址
        default:;
   }
}

void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)//在指定的位置显示字符串(汉字和ASCII码字符)函数:
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{
    unsigned char row,n=0;
    Write12864Command(0x30);//基本指令
    Write12864Command(0x06);//地址计数器自动加以,光标右移
     switch(y)//根据行号选择行地址
     {
        case 0:row=0x80;break;//第一行首地址
        case 1:row=0x90;break;//第二行首地址
        case 2:row=0x88;break;//第三行首地址
        case 3:row=0x98;break;//第四行首地址
        default:;
    }
    Write12864Command(row+x);//写地址
    while(*pstr!='\0')
    {
        Write12864Data(*pstr);//写字符
        pstr++;
        n++;//计数
        if((n+x*2)==16)//如果一行写完,继续写第二行
        {
            if(y==0) Write12864Command(0x90);//写下一行地址
            else if(y==1) Write12864Command(0x88);//写下一行地址
            else if(y==2) Write12864Command(0x98);//写下一行地址
            else ;
        }
        else if((n+x*2)==32)//如果第二行写完,继续写第三行
        {
            if(y==0) Write12864Command(0x88);//写下一行地址
            else if(y==1) Write12864Command(0x98);//写下一行地址
            else ;
        }
        else if((n+x*2)==48)//如果第三行写完,继续写第四行
        {
            if(y==0) Write12864Command(0x98);//写下一行地址
            else ;
        }
        else ;
    }
}   

void Clear12864Screen()//图片模式清屏函数:
{
   unsigned char i,j;
   Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令
   Write12864Command(0x36);//使用扩充指令,绘图显示控制
   for(i=0;i<32;i++)
//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,
//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,
//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推
   {                           
        Write12864Command(0x80|i);//写行地址(垂直地址)
        Write12864Command(0x80);//写列地址(水平地址)
        for(j=0;j<32;j++)
            Write12864Data(0x00);//清屏
   }
}

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,unsigned char px,unsigned char py, unsigned char *pp)//在任意位置显示任意大小的图片函数:
//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),
//px-图片宽度,py-图片高度,pp-指针指向图片数组
//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐
{
    unsigned char i,j,k;
    Clear12864Screen();//清屏
    if(y<32)//如果起始行在上半屏
    {
        k=32-y;//算出上半屏的行数
        for(i=0;i<k;i++,y++)//上半屏行数
        {
            Write12864Command(0x80|y);//写行地址(垂直地址)
            Write12864Command(0x80|x);//写列地址(水平地址)
            for(j=0;j<px/8;j++)
            Write12864Data(pp[i*px/8+j]);//写图片数据
        }
        y=0;//下半屏起始行,接上半屏继续写数据
        for(;i<py;i++,y++)//下半屏剩下的行数
        {
            Write12864Command(0x80|y);//写行地址(垂直地址)
            Write12864Command(0x80|(8+x));//写列地址(水平地址)
            for(j=0;j<px/8;j++)
            Write12864Data(pp[i*px/8+j]);//写图片数据
        }
    }
   else //如果起始行在下半屏
    {
        for(i=0;i<py;i++,y++)//行数
        {
            Write12864Command(0x80|(y-32));//写行地址(垂直地址)
            Write12864Command(0x80|(8+x));//写列地址(水平地址)
            for(j=0;j<px/8;j++)
            Write12864Data(pp[i*px/8+j]);//写图片数据
        }
    }
}   

void Initialize12864()//12864初始化函数:
{
    rst=0;//复位12864
    Delayms_12864(30);
    rst=1;
    Delayms_12864(20);
    Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
    Write12864Command(0x08);//显示关
    Write12864Command(0x01);//清屏
    Write12864Command(0x06);//地址计数器加一、光标右移
    Write12864Command(0x0c);//显示开
}

全部资料51hei下载地址:
Lcd12864.rar (2.58 KB, 下载次数: 158)

评分

参与人数 1黑币 +5 收起 理由
温xyz + 5 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:8222 发表于 2019-9-15 22:49 | 显示全部楼层
谢谢分享,收藏备用。
回复

使用道具 举报

ID:398945 发表于 2019-9-25 19:07 | 显示全部楼层
温xyz 发表于 2019-9-15 22:49
谢谢分享,收藏备用。

大佬,研究过51的ccs811的驱动吗?最近在做这个,头都大了?
回复

使用道具 举报

ID:622055 发表于 2020-5-18 14:16 | 显示全部楼层
感谢楼主 收藏了~~~
回复

使用道具 举报

ID:403303 发表于 2020-5-23 10:44 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

ID:948540 发表于 2021-7-3 12:51 | 显示全部楼层
是lcd.h吗
回复

使用道具 举报

ID:951007 发表于 2021-7-9 11:00 | 显示全部楼层
代码很详细,感谢分享,对我很有用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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