fpga_feixiang 发表于 2019-9-16 21:06:57

初始化LCD的代码

1.两个最重要的函数

/**ruby
      值得注意的是:
            (1).这两个函数(向LCD写入命令和向LCD写入数据)能够写好正常
                整个LCD的初始化代码基本上就写好一大半了,因为后面所有的函数都是不断调用这两个函数
            (2).这两个函数可以根据自己的需求合并成一个,两个函数就一个地方不一样CD12864_RS = 0/1
            (3).这是根据上面时序图写出来的,和LCD1602的代码也简直一模一样
                只需要稍微改变一下,延时函数我也没显示出来,根据自己开发平台来自己写
    */
      //向12864中写入数据
      void LCD12864_Write_Data(unsigned char dat)
      {
            LCD12864_E = 0;
            LCD12864_WR = 0;//选择写模式
            LCD12864_RS = 1;//选择数据模式

            //延时
            delay_10us(1);

            //将数据准备
            LCD12864_Data = dat;

            delay_10us(1);

            LCD12864_E = 1;//表示开始写入数据,上升沿写入数据

            delay_10us(20); //延时等待数据全部发送完成
      }



      //向12864中写入命令
      void LCD12864_Write_Com(unsigned char com)
      {
            //首先我们设置片选信号
            LCD12864_E = 0;//片选信号一般设置为0表示片选
            LCD12864_WR = 0;//选择写模式
            LCD12864_RS = 0;//选择命令模式

            //延时
            delay_10us(1);

            //将数据准备
            LCD12864_Data = com;

            delay_10us(1);

            LCD12864_E = 1;//表示开始写入数据,上升沿写入数据

            delay_10us(20);
      }
2.初始化函数

/**
      注意:
            (1).这些指令具体代表什么暂时不用管,如果你想快速看到你的LCD效果
                你有时间再去研究,这些指令基本就是一些约束校准的工作
      */
      //对LCD12864进行初始化
      void LCD12864_Init()
      {
            //首先对LCD进行复位
            LCD12864_REST = 0;
            delay_ms(30);
            LCD12864_REST = 1;
            delay_ms(20);

            /* 开始初始化的步骤 */
            LCD12864_Write_Com(0x30);
            LCD12864_Write_Com(0x08);
            LCD12864_Write_Com(0x01);
            LCD12864_Write_Com(0x06);
            LCD12864_Write_Com(0x0c);

      }
3.基本刷屏函数

      /*
      1.总共分为上下两个屏幕,其中第0->31行和第32->63行的行地址相同

      (上 0->31)第一个屏幕的首地址(0x80,0x80) -> ... -> (0x80,0x87)
                                 ....
                                  (0xa0,0x80) -> ... -> (0xa0,0x87)
      (下 32->63)第二个屏幕的首地址(0x80,0x88) -> ... -> (0x80,0x90)
                                    ...
                                 (0xa0,0x88) -> ... -> (0xa0,0x90)

      2.每个地址就是控制 一行16个小点,发送两次数据分别控制前8点和后8个点,
            例写入的01010101 01010101来控制屏幕的点 , 1显示 0不显示

      3.先写入行地址,后写入列地址,连续写列地址会自动增加
      */

      //进行清屏操作 LCD12864_Clear_Screen(0xFF)全亮
            //LCD12864_Clear_Screen(0xFF)全灭
      void LCD12864_Clear_Screen(unsigned char value)
      {
            unsigned char i,j;

            LCD12864_Write_Com(0x34);
            LCD12864_Write_Com(0x36);


            for(i=0;i<64;i++){
                  if(i<32){
                  LCD12864_Write_Com(0x80+i);
                  LCD12864_Write_Com(0x80);
                  }else {
                  LCD12864_Write_Com(0x80+(i-32));
                  LCD12864_Write_Com(0x88);
                  }

                  for(j=0;j<16;j++)
                        LCD12864_Write_Data(value);
            }
      }
4.显示中英文字符函数

//显示非中文字符 和 中文字符都差不多,因为自带汉字库,只是注意写汉字的时候要连续写!
// 注意这里的坐标变了,一定要注意!!!
    /*
    实际坐标:
      0x80 -> 0x87
      0x90 -> 0x97
      0x88 -> 0x8f
      0x98 -> 0x9f

      //这个坐标我们自己规定的,再换算成上面的实际坐标就可以了
      指出坐标(1,1) -> (1,8)
                (4,1) -> (4,8)
      再指出需要显示的字符
      */
      unsigned char addresses[] = {0x80,0x90,0x88,0x98};
      void LCD12864_Display_Char(unsigned char x,unsigned char y,unsigned char dat){


                LCD12864_Write_Com(0x30);
                LCD12864_Write_Com(0x06);

                //写入地址
                LCD12864_Write_Com(addresses+(y-1));

                //写入数据
                LCD12864_Write_Data(dat);

      }

      //显示汉字
      void LCD12864_Display_Chars(unsigned char x,unsigned char y,unsigned char *dat){


                LCD12864_Write_Com(0x30);
                LCD12864_Write_Com(0x06);

                //写入地址
                LCD12864_Write_Com(addresses+(y-1));

                //写入数据
                while(*dat != '\0'){
                  LCD12864_Write_Data(*dat);
                  dat++;
                }
      }
5.主函数调用一下

void main(){
    unsigned char *datas ="LCD液晶显示";
    //液晶初始化
    LCD12864_Init();

    LCD12864_Clear_Screen(0x00); //清屏

    while(1){

      LCD12864_Display_Char(1,2,'A');
      LCD12864_Display_Chars(2,1,datas);
    }

}

zxopenljx 发表于 2019-9-17 10:01:56

感谢楼主分享

晓灰灰 发表于 2019-9-17 12:53:50

初始化LCD的代码
页: [1]
查看完整版本: 初始化LCD的代码