找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1756|回复: 1
打印 上一主题 下一主题
收起左侧

LCD12864串行代码

[复制链接]
跳转到指定楼层
楼主
ID:446213 发表于 2019-5-3 23:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
**********************************************************************
*                         头文件包含
**********************************************************************
*/
#include "lcd12864.h"


/*
**********************************************************************
*                         本地全局变量
**********************************************************************
*/
sbit gLcd12864_E  = P2^7;                        // LCD12864控制总线的使能信号
sbit gLcd12864_RW = P2^6;                        // LCD12864控制总线的读写选择信号,串行数据口
sbit gLcd12864_RS = P2^5;                        // LCD12864控制总线的数据/命令选择信号
//sbit gLcd12864_PSB= P1^0;                        // PSB=1为并口,PSB=0为串口

/*
**********************************************************************
*                         内部函数原型声明
**********************************************************************
*/
static void delay_1ms(u16 x);
//static void delay500ms(void);
/*********************************************************************
* 函 数 名       : delay_1ms
* 函数功能                 : 延时
* 参数列表       : x——设定延时时间
* 函数输出             : 无
*********************************************************************/
static void delay_1ms(u16 x)
{
        u16 i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);
}
/*********************************************************************
* 函 数 名       : delay500ms
* 函数功能                 : 单片机小精灵V1.3生成的延时500ms的精确延时函数
* 参数列表       : 无
* 函数输出             : 无
*********************************************************************/
static void delay500ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=23;c>0;c--)
        for(b=152;b>0;b--)
            for(a=70;a>0;a--);
}
/*********************************************************************
* 函 数 名       : sendbyte
* 函数功能                 : 读一个字节
* 参数列表       : zdata
* 函数输出             : 无
*********************************************************************/
static void sendbyte(u8 zdata)
{
   u8 i;
   for(i=0; i<8; i++)
        {
                if((zdata << i) & 0x80)           //一个字节与上10000000(0x80),如果字节最高位为1则数据线发1,反之发0
                {
                        gLcd12864_RW = 1;
                }
                else
                {
                        gLcd12864_RW = 0;
                }
                gLcd12864_E = 0;
                _nop_();                                         //一个正脉冲(可要可不要)
                gLcd12864_E = 1;
    }
}
/*********************************************************************
* 函 数 名       : Lcd12864WriteCmd
* 函数功能                 : 按照LCD12864低层时序向LCD内部写入8位命令字
* 参数列表       : cmd - 待写入的8位命令字
* 函数输出             : 无
*********************************************************************/
static void Lcd12864WriteCmd(u8 cmd)
{  
   gLcd12864_RS=1;
   gLcd12864_E=0;
   sendbyte(0xf8);                     //第一个字节11111000——0xf8-写指令

   sendbyte(cmd & 0xf0);
   sendbyte((cmd << 4) & 0xf0);
   gLcd12864_RS=0;                                 // 禁止LCD
   delay_1ms(1);
}
/*********************************************************************
* 函 数 名       : Lcd12864WriteData
* 函数功能                 : 按照LCD12864低层时序向LCD内部写入8位数据
* 参数列表       : dat - 待写入的8位命令字
* 函数输出             : 无
*********************************************************************/
static void Lcd12864WriteData(u8 dat)                       
{
   gLcd12864_RS=1;
   gLcd12864_E=0;
   sendbyte(0xfa);                     //第一个字节11111000——0xf8-写指令
   sendbyte(dat & 0xf0);
   sendbyte((dat << 4) & 0xf0);
   gLcd12864_RS=0;                                 // 禁止LCD
   delay_1ms(1);
}       
/************* 上面是底层时序函数,下面是高层时序函数 ***************/

