LCD12864(ST7920)串行驱动程序

2019-08-05 18:51发布

/*====================================================================
LCD12864对应的C文件,定义了相关的LCD驱动函数
主要有:串行驱动LCD12864,内置的控制器为ST7920和ST7921
              LCD初始化函数
              读写函数
0xf8为写命令的命令字;0xfa为写数据的命令字,这里用的是TI_F28027
在编写和调试过程中借鉴了一些网上的程序,在此表示感谢,
这里是已经调好的,在移植过程中,调试时注意先要通过示波器对函数
void send_data(Uint16 D_Ctrl,Uint16 D_data)
的时序检测一下,是否满足要求,不行的话可改一下延时值或者查看硬件是否连好
====================================================================*/
#include "LCD12864.h"           //LCD12864的头文件
typedef unsigned int    Uint16;
/*=====================================================================
管脚的初始化,主要定义复用管脚功能 方向等
======================================================================*/
void Init_guanjiao(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;//通用IO   片选CS管脚
GpioCtrlRegs.GPADIR.bit.GPIO16=1;//输出
GpioCtrlRegs.GPAPUD.bit.GPIO16=1;//禁止上拉电阻
GpioCtrlRegs.GPBMUX1.bit.GPIO33=0; //数据管脚SID
GpioCtrlRegs.GPBDIR.bit.GPIO33=1;
GpioCtrlRegs.GPBPUD.bit.GPIO33=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//时钟CLK管脚
GpioCtrlRegs.GPADIR.bit.GPIO2=1;
GpioCtrlRegs.GPAPUD.bit.GPIO2=1;
EDIS;
}
/*=====================================================================
LCD串行数据传送程序
函数名:void send_data(Uint16 D_Ctrl,Uint16 D_data)
功能:
串行数据传送共分三个字节完成:
第一字节:串口控制-格式 11111ABC
          A为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD
          B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令
          C固定为0
第二字节分两次传送
第一次:(并行)8位数据的高4位-格式 DDDD0000 放在一个字节中的高四位
第二次:(并行)8位数据的低4位-格式 0000DDDD 放在一个字节中的高四位
======================================================================*/
void send_data(Uint16 D_Ctrl,Uint16 D_data)
//LCD_CLK一个脉冲写一位
{        
Uint16 i,j;
Uint16 temp;
//LCD_CS=1;        //片选使能
GpioDataRegs.GPADAT.bit.GPIO16=1;
for(i=0;i<3;i++) // 串行数据的传送
{
   if(i==0)      //写第一个字节 格式1111 1ABC
   {
    temp=D_Ctrl;
   }
   if(i==1)     //写第二个字节 第一次写 高四位放在第一次传送的高四位
   {
    temp=(D_data&0xf0);
   }
   if(i==2)     //写第二个字节 第二次写 低四位放在第二次传送的高四位
   {
    temp=(D_data&0x0f);
    temp=temp<<4;
   }
   for(j=0;j<8;j++) //串行写8位二进制数据
   {
    //LCD_CLK=0; //时钟输入置低
    GpioDataRegs.GPADAT.bit.GPIO2=0;
    F_delay(3);
    if((temp&0x80)==0)
    {
      //LCD_SID=0; //数据SID
      GpioDataRegs.GPBDAT.bit.GPIO33=0;
    }
    else
    {
     //LCD_SID=1;    //数据SID
     GpioDataRegs.GPBDAT.bit.GPIO33=1;
    }
    //LCD_CLK=1;    //时钟输入置高
    GpioDataRegs.GPADAT.bit.GPIO2=1;
    temp=temp<<1;
    F_delay(5);  
   }
}
//LCD_CLK=0;     //时钟输入置低
GpioDataRegs.GPADAT.bit.GPIO2=0;
//LCD_CS=0;     //片选禁止
GpioDataRegs.GPADAT.bit.GPIO16=0;
}
/*=======================================================================
LCD初始化程序
函数名:void lcd_initial()
功能:
========================================================================*/
void lcd_initial(void)//写命令第一字节为0xf8,表示写的是命令
                      //0xfa则表示写数据
{
   Init_guanjiao();
   send_data(0xf8,0x30);     //功能设定
   //F_delay(10);
   send_data(0xf8,0x0C);     //显示状态开/关
   //F_delay(10);
     send_data(0xf8,0x01);     //清屏显示
   //F_delay(10);        
      //send_data(0xf8,0x06);     //进如点设定,整体显示设定
      //F_delay(10);   
     send_data(0xf8,0x02);     //地址归位
   //F_delay(10);
     //send_data(0xf8,0x40);     //设定CGRAM
   //F_delay(10);
   send_data(0xf8,0x80);     //设定DDRAM
   //F_delay(10);
}
/*=========================================================================
函数名:void write_one_word(Uint16 x,Uint16 y,Uint16 word0, Uint16 word1)
功能:
      实现在任意坐标写一个字
   X列;Y行
===========================================================================*/
void write_one_word(Uint16 x,Uint16 y,Uint16 word0, Uint16 word1)
{
    x &= 0x0f;
    y &= 0x0f;
switch(y)
{
   case 0:x+=0x80;
         break;
   case 1:x+=0x90;
         break;
   case 2:x+=0x88;
         break;
   case 3:x+=0x98;
         break;
   default:break;
}
send_data(0xf8,x);
//F_delay(80L);
send_data(0xfa,word0);
//F_delay(80L);
send_data(0xfa,word1);
}
/*============================================================================
函数名:void write_list_word(Uint16 x,Uint16 y,Uint16 flash *hanzi)
功能:
      实现从任一坐标开始写字
=============================================================================*/
//void write_list_word(Uint16 x,Uint16 y,Uint16 flash *hanzi)
void write_list_word(Uint16 x,Uint16 y,char *hanzi)
{
   Uint16 i,j;
   for(i=0;i<16;i+=2)//这里8是等于*hanzi指针所指字符串的汉字个数,如有删减要将8改成相应的数
   {      
    j=x;
    write_one_word(x,y,hanzi[i],hanzi[i+1]);
   //F_delay(80L);
    x=j+1;                  
   }
}
/*================================================
//显示点阵
//经过调试发现显示点阵是非常有意思的,
//最主要的在于data1,data2上的两组数据的取值,
//不同的取值对应着不同的点阵效果。-
==================================================*/
void lat_disp (Uint16 data1,Uint16 data2)
{
     Uint16 i,j,k,x,y;
     x=0x80;
y=0x80;
//x1=0x80;
//x2=0x88;
     for(k=0;k<2;k++)
     {
       for(j=0;j<16;j++)
       {
         for(i=0;i<8;i++)
         {
           send_data (0xf8,0x34); //扩充指令操作。
           send_data (0xf8,y+j*2);
           send_data (0xf8,x+i);
           send_data (0xf8,0x30);
           send_data (0xfa,data1);
           send_data (0xfa,data1);
         }
         for(i=0;i<8;i++)
         {
           send_data (0xf8,0x34);
           send_data (0xf8,y+j*2+1);
           send_data (0xf8,x+i);
           send_data (0xf8,0x30);
           send_data (0xfa,data2);
           send_data (0xfa,data2);
         }
       }
       x=0x88;
     }
     send_data (0xf8,0x36);
}
//===============================================================================
void F_delay(Uint16 D_time)
{
Uint16 i;
for(i=0;i<D_time;i++);
}
//===========================================================================
// End of file.
//===========================================================================
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
meng219902
1楼-- · 2019-08-05 20:28
 精彩回答 2  元偷偷看……
acer4736
2楼-- · 2019-08-06 00:26
这个不错,顶一下
jinpaidianzi
3楼-- · 2019-08-06 03:55
好东西,收了
meishizhaoshi
4楼-- · 2019-08-06 04:11
留着备用
wangjinlili
5楼-- · 2019-08-06 07:26
12864很多人都用哇
下一个微笑
6楼-- · 2019-08-06 12:13
 精彩回答 2  元偷偷看……

一周热门 更多>