找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD12864不带字库的单片机程序如何改写为带字库的显示

[复制链接]
跳转到指定楼层
楼主
ID:1011007 发表于 2022-4-17 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
#include "lcd12864.h"
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#if 1                //TX_OSC
sbit pinLCD_CSA = P2^6;
sbit pinLCD_CSB = P2^7;
sbit pinLCD_DI = P1^7;                    // 寄存器操作
sbit pinLCD_RW = P2^4;                    // 写寄存器操作
sbit pinLCD_E = P2^5;
#define LCD_DataPort P0

#endif


#if 0                //Test
sbit pinLCD_CSA = P2^4;
sbit pinLCD_CSB = P2^3;
sbit pinLCD_DI = P2^2;                    // 寄存器操作
sbit pinLCD_RW = P2^1;                    // 写寄存器操作
sbit pinLCD_E = P2^0;
#define LCD_DataPort P1

#endif



#define  LCDField_NULL  4
#define c_LCD_MaxColNumber 16
//uchar ucDotData;

//----------------------------------------------------------------------------
// 函 数 名:void LCD_DrvFieldSelect(uchar ucField)
// 用    途:选择液晶的区域,共1#?三个区域
// 入口参数:uchar ucField 第几个区域,区域为 1 、 2 、3 , 三个区域
// 返    回: 无
// ----------------------------------------------------------------------------
void LCD_DrvFieldSelect(uchar ucField)
{
        switch(ucField)
        {
                case 0:
                         pinLCD_CSA = 0;
                        pinLCD_CSB = 1;
                        break;
                case 1:
                        pinLCD_CSA = 1;
                        pinLCD_CSB = 0;
                        break;
                default:
            pinLCD_CSA = 1;
                        pinLCD_CSB = 1;
                        break;
        }
}

//----------------------------------------------------------------------------
// 函 数 名:void LCD_DrvWriteREG(uchar ucIndicate)
// 用    途:写液晶寄存器
// 入口参数:ucField    寄存器所在的通道
//           ucIndicate 指令
// 返    回: 无
//----------------------------------------------------------------------------
void LCD_DrvWriteREG(uchar ucField,uchar ucIndicate)
{


         pinLCD_DI = 0;                    // 寄存器操作
        pinLCD_RW = 0;                    // 写寄存器操作

    LCD_DrvFieldSelect(ucField);      // 液晶片选

    LCD_DataPort = ucIndicate;    // 向液晶寄存器写入数据
        pinLCD_E = 1;
        pinLCD_E = 0;


    pinLCD_RW = 1;                     // 写寄存器操作

        pinLCD_DI = 0;                    // 寄存器操作
    LCD_DrvFieldSelect(LCDField_NULL); // 关闭液晶片选
}

//----------------------------------------------------------------------------
// 函 数 名:uchar LCD_DrvReadREG(uchar ucField)
// 用    途:读液晶寄存器
// 入口参数:无
// 返    回: 液晶寄存器中的内容
//----------------------------------------------------------------------------

uchar LCD_DrvReadREG(uchar ucField)
{
        uchar ucResult;

        pinLCD_E = 0;

         pinLCD_DI = 0;                     // 寄存器操作
        pinLCD_RW = 1;                     // 写寄存器操作
    _nop_();

    LCD_DrvFieldSelect(ucField);       // 液晶片选

    LCD_DataPort = 0xFF;    // 向液晶寄存器写入数据
           pinLCD_E = 1;
        pinLCD_E = 0;

    ucResult = LCD_DataPort ;     // 从液晶寄存器读出数据

    LCD_DrvFieldSelect(LCDField_NULL); // 关闭液晶片选

    return ucResult;
}


//----------------------------------------------------------------------------
// 函 数 名:void LCD_DrvWriteData(uchar ucData)
// 用    途:向液晶写入数据
// 入口参数:ucField    寄存器所在的通道
//           ucData  待写入的数据
// 返    回: 无
//----------------------------------------------------------------------------
void LCD_DrvWriteData(uchar ucField,uchar ucData)
{

        pinLCD_DI = 1;                      // 数据操作
    pinLCD_RW = 0;  

    LCD_DrvFieldSelect(ucField);        // 液晶片选
    LCD_DataPort = ucData;         // 向液晶寄存器写入数据
        pinLCD_E = 1;
        pinLCD_E = 0;

        pinLCD_RW = 1;
        pinLCD_DI = 1;                      // 数据操作

    LCD_DrvFieldSelect(LCDField_NULL);  // 关闭液晶片选
}

//----------------------------------------------------------------------------
// 函 数 名:uchar LCD_DrvReadData(unsigned char ucField)
// 用    途:自液晶读出数据
// 入口参数:ucField 第几个区域 , 区域为 1 、 2 、3 , 三个区域
// 返    回: 液晶数据的内容
//----------------------------------------------------------------------------
/*
uchar LCD_DrvReadData(uchar ucField)
{
        uchar ucResult;

        pinLCD_DI = 0;                      // 数据操作
        pinLCD_RW = 0;                      // 读数据操作
    Delay(10);

    LCD_DrvFieldSelect(ucField);        // 液晶片选
    ucResult = LCD_DataPort;       // 向液晶数据写入数据
    Delay(10);

        pinLCD_RW = 1;
    Delay(10);

    LCD_DrvFieldSelect(LCDField_NULL);  // 关闭液晶片选

    return ucResult;
}
*/

/*
void loop_lcd_is_busy(unsigned char right)
{
  unsigned char tmp,counter=0;
  do {
          if(right) tmp = LCD_RCR;
          else tmp = LCD_LCR;        
        if(counter++>50) break;//超时跳出
  }
  while ((tmp|0x7f)==0xff);         
}
*/
void loop_lcd_is_busy(unsigned char right)
{
  unsigned char tmp,counter=0;
  do {
                tmp = LCD_DrvReadREG(right);

        if(counter++>50) break;//超时跳出
  }
  while ((tmp|0x7f)==0xff);         
}

