51单片机 串口12864显示驱动

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit CS = P2^5;       //片选信号(RS)
sbit SID = P2^6;   //串行数口 (R/W)
sbit CLK = P2^7;   //串行同步时钟 (E)

/*延时100us*/
void LCD12864_delay(uint t)     
{
     uint a,b;
    for(a=t;a>0;a--)
        for(b=10;b>0;b--);
}

/*发送数据*/
void sendbyte(uchar dat)
{
     uchar i;
    for(i=0;i<8;i++)
    {
         if(dat&0x80)
        {
             SID= 1;        
        }else{
             SID = 0;
        }
        dat = dat<<1;
        CLK = 0;
        CLK = 1;
    }
}
/*写指令*/
void write_com(uchar cmdcode)
{
    CS = 1;
    sendbyte(0xf8);                //写指令操作
    sendbyte(cmdcode & 0xf0);  
    sendbyte((cmdcode << 4) & 0xf0);  
    LCD12864_delay(2);
}

/*写数据*/
void write_data(uchar Dispdata)  
{  
    CS = 1;  
    sendbyte(0xfa);                 //写数据操作
    sendbyte(Dispdata & 0xf0);  
    sendbyte((Dispdata << 4) & 0xf0);  
    LCD12864_delay(2);  
} 


/*LCD12864初始化*/
void LCD_init()
{
        //显示字符初始化            
        write_com(0x30);                //基本指令操作
        LCD12864_delay(50);
        write_com(0x0c);                //显示开\关光标
        LCD12864_delay(50);
        write_com(0x01);                //清除LCD的显示内容
        LCD12864_delay(50);
//        //显示图片初始化            
//        write_com(0x36);                //扩充指令操作
//        delay_ms(5);
//        write_com(0x3e);                //
//        delay_ms(5);
//        write_com(0x0c);                //显示开\关光标
//        delay_ms(5);
//        write_com(0x01);                //清除LCD的显示内容
//        delay_ms(5);
}

/*设置显示位置*/
void LCD_pos(uchar X,uchar Y)
{
        uchar pos;
        if(X==0)
        {
                X = 0x80;
        }
        else if(X==1)
        {
                X = 0x90;
        }
        else if(X==2)
        {
                X = 0x88;
        }
        else if(X==3)
        {
                X = 0x98;
        }
        pos = X+Y ;
    write_com(pos); 
}

/*显示 a行 b列 *c为显示的字符*/
void LCD_Display(uchar a,uchar b,uchar *c)
{
        LCD_pos(a,b);
        while(*c)
        {
                write_data(*c);
                c++;
        }
}

/*清除某一行*/
void LCD_clear_line(uchar n)
{
        uint i;
        LCD_pos(n,0);
        for(i=0;i<16;i++)
            {
                    write_data(' ');
            }
}//vo

//图片显示
/*图片全屏显示*/
void tupian(uchar p[][16])
{
     uchar x,y,a,b,c;
    write_com(0x34);    //关闭绘图功能
    x = 0x80;
    y = 0x80;
    for(c=0;c<2;c++)
    {
         for(a=0;a<32;a++)
        {
             write_com(y+a);
            write_com(x);
            for(b=0;b<16;b++)
                write_data(p[a+c*32][b]);
        }
        x=0x88;
    }
    write_com(0x36);     //打开绘图功能
    write_com(0x30);    
}

/*图片清屏*/
void qingping()        //清除DDRAM的数据:送入0
{
     uchar x,y,a,b,c;
    x=0x80;
    y=0x80;
    write_com(0x34);     //关闭绘图功能
    for(a=0;a<2;a++)
    {
        for(b=0;b<32;b++)
        {
            write_com(y+b);
            write_com(x);
            for(c=0;c<16;c++)
                write_data(0x00);    
        }
        x=0x88;
    }
    write_com(0x36);     //打开绘图功能
    write_com(0x30);
}



#ifndef _LCD12864_H_
#define _LCD12864_H_
#define uchar unsigned char
#define uint unsigned int

extern void write_com(uchar cmdcode);                //写指令
extern void write_data(uchar Dispdata);                //写数据
extern void LCD_init();                                //LCD12864初始化
extern void LCD_pos(uchar X,uchar Y);                //设置显示位置
extern void LCD_Display(uchar a,uchar b,uchar *c);  //显示 a行 b列 *c为显示的字符
extern void LCD_clear_line(uchar n);                  //清除某一行
extern void tupian(uchar p[][16]);                    //图片全屏显示
extern void qingping();                                //图片清屏

