文章目录

一、硬件部分

1.1 整体电路

1.2 原件列表

二、软件部分

2.1 程序架构

2.2 主程序

2.3 LCD12864驱动程序

2.4 字库文件

三、仿真结果


一、硬件部分

1.1 整体电路

1.2 原件列表


二、软件部分

2.1 程序架构

 

2.2 主程序

void main()
{
    lcd_init();                     // 初始化
    lcd_clear(0);                   // 清屏
    lcd_set_line(0);                // 设置起始行为0
    display(1, 2, 2 * 16, jiao);    // 交
    display(1, 2, 3 * 16, liu);     // 流
    display(2, 2, 4 * 16, shi);     // 使
    display(2, 2, 5 * 16, yong);    // 用

    while (1);
}

 

2.3 LCD12864驱动程序

#include <lcd.h>
#include <intrins.h>

#define lcd_databus P2         // LCD的8位数据总线

/************** 判忙函数 **************/ 
void lcd_r_busy()
{
    P2 = 0x00;
    RS = 0;
    RW = 1;
    EN = 1;
    while (P2 & 0x80);  // 最高位DB7==1,则busy
    EN = 0;
}


/************* LCD写命令函数 *************/
void lcd_w_cmd(uchar value)
{
    lcd_r_busy();        // 每次读写操作前都要忙判断
    RS = 0;
    RW = 0;
    lcd_databus = value;
    EN = 1;              // 下降沿锁存写入的数据/命令
    _nop_();
    _nop_();
    EN = 0;
}


/************* LCD写数据  **************/
void lcd_w_data(uchar value)
{
    lcd_r_busy();
    RS = 1;
    RW = 0;
    lcd_databus = value;
    EN = 1;                // 下降沿锁存写入的数据/命令
    _nop_();
    _nop_();
    EN = 0;
}


/***************页设置:显示在哪一页******************/
/*************共8页,一页是8行像素点*****************/
void lcd_set_page(uchar page)
{
    page = 0xb8 | page;     // 页的首地址为0xb8:page或上0xb8=选择page页
    lcd_w_cmd(page);
}


/************行设置:起始在哪一行********************/
/**********每页共8行,一般从0行开始******************/
void lcd_set_line(uchar sline)
{
    sline = 0xc0 | sline;   // 起始行地址为0xc0:sline或上0xc0=选择行
    lcd_w_cmd(sline);
}


/*************起始列设置+像素点选择********************/ 
/***********每半片共64列,列值不得大于63***************/
void lcd_set_column(uchar column)
{
    column = 0x3f & column;   // 与上列的最大值63:0x3f  可得所选列值<63
    column = 0x40 | column;   // 得列的首地址
    lcd_w_cmd(column);
}


/*************设置显示的开关********************/ 
/**********0为关闭显示;1为 开启显示************/
void lcd_on_off(uchar set)
{
    set = 0x3e | set;        // =0011 111x----0x3e为关闭显示;0x3f为开启显示
    lcd_w_cmd(set);
}


/*************选择左右半屏显示********************/ 
/********0-全屏显示;1-左;2-右********************/ 
/************cs片选端低电平有效********************/ 
void lcd_cs(uchar sel)
{
    switch (sel)
    {
    case 0:CS1 = 0; CS2 = 0; break;     // 全屏显示
    case 1:CS1 = 0; CS2 = 1; break;     // 左显示
    case 2:CS1 = 1; CS2 = 0; break;     // 右显示
    default:break;
    }
}


/*************清屏:选择半屏********************/
/********0-清全屏;1-清左;2-清右***************/ 
void lcd_clear(uchar sel)
{
    uchar i, j;
    lcd_cs(sel);
    for (i = 0; i < 8; i++)
    {
        lcd_set_page(i);
        lcd_set_column(0);
        for (j = 0; j < 64; j++)
        {
            lcd_w_data(0x00);   // 每列全部写0,列地址指针自动+1
        }
    }
}


/****************LCD的初始化********************/
void lcd_init()
{
    lcd_r_busy();
    lcd_cs(0);
    lcd_on_off(0);      // 关显示
    lcd_cs(0);
    lcd_on_off(1);      // 开显示
    lcd_cs(0);
    lcd_clear(0);       // 清全屏
    lcd_set_line(0);    // 起始行设为0
}


/****************16*16像素的汉字显示程序********************/
void display(uchar cs, uchar page, uchar column, uchar* p)
{
    uchar i;
    lcd_cs(cs);
    lcd_set_page(page);             // 要在本页写上半个汉字8*16
    lcd_set_column(column);         // 选择起始列
    for (i = 0; i < 16; i++)
    {
        lcd_w_data(p[i]);           // 按列输入上半个汉字的编码8*16
    }
    lcd_set_page(page + 1);         // 要在下一页写下半个汉字8*16
    lcd_set_column(column);         // 选择起始列
    for (i = 0; i < 16; i++)
    {
        lcd_w_data(p[i + 16]);      // 按列输入下半个汉字的编码8*16 
    }
}

2.4 字库文件

#ifndef _ZIKU_H_
#define _ZIKU_H_

// 交
const uchar code jiao[] = { 0x08,0x08,0x88,0x68,0x08,0x08,0x09,0x0E,0x08,0x08,0x88,0x28,0x48,0x88,0x08,0x00,0x80,0x81,0x40,0x40,0x21,0x22,0x14,0x08,0x14,0x22,0x41,0x40,0x80,0x81,0x80,0x00, };

// 流
const uchar code liu[] = { 0x10,0x60,0x02,0x8C,0x00,0x44,0x64,0x54,0x4D,0x46,0x44,0x54,0x64,0xC4,0x04,0x00,0x04,0x04,0x7E,0x01,0x80,0x40,0x3E,0x00,0x00,0xFE,0x00,0x00,0x7E,0x80,0xE0,0x00, };

// 使
const uchar code shi[] = { 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, };

// 用
const uchar code yong[] = { 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, };

#endif

三、仿真结果