一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3356|回复: 7

[其他综合] 各位前辈 有HY12864K 液晶的驱动吗

[复制链接]
发表于 2011-11-6 20:25 | 显示全部楼层 |阅读模式
手里有几块  HY12864的液晶 自带背光的 驱动是HD61202  想用89C52做一个万年历   前辈有驱动的程序吗
先谢谢大家了
发表于 2011-11-7 06:51 | 显示全部楼层
Hy12864.h

// 命令类型
#define SC_CMD_ENABLE_DISPLAY        0
#define        SC_CMD_SET_START_ROW        1
#define        SC_CMD_SET_PAGE                        2
#define        SC_CMD_SET_YADDR                3
#define SC_CMD_GET_STATUS                4
#define        SC_CMD_SET_DATA                        5
#define        SC_CMD_GET_DATA                        6


// 写入的数据有些字段是固定为某些值,将用户数据和
// 以下的相应数据相或,得到需要写入的数据
#define SC_VEIL_ENABLE_DISPLAY        0x3E
#define        SC_VEIL_SET_START_ROW        0xC0
#define        SC_VEIL_SET_PAGE                0xB8
#define        SC_VEIL_SET_YADDR                0x40
#define SC_VEIL_GET_STATUSE                0x00
#define        SC_VEIL_SET_DATA                0x00
#define        SC_VEIL_GET_DATA                0x00

//         各种命令有不同的WR和RS,和硬件设计相关就对应不
//         同的地址
//         RS = Addr0;
//        RW = Addr1
//        E   = EDPL = CPU的R和W线的与非。
//        CS1 = CS1DPL when P2 = 1001xxxx CS1为0
//        CS2 = CS2DPLwhenP2  = 1010xxxxCS2为0
#define SC_ADDR_ENABLE_DISPLAY        0x00        //R/W RS:00
#define        SC_ADDR_SET_START_ROW        0x00        //00
#define        SC_ADDR_SET_PAGE                0x00        //00
#define        SC_ADDR_SET_YADDR                0x00        //00
#define SC_ADDR_GET_STATUSE                0x02        //10
#define        SC_ADDR_SET_DATA                0x01        //01
#define        SC_ADDR_GET_DATA                0x03        //11
#define SC_LEFT_ADDR        0xA000                        //左半区片选
#define SC_RIGHT_ADDR        0x9000                        //右半区片选

// 状态字BUSY   0  ON/OFF   REST   0     0     0     0
#define SC_STATUS_BUSY        0x80         
#define SC_STATUS_ON        0x20
#define SC_STATUS_REST        0x10

//屏幕区大小参数
#define SC_MAX_PAGE                8        //一个页纵向可排8个象素
#define SC_MAX_YADDR        64        //一个液晶半区横向可排64个象素
#define SC_LEFT                        1        //左半区
#define SC_RIGHT                2        //右半区

//屏幕背光
#define SC_BK_LIGHT_PIN                0x92        //p1.2
#define SC_BK_LIGHT_ENABLE        1  
#define SC_BK_LIGHT_DISABLE        0
回复

使用道具 举报

发表于 2011-11-7 06:51 | 显示全部楼层
Hy12864.c   

#include "GloblDef.h"   
#include "hy12864.h"   
//SC:Screen   
//Sel:选择那个器件   
   
BYTE xdata CommandVeil[]={   
    SC_VEIL_ENABLE_DISPLAY,   
    SC_VEIL_SET_START_ROW,   
    SC_VEIL_SET_PAGE,   
    SC_VEIL_SET_YADDR,   
    SC_VEIL_GET_STATUSE,   
    SC_VEIL_SET_DATA,   
    SC_VEIL_GET_DATA   
};   
BYTE xdata CommandAddr[]={   
    SC_ADDR_ENABLE_DISPLAY,   
    SC_ADDR_SET_START_ROW,   
    SC_ADDR_SET_PAGE,   
    SC_ADDR_SET_YADDR,   
    SC_ADDR_GET_STATUSE,   
    SC_ADDR_SET_DATA,   
    SC_ADDR_GET_DATA   
};   
BYTE SCRead(BYTE CommandType, BYTE Sel)   
{   
    if(Sel & SC_LEFT)   
    {   
        return XBYTE[CommandAddr[CommandType] | SC_LEFT_ADDR];   
    }   
    else   
        return XBYTE[CommandAddr[CommandType] | SC_RIGHT_ADDR];   
}   
   
