找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2062|回復(fù): 5
收起左側(cè)

LCD12864不帶字庫(kù)的單片機(jī)程序如何改寫為帶字庫(kù)的顯示

[復(fù)制鏈接]
ID:1011007 發(fā)表于 2022-4-17 15:56 | 顯示全部樓層 |閱讀模式
單片機(jī)源程序如下:
#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;

//----------------------------------------------------------------------------
// 函 數(shù) 名:void LCD_DrvFieldSelect(uchar ucField)
// 用    途:選擇液晶的區(qū)域,共1#?三個(gè)區(qū)域
// 入口參數(shù):uchar ucField 第幾個(gè)區(qū)域,區(qū)域?yàn)?1 、 2 、3 , 三個(gè)區(qū)域
// 返    回: 無(wú)
// ----------------------------------------------------------------------------
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;
        }
}

//----------------------------------------------------------------------------
// 函 數(shù) 名:void LCD_DrvWriteREG(uchar ucIndicate)
// 用    途:寫液晶寄存器
// 入口參數(shù):ucField    寄存器所在的通道
//           ucIndicate 指令
// 返    回: 無(wú)
//----------------------------------------------------------------------------
void LCD_DrvWriteREG(uchar ucField,uchar ucIndicate)
{


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

    LCD_DrvFieldSelect(ucField);      // 液晶片選

    LCD_DataPort = ucIndicate;    // 向液晶寄存器寫入數(shù)據(jù)
        pinLCD_E = 1;
        pinLCD_E = 0;


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

        pinLCD_DI = 0;                    // 寄存器操作
    LCD_DrvFieldSelect(LCDField_NULL); // 關(guān)閉液晶片選
}

//----------------------------------------------------------------------------
// 函 數(shù) 名:uchar LCD_DrvReadREG(uchar ucField)
// 用    途:讀液晶寄存器
// 入口參數(shù):無(wú)
// 返    回: 液晶寄存器中的內(nèi)容
//----------------------------------------------------------------------------

uchar LCD_DrvReadREG(uchar ucField)
{
        uchar ucResult;

        pinLCD_E = 0;

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

    LCD_DrvFieldSelect(ucField);       // 液晶片選

    LCD_DataPort = 0xFF;    // 向液晶寄存器寫入數(shù)據(jù)
           pinLCD_E = 1;
        pinLCD_E = 0;

    ucResult = LCD_DataPort ;     // 從液晶寄存器讀出數(shù)據(jù)

    LCD_DrvFieldSelect(LCDField_NULL); // 關(guān)閉液晶片選

    return ucResult;
}


//----------------------------------------------------------------------------
// 函 數(shù) 名:void LCD_DrvWriteData(uchar ucData)
// 用    途:向液晶寫入數(shù)據(jù)
// 入口參數(shù):ucField    寄存器所在的通道
//           ucData  待寫入的數(shù)據(jù)
// 返    回: 無(wú)
//----------------------------------------------------------------------------
void LCD_DrvWriteData(uchar ucField,uchar ucData)
{

        pinLCD_DI = 1;                      // 數(shù)據(jù)操作
    pinLCD_RW = 0;  

    LCD_DrvFieldSelect(ucField);        // 液晶片選
    LCD_DataPort = ucData;         // 向液晶寄存器寫入數(shù)據(jù)
        pinLCD_E = 1;
        pinLCD_E = 0;

        pinLCD_RW = 1;
        pinLCD_DI = 1;                      // 數(shù)據(jù)操作

    LCD_DrvFieldSelect(LCDField_NULL);  // 關(guān)閉液晶片選
}

//----------------------------------------------------------------------------
// 函 數(shù) 名:uchar LCD_DrvReadData(unsigned char ucField)
// 用    途:自液晶讀出數(shù)據(jù)
// 入口參數(shù):ucField 第幾個(gè)區(qū)域 , 區(qū)域?yàn)?1 、 2 、3 , 三個(gè)區(qū)域
// 返    回: 液晶數(shù)據(jù)的內(nèi)容
//----------------------------------------------------------------------------
/*
uchar LCD_DrvReadData(uchar ucField)
{
        uchar ucResult;

        pinLCD_DI = 0;                      // 數(shù)據(jù)操作
        pinLCD_RW = 0;                      // 讀數(shù)據(jù)操作
    Delay(10);

    LCD_DrvFieldSelect(ucField);        // 液晶片選
    ucResult = LCD_DataPort;       // 向液晶數(shù)據(jù)寫入數(shù)據(jù)
    Delay(10);

        pinLCD_RW = 1;
    Delay(10);

    LCD_DrvFieldSelect(LCDField_NULL);  // 關(guān)閉液晶片選

    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;//超時(shí)跳出
  }
  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;//超時(shí)跳出
  }
  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();
}

/*圖片寫入函數(shù)*/
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點(diǎn)陣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點(diǎn)陣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"

/************常用操作命令和參數(shù)定義********/
#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);

/*圖片寫入函數(shù)*/
extern void lcd12864_put_xywhb(unsigned char x,y,w,h,unsigned char *bmp);
/*8x8點(diǎn)陣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


回復(fù)

使用道具 舉報(bào)

ID:732794 發(fā)表于 2022-4-17 20:26 | 顯示全部樓層
液晶JLX12864G-1016不帶字庫(kù).rar (2.97 MB, 下載次數(shù): 42) 用這個(gè),寫的很經(jīng)典。



回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-4-18 17:05 | 顯示全部樓層
1、刪除取字模部分
2、細(xì)讀新模塊手冊(cè)
3、按手冊(cè)中要求重寫。
回復(fù)

使用道具 舉報(bào)

ID:1011007 發(fā)表于 2022-4-19 16:42 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-4-18 17:05
1、刪除取字模部分
2、細(xì)讀新模塊手冊(cè)
3、按手冊(cè)中要求重寫。

謝謝,我看看參考資料再改改
回復(fù)

使用道具 舉報(bào)

ID:1011007 發(fā)表于 2022-4-19 16:43 | 顯示全部樓層
51FAN2020 發(fā)表于 2022-4-17 20:26
用這個(gè),寫的很經(jīng)典。

感謝您的資料,我下載學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:863267 發(fā)表于 2022-4-21 22:22 | 顯示全部樓層
不能換,要重寫,不過(guò)有無(wú)字符庫(kù)的編寫經(jīng)驗(yàn),直接引用這個(gè)有字符庫(kù)的模塊就是替換而已,不會(huì)太費(fèi)時(shí)間
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表