#endif
#include <reg52.h>
#include "LCD12864.h"
#define uchar unsigned char
#define uint unsigned int

uchar code tu1[][16] = {
0xC0,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x8F,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFD,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE1,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0xF1,0xDF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xFF,0xC3,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xE0,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xFC,0x07,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0xC0,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xF8,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xFF,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0xE0,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xFE,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xC0,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xF8,0x0F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0xFF,0x80,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0xC0,0x00,0x00,0x3F,0xF0,0x1F,0xF8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,
0x00,0xFF,0xF8,0x00,0x00,0x07,0xFE,0x03,0xFF,0x80,0x00,0x01,0xF8,0x00,0x00,0x00,
0x01,0xFF,0xFE,0x00,0x00,0x00,0xFF,0xE0,0x3F,0xF0,0x00,0x03,0xFE,0x00,0x00,0x00,
0x07,0xE0,0x3F,0x00,0x00,0x00,0x0F,0xFC,0x07,0xFE,0x7F,0x83,0xFF,0x00,0x00,0x00,
0x0F,0x80,0x0F,0x80,0x00,0x00,0x01,0xFF,0x80,0xFF,0xFF,0xFB,0xFF,0x80,0x00,0x00,
0x1E,0x00,0x03,0xC0,0x00,0x00,0x00,0x3F,0xF8,0x0F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x3C,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xFF,0x3F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x38,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x7F,0xFC,0x3F,0xFF,0xFF,0xE0,0x00,0x00,
0x38,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x0F,0xFE,0x03,0xFF,0xFF,0xF0,0x00,0x00,
0x30,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x01,0xFF,0xC0,0x7F,0xFF,0xF8,0x00,0x00,
0x30,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x03,0xDF,0xF8,0x0F,0xFF,0xFC,0x00,0x00,
0x30,0x00,0x00,0x70,0x00,0xFE,0x00,0x00,0x03,0x83,0xFF,0x00,0xFF,0xFC,0x00,0x00,
0x30,0x00,0x00,0x70,0x03,0xFF,0xC0,0x00,0x07,0x80,0x7F,0xF0,0x7F,0xFE,0x00,0x00,
0x30,0x00,0x00,0x70,0x0F,0xFF,0xE0,0x00,0x07,0x00,0x07,0xFE,0x3F,0xFF,0x00,0x00,
0x38,0x00,0x00,0xF0,0x1F,0x01,0xF0,0x00,0x07,0x00,0x00,0xFF,0xBF,0xFF,0x80,0x00,
0x38,0x00,0x00,0xE0,0x1C,0x00,0x70,0x00,0x07,0x00,0x00,0x1F,0xFF,0xFF,0xC0,0x00,
0x3C,0x00,0x01,0xE0,0x38,0x00,0x38,0x00,0x07,0x00,0x00,0x01,0xBF,0xFF,0xE0,0x00,
0x1E,0x00,0x03,0xC0,0x38,0x00,0x38,0x00,0x07,0x80,0x00,0x00,0x7F,0xFF,0xE0,0x00,
0x0F,0x80,0x0F,0x80,0x38,0x00,0x38,0x00,0x03,0x80,0x00,0x00,0x7F,0xFF,0xF0,0x00,
0x07,0xE0,0x3F,0x00,0x1C,0x00,0x70,0x00,0x03,0xC0,0x00,0x00,0xF7,0xFF,0xF8,0x00,
0x03,0xFF,0xFE,0x00,0x1F,0x01,0xF0,0x00,0x01,0xE0,0x00,0x01,0xE7,0xFF,0xFC,0x00,
0x00,0xFF,0xF8,0x00,0x0F,0xFF,0xE0,0x00,0x00,0xF0,0x00,0x03,0xE7,0xFF,0xFE,0x00,
0x00,0x3F,0xE0,0x00,0x07,0xFF,0xC0,0x00,0x00,0x7C,0x00,0x0F,0xC3,0xFF,0xFF,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x7F,0x03,0xFF,0xFF,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x03,0xFF,0xFF,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xF8,0x03,0xFF,0xFF,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x01,0xFF,0xFF,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF8,
0x03,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xBF,0xFC,
0x03,0x0E,0x00,0x70,0x01,0x81,0xC0,0xE3,0x00,0x00,0x00,0x00,0x00,0xFF,0xBF,0xFE,
0x06,0x06,0x00,0x30,0x00,0xC0,0xC0,0xC3,0x00,0x00,0x00,0x00,0x00,0x7F,0x1F,0xFE,
0x0F,0xC6,0x00,0x30,0x00,0x1E,0xC1,0x87,0xE0,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,
0x06,0xC6,0x03,0xFC,0x00,0x1E,0xC1,0xFF,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,
0x06,0xCF,0x80,0x30,0x03,0xB6,0xC3,0xC6,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,
0x07,0xFE,0x00,0x30,0x07,0xB6,0xC0,0xCF,0x80,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,
0x06,0xC6,0x01,0xFF,0xC1,0xB6,0xC1,0x8F,0xE0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,
0x3F,0xF6,0x0F,0x60,0x01,0xB6,0xC3,0xDF,0x80,0x00,0x00,0x00,0x00,0x00,0x0F,0xFE,
0x03,0xC6,0x00,0x66,0x01,0xF6,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x06,0xC6,0x03,0x66,0x03,0xB6,0xC1,0xE3,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,
0x0C,0xC6,0x03,0x3E,0x03,0x60,0xC3,0x1B,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x19,0xDE,0x07,0xE6,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x8C,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};     //图片数据