// 写入寄存器,根据CommandType找到相应的地址,然后value和相应的字节相或后写入   
void SCWrite(BYTE CommandType, BYTE value, BYTE Sel)   
{   
    if(Sel & SC_LEFT)   
    {   
        // 等待空闲   
        while(SCRead(SC_CMD_GET_STATUS,SC_LEFT) & SC_STATUS_BUSY);   
   
        XBYTE[CommandAddr[CommandType] | SC_LEFT_ADDR]  = value | CommandVeil[CommandType];   
    }   
   
    if(Sel & SC_RIGHT)   
    {   
        // 等待空闲   
        while(SCRead(SC_CMD_GET_STATUS,SC_RIGHT) & SC_STATUS_BUSY);   
   
        XBYTE[CommandAddr[CommandType] | SC_RIGHT_ADDR] = value | CommandVeil[CommandType];   
    }   
}   
   
   
// 初始化程序   
void SCInitial()   
{   
    //设置显示起始行为第一行   
    SCWrite(SC_CMD_SET_START_ROW, 0, SC_LEFT | SC_RIGHT);   
   
    //开显示   
    SCWrite(SC_CMD_ENABLE_DISPLAY, TRUE, SC_LEFT | SC_RIGHT);   
}   
   
// 清显示RAM   
void SCClearRAM()   
{   
    BYTE page,yaddr;   
   
    for(page = 0; page  SC_MAX_PAGE; page++)   
    {   
        // 页面地址设置   
        SCWrite(SC_CMD_SET_PAGE, page, SC_LEFT | SC_RIGHT);   
   
        // 列地址设置   
        SCWrite(SC_CMD_SET_YADDR,0, SC_LEFT | SC_RIGHT);   
   
        // 写SC_MAX_YADDR次,列地址会在每次写入以后自动增一。写入内容为0。   
        for(yaddr = 0; yaddr  SC_MAX_YADDR; yaddr++)   
        {   
            SCWrite(SC_CMD_SET_DATA, 0, SC_LEFT | SC_RIGHT);   
        }   
    }   
}   
   
// 显示半角字符。取模方式为:纵向取模,字节倒序   
// x,y是要显示的字符的坐标。一个半角字符占一个坐标单元   
// buf存放点阵。   
void SCPutHalfLattic(BYTE x, BYTE y, BYTE xdata *buf)   
{   
    BYTE page,yaddr,sel,i,nUpDown;  // sel 选择哪个半区显示,nUpDown选择半角的上半区还是下半区   
   
    // x,y倒page,yaddr的转化。一个半角需要两个page,8个yaddr   
    page =  y<<1;   
    yaddr = x<<3;   
   
    if(yaddr >= SC_MAX_YADDR)    // 右半区   
    {   
        yaddr -= SC_MAX_YADDR;   
        sel = SC_RIGHT;   
    }   
    else   
        sel = SC_LEFT;   
      
    for(nUpDown = 0; nUpDown  2; nUpDown++)   
    {   
        // 页面地址设置   
        SCWrite(SC_CMD_SET_PAGE, page + nUpDown, sel);   
   
        // 列地址设置   
        SCWrite(SC_CMD_SET_YADDR,yaddr, sel);   
   
        // 写入半角字符的上半部分   
        for(i = 0; i  8; i++, buf++)   
        {   
            SCWrite(SC_CMD_SET_DATA, *buf, sel);   
        }   
    }   
}   
// 调用这个函数以后,整个屏幕将向上移动row个象素,   
// 整个屏幕纵向总共64个象素   
void SCSetStartRow(BYTE row)   
{   
    SCWrite(SC_CMD_SET_START_ROW, row, SC_LEFT | SC_RIGHT);   
}   
   
// 点亮或者关闭液晶显示器的背光   
sbit ScBkLightPin = SC_BK_LIGHT_PIN;   
void SCEnableBkLight(BYTE bEnable)   
{   
    if(bEnable == TRUE)   
    {   
        ScBkLightPin = SC_BK_LIGHT_ENABLE;   
    }   
    else   
    {   
        ScBkLightPin = SC_BK_LIGHT_DISABLE;   
    }   
}
回复

使用道具 举报

发表于 2011-11-7 06:53 | 显示全部楼层
GloblDef.h   


/* 在所有文件中都可以应用 */


#include "stdio.h"

/* 数据类型 */
typedef unsigned char        BYTE;
typedef unsigned short        WORD;
typedef unsigned long        DWORD;