void lcd_cmd_wr(unsigned char cmdcode,unsigned char right)
{
  loop_lcd_is_busy(right);
//  if(right) LCD_RCW = cmdcode;
//  else LCD_LCW = cmdcode;  
        LCD_DrvWriteREG(right,cmdcode);
}

void lcd_data_wr(unsigned char ldata,unsigned char right)
{
  loop_lcd_is_busy(right);
//  if(right) LCD_RDW = ldata;
//  else LCD_LDW = ldata;
        LCD_DrvWriteData(right,ldata);
}

void lcd12864_clr(void)
{
        unsigned char i,j;


        for(i=0;i<8;i++)
        {
                lcd_cmd_wr(SETY+i,0);
                lcd_cmd_wr(SETX,0);
                lcd_cmd_wr(SETY+i,1);
                lcd_cmd_wr(SETX,1);        

                for(j=0;j<64;j++)
                {
                        lcd_data_wr(0,0);
                        lcd_data_wr(0,1);
                }
        }
}

void lcd12864_init(void)
{
  lcd_cmd_wr(DISPON,0);
  lcd_cmd_wr(DISPFIRST,0);
  lcd_cmd_wr(SETY,0);
  lcd_cmd_wr(SETX,0);
  lcd_cmd_wr(DISPON,1);
  lcd_cmd_wr(DISPFIRST,1);
  lcd_cmd_wr(SETY,1);
  lcd_cmd_wr(SETX,1);
  lcd12864_clr();
}

/*图片写入函数*/
void lcd12864_put_xywhb(unsigned char x,y,w,h,unsigned char *bmp)
{
          unsigned char i,j;
          h = h/8;
          for(i=0;i<h;i++)
          {
                           lcd_cmd_wr(SETY+y+i,0);
                           lcd_cmd_wr(SETX+x,0);
                           for(j=0;j<w-64;j++)
                             lcd_data_wr(bmp[128*i+j],0);

                           lcd_cmd_wr(SETY+y+i,1);
                           lcd_cmd_wr(SETX+x,1);
                           for(j=64;j<w;j++)
                             lcd_data_wr(bmp[128*i+j],1);
          }
}//*

/*8x8点阵asci字符显示*/
void lcd12864_put_xystr(unsigned char x,y,n,unsigned char *str)
{
        unsigned char i;               
        for(i=0;i<n;i++) {
                if((x+i)>63) {
                        lcd_cmd_wr(SETY+y,1);
                        lcd_cmd_wr(SETX+x+i-64,1);
                        lcd_data_wr(str[ i],1);
                }
                else {
                        lcd_cmd_wr(SETY+y,0);
                        lcd_cmd_wr(SETX+x+i,0);
                        lcd_data_wr(str[ i],0);
                }
        }        
}//*/

/*8x8点阵asci字符显示*/
void lcd12864_put_clr(unsigned char x,y,n)
{
        unsigned char i;               
        for(i=0;i<n;i++) {
                if((x+i)>63) {
                        lcd_cmd_wr(SETY+y,1);
                        lcd_cmd_wr(SETX+x+i-64,1);
                        lcd_data_wr(0,1);
                }
                else {
                        lcd_cmd_wr(SETY+y,0);
                        lcd_cmd_wr(SETX+x+i,0);
                        lcd_data_wr(0,0);
                }
        }        
}//*/




#ifndef __LCD_12864_H__
#define __LCD_12864_H__

#include <reg52.h>
#include <absacc.h>
#include "Mini51b.h"

/************常用操作命令和参数定义********/
#define DISPON    0x3f    //display on
#define DISPOFF   0x3e    //display off
#define DISPFIRST 0xc0    //define the first row
#define SETY      0xb8    //define page address
#define SETX      0x40    //define column address


extern void lcd12864_init(void);

/*图片写入函数*/
extern void lcd12864_put_xywhb(unsigned char x,y,w,h,unsigned char *bmp);
/*8x8点阵asci字符显示*/
extern void lcd12864_put_xystr(unsigned char x,y,n,unsigned char *str);
/*指定快清零*/
extern void lcd12864_put_clr(unsigned char x,y,n);
extern void lcd_cmd_wr(unsigned char cmdcode,unsigned char right);
extern void lcd_data_wr(unsigned char ldata,unsigned char right);
extern void lcd12864_clr(void);
#endif


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

使用道具 举报

沙发
ID:732794 发表于 2022-4-17 20:26 | 只看该作者
液晶JLX12864G-1016不带字库.rar (2.97 MB, 下载次数: 42) 用这个,写的很经典。



回复

使用道具 举报

板凳
ID:123289 发表于 2022-4-18 17:05 | 只看该作者
1、删除取字模部分
2、细读新模块手册
3、按手册中要求重写。
回复

使用道具 举报

地板
ID:1011007 发表于 2022-4-19 16:42 | 只看该作者
yzwzfyz 发表于 2022-4-18 17:05
1、删除取字模部分
2、细读新模块手册
3、按手册中要求重写。

谢谢,我看看参考资料再改改
回复

使用道具 举报

5#
ID:1011007 发表于 2022-4-19 16:43 | 只看该作者
51FAN2020 发表于 2022-4-17 20:26
用这个,写的很经典。

感谢您的资料,我下载学习学习
回复

使用道具 举报

6#
ID:863267 发表于 2022-4-21 22:22 | 只看该作者
不能换,要重写,不过有无字符库的编写经验,直接引用这个有字符库的模块就是替换而已,不会太费时间
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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