STM32驱动ST7920的12864液晶(串行方式)

 

/******************************************************************************************
* 文件名称 :12864.c
* 版权     :
* 模块名称 :st7920驱动的12864液晶的串行工作方式驱动程序
* cpu      :  stm32f103rct6                       主频:72M
* 作者     :
* 创建日期 :2009-10-15
* 功能概要 :
*----------------------------------------修改历史------------------------------------------
* 当前版本 :       修改人:                  修改日期:
* 修改说明 :
******************************************************************************************/

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"

#define SID_H   GPIOC->BSRR=GPIO_Pin_11
#define SID_L   GPIOC->BRR=GPIO_Pin_11 

#define CS_H  GPIOC->BSRR=GPIO_Pin_12
#define CS_L  GPIOC->BRR=GPIO_Pin_12 

#define SCLK_H  GPIOC->BSRR=GPIO_Pin_10
#define SCLK_L  GPIOC->BRR=GPIO_Pin_10

#define x1    0x80
#define x2    0x88
#define y     0x80
#define comm  0
#define dat   1

u8 const  num_lcd[]={"0123456789 :.-"};

/******************************************************************************************
* 函数名称    :Lcd_init
* 功能描述    :初始化LCD
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2008-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Lcds_Config(void)
{
// SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

 /*PC4-A0*/
// GPIO_SetBits(GPIOC, GPIO_Pin_12);//预置为高
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
 
}
/******************************************************************************************
* 函数名称    :Delaynms
* 功能描述    :延时
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Delaynms(u16 di)
{
 u16 da,db;
  for(da=0;da<di;da++)
    for(db=0;db<10;db++);
}
/******************************************************************************************
* 函数名称    :Lcd_init
* 功能描述    :初始化LCD
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2008-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Lcd_Init(void) 
{
 Delaynms(50); //启动等待,等LCM讲入工作状态
   CS_H;
   Write_Char(0,0x30);  //8 位介面,基本指令集
   Write_Char(0,0x0c);  //显示打开,光标关,反白关
   Write_Char(0,0x01);  //清屏,将DDRAM的地址计数器归零 
}

/******************************************************************************************
* 函数名称    :Write_char
* 功能描述    :写指令或数据
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Write_Char(u8 start, u8 ddata)
{
 u8 start_data,Hdata,Ldata;
   if(start==0)
  start_data=0xf8;  //写指令
    else   
     start_data=0xfa;  //写数据
 
   Hdata=ddata&0xf0;    //取高四位
   Ldata=(ddata<<4)&0xf0;  //取低四位
   Send_Byte(start_data);   //发送起始信号
   Delaynms(10); //延时是必须的
   Send_Byte(Hdata);       //发送高四位
   Delaynms(5);  //延时是必须的
   Send_Byte(Ldata);    //发送低四位
   Delaynms(5);  //延时是必须的
}

/******************************************************************************************
* 函数名称    :Send_byte
* 功能描述    :发送一个字节
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2009-10-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Send_Byte(u8 bbyte)
{
 u8 i,t;
  for(i=0;i<8;i++)
    {
  if((bbyte)&0x80)
         SID_H; //取出最高位
     else
   SID_L;
   SCLK_H;
  t = 0x10;
  while(t--);   //延时 lcd读取数据
     SCLK_L;
     bbyte <<= 1; //左移
    } 
}


/******************************************************************************************
* 函数名称    :Clr_Scr
* 功能描述    :清屏函数
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2009-10-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Clr_Scr(void)//清屏函数
{
 Write_Char(0,0x01);
}

/******************************************************************************************
* 函数名称    : LCD_set_xy
* 功能描述    :设置LCD显示的起始位置,X为行,Y为列
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void LCD_Set_XY( u8 X, u8 Y )

    u8 address;
 switch(X)
 {
  case 0:
   address = 0x80 + Y;
   break;   
     case 1:
      address = 0x80 + Y;
      break;
  case 2:
   address = 0x90 + Y;
   break;
      case 3:
       address = 0x88 + Y;
       break;
  case 4:
   address = 0x98 + Y;
   break;
  default:
   address = 0x80 + Y;
   break;
 }
    Write_Char(0, address);
}

/******************************************************************************************
* 函数名称    :LCD_Write_string
* 功能描述    :中英文字符串显示函数
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void LCD_Write_String(u8 X,u8 Y,uc8  *s)

 LCD_Set_XY( X, Y );
   
    while (*s)
    {
  Write_Char( 1, *s );
     s ++;
  Delaynms(1);
 }
}

/******************************************************************************************
* 函数名称    :LCD_Write_number
* 功能描述    :数字显示函数
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void LCD_Write_Number(u8 s)// 数字显示函数

 Write_Char(1,num_lcd[s]);
 Delaynms(1);
}

/******************************************************************************************
* 函数名称    :img_disp
* 功能描述    :显示图形
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Display_Img(u8 const *img)
{
   u8 i,j;
   for(j=0;j<32;j++)
   {
     for(i=0;i<8;i++)
     {
       Write_Char(comm,0x34);
  Delaynms(10);
       Write_Char(comm,y+j);
  Delaynms(10);
       Write_Char(comm,x1+i);
  Delaynms(10);
       Write_Char(comm,0x30);
  Delaynms(10);
       Write_Char(dat,img[j*16+i*2]);
  Delaynms(10);
       Write_Char(dat,img[j*16+i*2+1]);
  Delaynms(10);
     }
   }
   for(j=32;j<64;j++)
   {
     for(i=0;i<8;i++)
     {
       Write_Char(comm,0x34);
  Delaynms(10);
       Write_Char(comm,y+j-32);
  Delaynms(10);
       Write_Char(comm,x2+i);
  Delaynms(10);
       Write_Char(comm,0x30);
  Delaynms(10);
       Write_Char(dat,img[j*16+i*2]);
  Delaynms(10);
       Write_Char(dat,img[j*16+i*2+1]);
  Delaynms(10);
     }
   }
 Delaynms(10);
   Write_Char(comm,0x36);
}

 

/******************************************************************************************
* 函数名称    :Delay_Lcd
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述
*
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :     修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Delay_Lcd(u16 us)   //delay time
{
   while(us--);
}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值