#ifndef DEBUG  
#define DEBUG  
#endif

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#ifndef NULL
#define NULL 0
#endif

#define XBYTE ((unsigned char volatile xdata *) 0)

#define BIT_NUM_OF_A_BYTE 8

#define CPU_FRE_RATIO_OF_6 4

#define NOP_INTERVAL_01US        10        //nop. ratio 为0.1us
回复

使用道具 举报

发表于 2011-11-7 06:54 | 显示全部楼层
上面是《ARM嵌入式常用模块与综合系统设计实例精讲》一书中的程序源代码,稍加修改便可应用
回复

使用道具 举报

发表于 2011-11-7 06:58 | 显示全部楼层
HY12864.C

这个是c51的 可以直接用

   

/*******************************************************************************  
功能:液晶HY12864T2显示。  
说明:显示两行字符串,words1[],words2[]。  
制作:电子科大huang_api@sina.com  
*******************************************************************************/   
#include <string.h>   
#include <reg52.h>   
#include <intrins.h>   
#include <math.h>   
   
#define uchar unsigned char     
#define uint unsigned int     
   
///////控制引脚RS为P32. RW为P33. E为P34//////////   
sbit RS = P3^2;        
sbit RW = P3^3;   
sbit E = P3^4;   
   
uchar code length[] = {"0123456789 ."};   
uchar code words1[] = {"信号源"};   
uchar code words2[] = {"电压:     V"};   
uchar code words3[] = {"电流:     A"};   
uchar code words4[] = {""};   
/****************************延时函数***************************  
名称:delay()  
输入:uchar m  
输出:无  
***************************************************************/   
void delay(uchar ms)   
{                           // 延时子程序   
    uchar i;   
    while(ms--)   
    {   
        i=250;   
        while(i--)   
        {   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
            _nop_();   
        }   
    }   
}   
   
   
/******************************LCD状态检测函数**************************************  
名称:lcd_state()  
功能:lcd状态忙碌判断  
参数:P2口为数据口  
输入:无  
输出:返回状态标志state位  
************************************************************************************/   
bit lcd_state(void)   
{                           // 测试LCD忙碌状态   
    bit state;   
    RS = 0;//command   
    RW = 1;//read   
    E = 1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    state = (bit)(P2 & 0x80);   
    E = 0;   
    return state;      
}   
   
   
/******************************LCD指令写入函数**************************************  
名称:lcd_w_cmd()  
功能:写指令到LCD数据口P2  
参数:P2口为数据口  
输入:待写指令  
输出:无  
************************************************************************************/   
void lcd_w_cmd(uchar cmd)   
{                           // 写入指令数据到LCD   
    while(lcd_state());   
    RS = 0;//command   
    RW = 0;//write      
    P2 = cmd;   
    _nop_();   
    _nop_();   
    E = 1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    E = 0;         
}   
   
/******************************LCD状态检测函数**************************************  
名称:lcd_adder()  
功能:lcd显示地址设置  
参数:P2口为数据口  
输入:一字节待设置的显示地址长度0~15  
输出:无  
************************************************************************************/   
void lcd_adder(uchar adder)   
{                           //设定显示位置   
    lcd_w_cmd(adder);   
}   
   
   
/******************************LCD数据写入函数**************************************  
名称:lcd_w_date()  
功能:写数据到LCD数据口P2  
参数:P2口为数据口  
输入:一字节待写显示数据  
输出:无  
************************************************************************************/   
void lcd_w_date(uchar dat)     
{                           //写入字符显示数据到LCD   
    while(lcd_state());   
    RS = 1;//date   
    RW = 0;//write   
    P2 = dat;   
    _nop_();   
    _nop_();   
    E = 1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    E = 0;     
}   
   
   
/******************************LCD初始化函数**************************************  
名称:lcd_init()  
功能:初始化LCD模块  
参数:初始化指令  
输入:无  
输出:无  
************************************************************************************/   
void lcd_init(void)   
{                           //LCD初始化设定   
    lcd_w_cmd(0x38);            //   
    delay(1);   
    lcd_w_cmd(0x0c);            //   
    delay(1);   
    lcd_w_cmd(0x06);            //   
    delay(1);   
    lcd_w_cmd(0x01);            //清除LCD的显示内容   
    delay(1);   
}   
   
