字符型液晶12864(ST7290)驱动模块

发布者:MagicGarden最新更新时间:2016-11-17 来源: eefocus关键字:字符型液晶  ST7290  驱动模块 手机看文章 扫描二维码
随时随地手机看文章

/*******************************************************************************
**  测试芯片:M16
**  晶振    :  8.000000
**  名称    :  ST7290驱动模块
**  总结    : 主要是要在void LCM_write_byte( uchar byte )此函数后加一个延时。最小5us
**  说明    :  本驱动配合延时驱动 delay.h, 用到string.h
**             用到 uchar 和 uint 和 long int 和 float 类型 , 请注意使用
*******************************************************************************/

#ifndef _LCM12864_H_
#define _LCM12864_H_

#include "DELAY.H"
#include
/*------LPC2148与LCM连接信息-----------------------------------------
PC_0 -> CS

PC_1 -> SID

PC_2 -> SCLK

RESET -> 悬空

PSB   -> 低电平
------------------------------------------------------------------*/

#include "stdlib.h"
#include "stdio.h"
#include "string.h"


#define uchar           unsigned char
#define uint            unsigned int

#define CS_SET          PORTC |=  (1 << 0)        /********  第四脚CS   -- PC_0 **********/
#define CS_CLR          PORTC &=~ (1 << 0)  
#define SID_SET         PORTC |=  (1 << 1)    /********  第五脚SID  -- PC_1 **********/
#define SID_CLR         PORTC &=~ (1 << 1)  
#define SCLK_SET        PORTC |=  (1 << 2)    /********  第六脚SCLK -- PC_2 **********/
#define SCLK_CLR        PORTC &=~ (1 << 2)
#define PORT_DDR_OUT    { DDRC = ( 1 << 0 ) | ( 1 << 1 ) | ( 1 << 2 ); }  //在LCM_init()函数里使用
//---------------------------------------------------------------------------------


/****************************函数声明****************************************/

void long_to_string( long int dataint, char *p  );           //整型数据转化为字符串
void float_2_string( float dataf, char *datastr, uchar p );  // 浮点型数据转化为字符串
void LCM_write_byte( uchar byte );                             //单线写一个字节
void LCM_write_command( uchar command );                     //写指令
void LCM_write_data( uchar data );                           //写数据
void LCM_init( void );                                       //LCM初始化
void LCM_set_rc( uchar r, uchar c );                         //设置液晶显示位置
void LCM_write_string( uchar r, uchar c, char *string );     //写中文汉字串
void LCM_write_datalongint( uchar r, uchar c, long int datalongint );  //写整数
void LCM_write_datafloat( uchar r, uchar c, float dataf, uchar p );    //写浮点型数据


#endif

 

#define _ARMLCM12864_C_

#include "LCM12864.H"

/*****************************************
** 将一个整型数据转化为字符串
** 入口参数 要转换的整型数: dataint, 数组p[10]
** 改变思路:整数 -->字符串-->加字符串结束标志
** 可以转换小于0的整数
*****************************************/
void long_to_string( long int dataint, char *p  )
{
    long int datainttmp;
    char *p1;             //指向转换成为数组时用到
    char datachar1[10];
    char datachar2[10];
    uchar n = 0;         //取整型数据的位数
    uchar i = 0;
    uchar k1 = 0;         //取字符个数
    uchar k2 = 0;         //取字符个数

    if( dataint >= 0 )
    datainttmp = ( long int )dataint;
    else datainttmp = ( long int )dataint * ( -1 );

    p1 = datachar2;


    while( datainttmp != 0 )
    {
        datachar1[n++] = ( datainttmp % 10 ) + 0x30;  //转换为字符并取得这个整型数据的位数 n
        datainttmp /= 10;
    }

    if( dataint > 0 )          //如果要转换的整型数据>0
    {
        k1 = n - 1;
        k2 = n;

        for( i = 0; i < k2; i++, k1-- )
        {
            datachar2[k1] = datachar1[i];               //将数字符串倒过来
        }
        datachar2[n] = '\0';      //字符串结束标志
    }

    else if( dataint < 0 )       //<0
    {
        k1 = n;
        k2 = n + 1;

        for( i = 0; i < k2; i++, k1-- )
        {
            datachar2[k1] = datachar1[i];
        }
        datachar2[n + 1] = '\0';
        datachar2[0] = '-';      //加上负号
    }

    else if( dataint == 0 )        //=0
    {
        datachar2[0] = 0x30;
        datachar2[1] = '\0';
    }

    p1 = datachar2;
                                                                 \
    strcpy( p, p1 );
}