/*********************************************************************
* 函 数 名       : Lcd12864Init
* 函数功能                 : 按照LCD12864低层时序进行初始化序列
* 参数列表       : 无
* 函数输出             : 无
*********************************************************************/
void Lcd12864Init(void)                                               
{
        //gLcd12864_PSB = 1;                        // 选定8位并行模式

        // 发送初始化序列
        Lcd12864WriteCmd(0x30);          // 0x30为基本指令集
        Lcd12864WriteCmd(0x02);
        Lcd12864WriteCmd(0x0c);                // 整体显示、游标关闭
        Lcd12864WriteCmd(0x01);                // 0x01为清屏指令
        Lcd12864WriteCmd(0x80);          // 地址自动加1
       
}
/*********************************************************************
* 函 数 名       : Lcd12864ShowStr
* 函数功能                 : 从坐标(x, y)开始显示字符串str,注意这个函数不能跨行
*                                   显示,因为显存地址是不连续的。
* 参数列表       : x - 横向坐标,范围是0-7
*                                   y - 纵向坐标,范围是0-3
*                                   pStr - 指向待显示的字符串的指针
* 函数输出             : 无
*********************************************************************/
void Lcd12864ShowStr(u8 x, u8 y, u8 *pStr)     //显示字符串
{
        switch (y)
        {
                case 0:
                        x |= 0x80;        break;                          // 第一行
                case 1:
                        x |= 0x90;        break;                          // 第二行
                case 2:
                        x |= 0x88;        break;                          // 第三行
                case 3:
                        x |= 0x98;        break;                          // 第四行
                default:
                                                break;
        }
        Lcd12864WriteCmd(x);                         // 发送地址码
          while (*pStr != '\0')                         // 若到达字串尾则退出
          {
             Lcd12864WriteData(*pStr); //
             pStr++;
                 delay_1ms(5);
          }
}
/*********************************************************************
* 函 数 名       : Lcd12864sleep
* 函数功能                 : 使液晶睡眠
* 参数列表       :
* 函数输出             : 无
*********************************************************************/
void Lcd12864sleep(u8 x)
{
  if(x==0)
  {        Lcd12864WriteCmd(0x08);}        //进入睡眠
  if(x==1)
  {        Lcd12864WriteCmd(0x0c);}        //退出睡眠
}
/*********************************************************************
* 函 数 名       : Lcd12864ClearScreen
* 函数功能                 : 清屏,即清除屏幕整个显示内容
* 参数列表       : 无
* 函数输出             : 无
*********************************************************************/
void Lcd12864ClearScreen(void)                                               
{

        // 发送初始化序列
        Lcd12864WriteCmd(0x01);          // 0x01为清屏指令
//        Lcd12864WriteCmd(0x34);                // 0x34为扩充指令集
//        Lcd12864WriteCmd(0x30);          // 0x30为基本指令集
}


/*********************************************************************
* 函 数 名       : Lcd12864FlashScreen3
* 函数功能                 : 屏幕闪烁3次
* 参数列表       : 无
* 函数输出             : 无
*********************************************************************/
void Lcd12864FlashScreen3(void)                                               
{
        u8 time = 0;

        for (time=0; time<3; time++)
        {
                Lcd12864WriteCmd(0x08);
                delay500ms();
                Lcd12864WriteCmd(0x0c);       
                delay500ms();               
        }
}
/*********************************************************************
* 函 数 名       : Lcd12864ShowImage
* 函数功能                 : 显示图片
* 参数列表       : *pData
* 函数输出             : 无
*********************************************************************/
void Lcd12864ShowImage(u8 *pData)
{
        u8 x = 0, y = 0, i = 0;
         for(i=0;i<9;i=i+8)
         for(y=0;y<32;y++)
         {
                 for(x=0;x<8;x++)
                {
                 Lcd12864WriteCmd(0x36);
                 Lcd12864WriteCmd(0x80+y);
                 Lcd12864WriteCmd(0x80+x+i);
                 Lcd12864WriteData(*pData++);
                 Lcd12864WriteData(*pData++);
                 Lcd12864WriteCmd(0x30);
                }
         }
}
/*********************************************************************
* 函 数 名       : Lcd12864tiao
* 函数功能                 : 显示图片
* 参数列表       : *pData
* 函数输出             : 无
*********************************************************************/
void Lcd12864tiao()
{
        u8 x = 0, y = 0, i = 0;
         for(i=0;i<9;i=i+8)
         for(y=0;y<32;y++)
         {
                 for(x=0;x<8;x++)
                {
                 Lcd12864WriteCmd(0x36);
                 Lcd12864WriteCmd(0x80+y);
                 Lcd12864WriteCmd(0x80+x+i);
                 Lcd12864WriteData(0x3c);
                 Lcd12864WriteData(0x3c);
                 Lcd12864WriteCmd(0x30);
                }
         }
}
/*********************************************************************
* 函 数 名       : Lcd12864heng()
* 函数功能                 : 显示图片
* 参数列表       : *pData
* 函数输出             : 无
*********************************************************************/
void  Lcd12864heng()
{
        u8 x = 0, y = 0, i = 0,k;
         for(i=0;i<9;i=i+8)
         for(y=0;y<32;y++)
         {
         if((y%8)==1)k=0xff;
     else k=0;
                 for(x=0;x<8;x++)
                {
                 Lcd12864WriteCmd(0x36);
                 Lcd12864WriteCmd(0x80+y);
                 Lcd12864WriteCmd(0x80+x+i);
                 Lcd12864WriteData(k);
                 Lcd12864WriteData(k);
                 Lcd12864WriteCmd(0x30);
                }
         }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-5-5 01:52 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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