/******************************LCD显示函数**************************************  
名称:lcd_display()  
功能:显示words1[],words2[]字符串!  
参数:P2口为数据口,*word1,*word2为待显示字符串指针,adder1,adder2为两行显示起始地址  
说明:word为待显示字符串首地址;dder为显示起始地址;str为起始显示字符的顺序位置;len_s为显示长度  
输入:待显示的数据的指针,显示地址  
输出:无  
*******************************************************************************/   
lcd_display(uchar *word,uchar adder,uchar str,uchar len_s)   
{   
        lcd_adder(adder);   //0~7   
    while(str<len_s)   
    {   
        if(word[str]=='\0')break;   
            else                    // 显示字符   
            {   lcd_w_date(word[str]);   
                str++;   
            }   
    }   
   
}   
   
   
/******************************显示字符长度测量函数*****************************  
名称:words_len()  
功能:测试显示字符串长度!  
参数:待测字符串地址为输入参数  
输入:待测试字符串的指针  
输出:字符串长度  
*******************************************************************************/   
uchar words_len(uchar *s)   
{   
    return(strlen(s));   
}   
   
   
   
/******************************显示一个单一字符函数*****************************  
名称:word_display()  
功能:显示单一一个字符  
参数:待测显示字符地址为输入参数  
输入:待显示字符的地址  
输出:无  
*******************************************************************************/   
word_display(uchar *c,uchar adder_c)   
{   
        lcd_adder(adder_c);   
        _nop_();   
        _nop_();   
        lcd_w_date(*c);   
   
}   
///////////////////////////MAIN函数//////////////////////////////////   
main()   
{   
    uchar len=0;   
    uint vol=12,ele=3;   
    uchar dat[4]={0,'.',0,'\0'};   
    lcd_init();             // 初始化LCD               
    delay(10);   
    lcd_display(&words1,0x81,0,strlen(words1));  //LCD显示   
    lcd_display(&words2,0x90,0,strlen(words2));   
    lcd_display(&words3,0x88,0,strlen(words3));   
   
    len=words_len(&words1);   
    ele*=10;   
    if(vol>9)   
        {   
            dat[0]=length[vol/10];   
            dat[2]=length[vol%10];   
            lcd_display(&dat,0x93,0,strlen(dat));   
        }   
    else //if(vol<10)   
        {   
            dat[0]=length[vol];   
            dat[2]=length[0];   
            lcd_display(&dat,0x93,0,strlen(dat));   
        }   
    if(ele>9)   
        {   
            dat[0]=length[ele/10];   
            dat[2]=length[ele%10];   
            lcd_display(&dat,0x8b,0,strlen(dat));   
   
        }   
   
    else// if(ele<10)   
        {   
            dat[0]=length[ele];   
            dat[2]=length[0];   
            lcd_display(&dat,0x8b,0,strlen(dat));         
        }   
   
    while(1) ;              //waiting     
}  

/*******************************************************************************
功能:液晶HY12864T2显示。
说明:显示两行字符串,words1[],words2[]。
制作:电子科大huang_api@sina.com
*******************************************************************************/
#include <string.h>
#include <reg52.h>
#include <intrins.h>
#include <math.h>

#define uchar unsigned char  
#define uint unsigned int  
  
///////控制引脚RS为P32. RW为P33. E为P34//////////
sbit RS        = P3^2;                 
sbit RW = P3^3;
sbit E = P3^4;