/*****************************************
** 将一个浮点型数据转化为字符串
** 入口参数 要转换的浮点数: dataf, 数组datastr[10], 小数位数 P
** 最好小数位数不是
** 改变思路:浮点数 --> 整数 -->字符串-->根据各种类型的浮点数不同调整字符位置
** 可以转换小于0的浮点数
*****************************************/
void float_2_string( float dataf, char *datastr, uchar p )
{
    float dataftmp  = dataf;
    char datastr1[10];
    uchar flag1 = 0;
    uchar flag2 = 0;
    uchar k;
    uchar i = 0;

    if( (long int)dataf == 0 )       // dataf为 -1 --- 1 之间的数
    {
        dataftmp += 2;          //随便一个整数 只是为了扩大为首位不为0的数
        flag1 = 1;
        if( dataf < 0 )
        {
            flag2 = 1;
            dataftmp -= 4;      //随便一个整数 只是为了扩大为首位不为0的数
            flag1 = 0;
        }
    }

    for( i = 0; i < p + 1; i++ )
        dataftmp = dataftmp * 10;

    long_to_string( (long int)dataftmp, datastr1 );
    k = strlen( datastr1 );

    for( i = 1; i < p + 1; i++ )
        *( datastr1 + (k-i) ) =  *( datastr1 + (k-i-1) );

    *( datastr1 + (k-i) ) = '.';


    if( flag1 )        //如果为0.00820之类的数
    {
        *datastr1 = '0';
        flag1 = 0;
    }

    if( flag2 )       //如果为-0.00820之类的数
    {
        *datastr1 = '-';
        *( datastr1 + 1 ) = '0';
    }

    if( p == 0 )
    {
        *( datastr1 + (k-i) ) = '\0';
    }

    strcpy( datastr, datastr1 );
}
//*********************************************************************************************


//单线写一个字节
void LCM_write_byte( uchar byte )
{
     uint i;
     uchar byte_tmp;
     for( i = 0; i < 8; i++ )
     {
        SCLK_CLR;
        byte_tmp = byte;
        byte_tmp <<= i;
        if( byte_tmp & 0x80 ) SID_SET;
        else SID_CLR;
        SCLK_SET;
        SCLK_CLR;
     }

     delay_nus( 10 );          //安全起见,一定要加这个延时
}

//写指令
void LCM_write_command( uchar command )
{
    CS_SET;
    LCM_write_byte( 0xf8 );         //11111, RW, RS, 0  其中令RW = 0, RS = 0, 最后一位为0
    LCM_write_byte( 0xf0 & command );        //高四位
    LCM_write_byte( 0xf0 & ( command << 4 ) );  //低四位
    CS_CLR;
}

//写数据
void LCM_write_data( uchar data )
{
    CS_SET;
    LCM_write_byte( 0xfa );           //11111, RW, RS, 0  其中令RW = 0, RS = 0, 最后一位为0
    LCM_write_byte( 0xf0 & data );             //高四位
    LCM_write_byte( 0xf0 & ( data << 4 ) );    //低四位
    CS_CLR;
}


//LCM初始化     
void LCM_init( void )
{
    PORT_DDR_OUT;         //初始化时定义端口为输出

    delay_nms( 40 );
    LCM_write_command( 0x30 ); //0x30
    delay_nus( 100 );
    LCM_write_command( 0x30 ); //0x30
    delay_nus( 37 );
    LCM_write_command( 0x0C ); //0x0c 显示控制 开显示, 不显游标, 游标位置不反白
    delay_nus( 100 );
    LCM_write_command( 0x01 ); //清屏
    delay_nms( 10 );          //10ms延时
    LCM_write_command( 0x06 ); //0X06进入点设定, 指定在数据的读取与写入时,设定游标的移动方向及显示的移位
    delay_nus( 100 );
 
}


//设置液晶显示位置
//入口: r 行(范围1 - 4 )  c 列(范围1 - 8 )
void LCM_set_rc( uchar r, uchar c )
{
 uchar pos;
 switch( r )
 {
  case 1:
   pos = 0x80 + c - 1;
   break;
  case 2:
   pos = 0x90 + c - 1;
   break;
  case 3:
   pos = 0x88 + c - 1;
   break;
  case 4:
   pos = 0x98 + c - 1;
   break;
 }

 LCM_write_command( pos );
}

//写中文汉字串
void LCM_write_string( uchar r, uchar c, char *string )
{
    LCM_set_rc( r, c );
    while( *string )
    {
        LCM_write_data( *string );
  string++;
    }
}

//写整数
void LCM_write_datalongint( uchar r, uchar c, long int datalongint )
{
    char a[10];
    long_to_string( datalongint, a ) ;
 LCM_write_string( r, c, a );
}

//写浮点型数据
void LCM_write_datafloat( uchar r, uchar c, float dataf, uchar p )
{
    char a[10];
    float_2_string( dataf, a, p );
    LCM_write_string( r, c, a );
}
//******************************************************************************


关键字:字符型液晶  ST7290  驱动模块 引用地址:字符型液晶12864(ST7290)驱动模块

上一篇:AVR+DS1302时钟芯片测试程序
下一篇:M16+DS18B2驱动程序

推荐阅读最新更新时间:2024-03-16 15:20