void main()
{
    LCD_init();
    tupian(tu1);
    LCD_Display(0,6,"文");
     while(1)
    {
                     
    }
}
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,这是一个比较复杂的任务,需要一些编程和电路设计方面的知识。我会尽可能详细地解答您的问题,但是因为文字表述的限制,可能会有一些不太清晰的地方。如果您有任何疑问,请随时向我提出。 首先,我们需要了解一下12864液晶屏的接口。12864液晶屏的接口有三种,分别为并口、串口和SPI接口。其中,串口和SPI接口是比较常用的,因为它们可以减少占用的IO口数量,提高系统的效率。 接下来,我们以串口接口为例,介绍一下51单片机如何驱动12864液晶屏。 1. 硬件电路设计 首先,我们需要一个串口通信的接口电路。这个电路可以使用MAX232芯片或者直接使用51单片机串口引脚。接口电路的原理图如下图所示: 其中,P3.0和P3.1为51单片机串口引脚,RXD和TXD分别为接收和发送信号的引脚。MAX232芯片的作用是将51单片机的TTL电平转换成RS232电平,以便与12864液晶屏进行通信。 接下来,我们需要一个12864液晶屏的驱动电路。这个电路需要包括12864液晶屏的控制器和电源电路。12864液晶屏的控制器一般为KS0108或者ST7920等芯片,电源电路需要提供5V和-15V的电源。驱动电路的原理图如下图所示: 其中,P0~P7为51单片机的IO口,EN、RW和RS为控制信号,用于控制12864液晶屏的读写和显示等操作。E、R/W和DI分别为12864液晶屏的控制信号,用于与51单片机进行通信。V0为液晶偏压,需要接一个可调电阻进行调节。 2. 软件程序设计 接下来,我们需要编写51单片机的程序,实现与12864液晶屏的通信和显示。程序的主要流程如下: (1)初始化12864液晶屏的控制器,包括设置显示模式、清屏、设置光标位置等操作。 (2)循环读取数据并显示在屏幕上,可以使用汉字库和字符库来实现显示。 (3)处理用户的操作,比如键盘输入、菜单选择等。 程序的详细实现可以参考以下代码: ```c #include <reg51.h> #define EN P1_0 #define RW P1_1 #define RS P1_2 void delay(unsigned int t) { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<120;j++); } void write_cmd(unsigned char cmd) { RS = 0; RW = 0; P0 = cmd; EN = 1; delay(1); EN = 0; } void write_data(unsigned char dat) { RS = 1; RW = 0; P0 = dat; EN = 1; delay(1); EN = 0; } void init_lcd() { write_cmd(0x3f); //设置显示模式 write_cmd(0xc0); //设置光标位置 write_cmd(0x01); //清屏 write_cmd(0x06); //设置光标移动方向 } void main() { init_lcd(); //初始化液晶屏 while(1) { write_data('H'); write_data('e'); write_data('l'); write_data('l'); write_data('o'); write_data(','); write_data('W'); write_data('o'); write_data('r'); write_data('l'); write_data('d'); delay(1000); } } ``` 这段代码可以实现把“Hello,World”这个字符串显示12864液晶屏上。其中,write_cmd和write_data函数分别用于向液晶屏发送命令和数据,init_lcd函数用于初始化液晶屏的控制器。 总结一下,驱动12864液晶屏需要一个串口通信的接口电路和一个液晶屏驱动电路,以及一个51单片机的程序来实现通信和显示。具体的实现过程需要根据硬件电路的实际情况来进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dan-tony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值