uchar code length[] = {"0123456789 ."};
uchar code words1[] = {"信号源"};
uchar code words2[] = {"电压:     V"};
uchar code words3[] = {"电流:     A"};
uchar code words4[] = {""};
/****************************延时函数***************************
名称:delay()
输入:uchar m
输出:无
***************************************************************/
void delay(uchar ms)
{                                                        // 延时子程序
        uchar i;
        while(ms--)
        {
                i=250;
                while(i--)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}


/******************************LCD状态检测函数**************************************
名称:lcd_state()
功能:lcd状态忙碌判断
参数:P2口为数据口
输入:无
输出:返回状态标志state位
************************************************************************************/
bit lcd_state(void)
{                                                        // 测试LCD忙碌状态
        bit state;
        RS = 0;//command
        RW = 1;//read
        E = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        state = (bit)(P2 & 0x80);
        E = 0;
        return state;         
}


/******************************LCD指令写入函数**************************************
名称:lcd_w_cmd()
功能:写指令到LCD数据口P2
参数:P2口为数据口
输入:待写指令
输出:无
************************************************************************************/
void lcd_w_cmd(uchar cmd)
{                                                        // 写入指令数据到LCD
        while(lcd_state());
        RS = 0;//command
        RW = 0;//write         
        P2 = cmd;
        _nop_();
        _nop_();
        E = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        E = 0;                 
}

/******************************LCD状态检测函数**************************************
名称:lcd_adder()
功能:lcd显示地址设置
参数:P2口为数据口
输入:一字节待设置的显示地址长度0~15
输出:无
************************************************************************************/
void lcd_adder(uchar adder)
{                                                        //设定显示位置
        lcd_w_cmd(adder);
}


/******************************LCD数据写入函数**************************************
名称:lcd_w_date()
功能:写数据到LCD数据口P2
参数:P2口为数据口
输入:一字节待写显示数据
输出:无
************************************************************************************/
void lcd_w_date(uchar dat)         
{                                                        //写入字符显示数据到LCD
        while(lcd_state());
        RS = 1;//date
        RW = 0;//write
        P2 = dat;
        _nop_();
        _nop_();
        E = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        E = 0;         
}


/******************************LCD初始化函数**************************************
名称:lcd_init()
功能:初始化LCD模块
参数:初始化指令
输入:无
输出:无
************************************************************************************/
void lcd_init(void)
{                                                        //LCD初始化设定
        lcd_w_cmd(0x38);                        //
        delay(1);
        lcd_w_cmd(0x0c);                        //
        delay(1);
        lcd_w_cmd(0x06);                        //
        delay(1);
        lcd_w_cmd(0x01);                        //清除LCD的显示内容
        delay(1);
}

/******************************LCD显示函数**************************************
名称:lcd_display()
功能:显示words1[],words2[]字符串!
参数:P2口为数据口,*word1,*word2为待显示字符串指针,adder1,adder2为两行显示起始地址
说明:word为待显示字符串首地址;dder为显示起始地址;str为起始显示字符的顺序位置;len_s为显示长度
输入:待显示的数据的指针,显示地址
输出:无
*******************************************************************************/
lcd_display(uchar *word,uchar adder,uchar str,uchar len_s)
{
                lcd_adder(adder);        //0~7
        while(str<len_s)
        {
                if(word[str]=='\0')break;
                        else                                        // 显示字符
                        {        lcd_w_date(word[str]);
                                str++;
                        }
        }

}


/******************************显示字符长度测量函数*****************************
名称:words_len()
功能:测试显示字符串长度!
参数:待测字符串地址为输入参数
输入:待测试字符串的指针
输出:字符串长度
*******************************************************************************/
uchar words_len(uchar *s)
{
        return(strlen(s));
}



/******************************显示一个单一字符函数*****************************
名称:word_display()
功能:显示单一一个字符
参数:待测显示字符地址为输入参数
输入:待显示字符的地址
输出:无
*******************************************************************************/
word_display(uchar *c,uchar adder_c)
{
                lcd_adder(adder_c);
                _nop_();
                _nop_();
                lcd_w_date(*c);

}
///////////////////////////MAIN函数//////////////////////////////////
main()
{
        uchar len=0;
        uint vol=12,ele=3;
        uchar dat[4]={0,'.',0,'\0'};
        lcd_init();                                // 初始化LCD                         
        delay(10);
        lcd_display(&words1,0x81,0,strlen(words1));  //LCD显示
        lcd_display(&words2,0x90,0,strlen(words2));
        lcd_display(&words3,0x88,0,strlen(words3));

        len=words_len(&words1);
        ele*=10;
        if(vol>9)
                {
                        dat[0]=length[vol/10];
                        dat[2]=length[vol%10];
                        lcd_display(&dat,0x93,0,strlen(dat));
                }
        else //if(vol<10)
                {
                        dat[0]=length[vol];
                        dat[2]=length[0];
                        lcd_display(&dat,0x93,0,strlen(dat));
                }
        if(ele>9)
                {
                        dat[0]=length[ele/10];
                        dat[2]=length[ele%10];
                        lcd_display(&dat,0x8b,0,strlen(dat));

                }

        else// if(ele<10)
                {
                        dat[0]=length[ele];
                        dat[2]=length[0];
                        lcd_display(&dat,0x8b,0,strlen(dat));                 
                }

        while(1) ;                                //waiting  
}
回复

使用道具 举报

 楼主| 发表于 2011-11-7 12:49 | 显示全部楼层
好全啊  谢谢了啊   研究一下看能制作一个 12864液晶的 电子表不  估计很难~~
回复

使用道具 举报

发表于 2011-11-16 19:42 | 显示全部楼层
研究一下
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-5 05:18 , Processed in 0.033373 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表