ADuM4135栅极驱动器与Microsemi IGBT模块配合使用分析
简介 绝缘栅极双极性晶体管(IGBT)是适用于高压应用的经济高效型解决方案,如车载充电器、非车载充电器、DC-DC快速充电器、开关模式电源(SMPS)应用。开关频率范围:直流至100 kHz。IGBT可以是单一器件,甚至是半桥器件,如为图1所示设计选择的。 本应用笔记所述设计中的APTGT75A120 IGBT是快速沟槽器件,采用Microsemi Corporation®专有的视场光阑IGBT技术。该IGBT器件还具有低拖尾电流、高达20 kHz的开关频率,以及由于对称设计,具有低杂散电感的软恢复并联二极管。选定IGBT模块的高集成度可在高频率下提供最优性能,并具有较低的结至外壳热阻。 使用ADI公司的栅极驱动技术驱
[电源管理]
ADuM4135栅极<font color='red'>驱动</font>器与Microsemi IGBT<font color='red'>模块</font>配合使用分析
LCM1602字符液晶模块驱动(C51)
/******************************************************************************************** * 功 能:LCM1602液晶模块驱动。 * 硬件条件:1.CPU型号:AT89S52 * 2.晶振:12.000MHz * 3.用跳线帽短接JP4跳线,即P0口全部接上拉电阻。 * 4.LCM1602与AT89S52的连接如下: * * LCM1602 AT89S52 备 注 * =============================================
[单片机]
基于51单片机的电子秤设计-LCD12864
一.硬件方案 本设计利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。 主要由51单片机(STC89C51/52、AT89C51/52均可使用)+LCD12864液晶显示屏+HX711AD转换模块+LED指示灯+蜂鸣器电路+矩阵按键+10kg压力传感器等;如图: 二.设计功能 (1)可以输出量程为10kg物体的重量,精度为0.001kg; (2)可通过按键设置单价,并根据实际重量计算出总价; (3)支持去皮功能、切换量程等功能,输出的重量和
[单片机]
基于51单片机的电子秤设计-LCD<font color='red'>12864</font>
HC-SR505红外感应模块驱动(STM32)
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 HC-SR505红外感应模块:淘宝有售 二、实验效果 三、驱动原理 这个模块比较简单,当有人靠近时候其IO输出3.3V,STM32可以直接采集。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 HC_SR505.h #ifndef __HC_SR505_H__ #define __HC_SR505_H__ #include stm32f10x.h #include gpio.h #define HC_SR505 PAin(0) #define HC_SR505_
[单片机]
HC-SR505红外感应<font color='red'>模块</font><font color='red'>驱动</font>(STM32)
LCD12864(带字库) for MSP430f5529 全功能程序
废话不多说,LCD12864是一款分辨率为64X128的液晶显示屏。   常见ST7920主控的LCD12864 引脚定义如下:   1 VSS - 模块的电源地   2 VDD - 模块的电源正端   3 V0 - LCD驱动电压输入端   4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号   5 R/W(SID) H/L 并行的读写选择信号;串行的数据口   6 E(CLK) H/L 并行的使能信号;串行的同步时钟   7 DB0 H/L 数据0   8 DB1 H/L 数据1   9 DB2 H/L 数据2   10 DB3 H/L 数据3   11 DB4
[单片机]
LCD<font color='red'>12864</font>(带字库) for MSP430f5529 全功能程序
PIC单片机12864编程程序
IC用PIC16F877A,晶振4MHz,采用并行8线,LCD:TS12864-3,接法在程序中有定义,只要将此程序COPY到你的PICC里编译下载后,在目标板上即可以看到图画了! #include pic.h #define RS RC0 #define RW RC1 #define E RC2 #define PSB RC3 #define RST RC4 //PORTD=DATA; unsigned char COUNT3,COUNT2,COUNT1,COUNT,LCD_X,LCD_Y,LCD_DATA1,LCD_DATA2,LCD_DATA,F3,R1,F0; const unsigned char
[单片机]
STC89C52R并行驱动LCD12864(asm/c51)
/*已实验论证 AT89C52与LCD12864 未用BF(忙信号)查询,延时1ms 不能进行BF查询*/ rs bit p2.4 rw bit p2.5 e bit p2.6 psb bit p2.1 res bit p2.3 com equ 30h date equ 31h org 0000h sjmp main org 0030h main:mov p0,#00h mov p2,#10000111b lcall delay setb res mov sp,#60h lcall init lcall page1 clr p1.7 sjmp $ init:mov com,#00110000b;基本
[单片机]
STC89C52R并行<font color='red'>驱动</font>LCD<font color='red'>12864</font>(asm/c51)
STM32—驱动HC-SR04超声波测距模块
超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精确的直线测距,其测距原理图如下: HC-SR04的一端发出超声波,接触到反射物后反射,被另一个端口接收到,所以只要知道发射和接收的时间差,就可以根据声波传播的速率算出HC-SR04和反射物直接的距离。 所以实现超声波测距就需要俩个条件: 发射和接收的时间差 超声波传输的速率 HC-SR04工作原理 HC-SR04模块的电气参数如示: HC-SR04模块的实物图如示: 有四个引脚: Vcc:+5V电源供电 Trig:输入触发信号(可以触发测距) Echo:传出信号回响(可以传回时间差) Gnd:接地 用Trig和Echo引脚实现测距的流程: 1.通过T
[单片机]
STM32—<font color='red'>驱动</font>HC-SR04超声波测距<font color='red'>模块</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved