标题:我来贴个12864LCD显示屏驱动程序来提提人气
只看楼主
一起补天
Rank: 2
等 级:论坛游民
帖 子:73
专家分:61
注 册:2008-9-19
结帖率:25%
已结贴  问题点数:0 回复次数:6 
我来贴个12864LCD显示屏驱动程序来提提人气
这个驱动程序适合ARM7213x和214x开发板,用的是GPIO控制,没用SPI。仅供大家娱乐消遣,有更好的也请贴出来分享一下,见笑了各位~~~~

.h文件是
#ifndef _LCD12864_H_
#define _LCD12864_H_
#define SCK  1<<1
#define SID  1<<0

extern void LCDData(unsigned char ucByte);        //写数据
extern void LCDCmd(unsigned char ucCommand);        //写命令
extern void LCDInit(void);                      //初始化
extern void LCDDisplayStr(unsigned char row,  char *LcmDat,unsigned char length);
extern void LCDSendData(uint8 uiData);
extern void DelayNS (uint32  uiDly);
extern void DisplayStr(unsigned char row, char *LcmDat,unsigned char length);
#endif



.c文件是

#include "config.H"
#include "LCD12864.H"
/*********************************************************************************************************
** Function name:        DelayNS
** Descriptions:        长软件延时
** input parameters:    uiDly延时控制值,值越大,延时越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void DelayNS (uint32  uiDly)
{
    uint32  i;
   
    for(; uiDly > 0; uiDly--){
        for(i = 0; i < 50000; i++);
    }
}

/*==============================================================================
函 数 名 : WriteDataToLcd()
函数功能 : 向LCD的数据RAM写一个字节的数据.
入口参数 : ucByte ---- 要写的字节.
返回参数 : 无
==============================================================================*/
void LCDData(unsigned char ucByte)
{
    LCDSendData(0xFA);                // 同步数据
    LCDSendData(ucByte & 0xf0);        // 高半字节
    LCDSendData(ucByte << 4);        // 低半字节
}

/*==============================================================================
函 数 名 : WriteCommandToLcd()
函数功能 : 向LCD写一条指令.
入口参数 : ucCommand ---- 要写的指令.
返回参数 : 无
==============================================================================*/
void LCDCmd(unsigned char ucCommand)
{
    LCDSendData(0xF8);                    // 同步数据
    LCDSendData(ucCommand & 0xf0);        // 高半字节
    LCDSendData(ucCommand << 4);        // 低半字节
}

/*==============================================================================
函 数 名 : InitLcd()
函数功能 : 初始化LCD12864.
入口参数 : 无
返回参数 : 无
==============================================================================*/
void LCDInit(void)
{   
    PINSEL0 = PINSEL0&(~0x0F);
    IO0DIR = IO0DIR|SCK|SID;
   
    LCDCmd(0x01);        
    DelayNS(20);
    LCDCmd(0x02);        
    DelayNS(20);
    LCDCmd(0x06);        
    DelayNS(20);
    LCDCmd(0x0C);    
    DelayNS(20);
    LCDCmd(0x30);    
    DelayNS(20);
        
    
}
/*==============================================================================
函 数 名 : LCDDisplayStr()
函数功能 : 在LCD的某一行上显示汉字
入口参数 : row             第几行
           *LcmDat         显示的汉字内容
           length        内容长度
返回参数 : 无
==============================================================================*/

void LCDDisplayStr(unsigned char row, char *LcmDat,unsigned char length)
{
      unsigned char i;
      switch(row)
    {
        case 1 : LCDCmd(0x80);break;
        case 2 : LCDCmd(0x90);break;
          case 3 : LCDCmd(0x88);break;
        case 4 : LCDCmd(0x98);break;
    }
    DelayNS(5);
    for (i = 0 ; i< length ; i++)
    {
         LCDData( *LcmDat);
        LcmDat++ ;
    }
}
/*==============================================================================
函 数 名 : LCDDisplayStr()
函数功能 : 在LCD的某一行上显示汉字
入口参数 : row             位置
           *LcmDat         显示的内容
           length        内容长度
返回参数 : 无
==============================================================================*/

void DisplayStr(unsigned char rew, char *LcdDat,unsigned char lenth)
{
      unsigned char i;
    LCDCmd(rew);
    DelayNS(5);
    for (i = 0 ; i< lenth ; i++)
    {
         LCDData( *LcdDat);
        LcdDat++ ;
    }
}
/*==============================================================================
函 数 名 : LCDSendData()
函数功能 : 发送数据
入口参数 : 要发送地数据
返回参数 : 无
==============================================================================*/

void LCDSendData(uint8 uiData)
{
         uint8 i;
        
         for(i=0;i<8;i++)
         {
                IO0CLR = SCK;
              if((uiData&0x80)==0x80)
              IO0SET = SID;
              else
              IO0CLR = SID;
              IO0SET = SCK;
              uiData=uiData<<1;
         }
}
搜索更多相关主题的帖子: 显示屏 人气 驱动 
2009-07-30 19:53
Chi
Rank: 2
等 级:论坛游民
帖 子:5
专家分:14
注 册:2009-8-26
得分:14 
不错,很有抛砖引玉的作用。
看着代码,感觉LCD就像串口设备一样
2009-08-26 07:58
燕大一狼
Rank: 2
等 级:论坛游民
帖 子:14
专家分:17
注 册:2009-10-3
得分:0 
我也学习当中,一起讨论下,这个版块很冷清啊
2009-10-29 23:33
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
得分:0 
这个驱动应该是用I2C接口的屏吧,每次发8位数据,屏分辨率应该不是很大吧,要不然肯定很慢的
我来贴个I2C 读写通用代码


#define MAINLCD_RESET_PIN              30
#define MAINLCD_CLK_PIN                48
#define MAINLCD_DATA_PIN               47
#define MAINLCD_SLAVE_ADR              0x78

#define MAINLCD_MAX_ROW                128
#define MAINLCD_MAX_COL                128


#define SET_MAINLCD_CLK_OUTPUT            GPIO_InitIO(1,MAINLCD_CLK_PIN)
#define SET_MAINLCD_DATA_OUTPUT            GPIO_InitIO(1,MAINLCD_DATA_PIN)
#define SET_MAINLCD_DATA_INPUT            GPIO_InitIO(0,MAINLCD_DATA_PIN)
#define SET_MAINLCD_CLK_HIGH                GPIO_WriteIO(1,MAINLCD_CLK_PIN)
#define SET_MAINLCD_CLK_LOW                GPIO_WriteIO(0,MAINLCD_CLK_PIN)
#define SET_MAINLCD_DATA_HIGH                GPIO_WriteIO(1,MAINLCD_DATA_PIN)
#define SET_MAINLCD_DATA_LOW                GPIO_WriteIO(0,MAINLCD_DATA_PIN)
#define GET_MAINLCD_DATA_BIT                GPIO_ReadIO(MAINLCD_DATA_PIN)

#define SET_MAINLCD_RESET_OUTPUT            GPIO_InitIO(1,MAINLCD_RESET_PIN)
#define SET_MAINLCD_RESET_HIGH            GPIO_WriteIO(1,MAINLCD_RESET_PIN)
#define SET_MAINLCD_RESET_LOW            GPIO_WriteIO(0,MAINLCD_RESET_PIN)

#ifdef MCU_104M
    #define MAINLCD_I2C_DELAY                            0x00 // 0x60           
#else
    #define MAINLCD_I2C_DELAY                            0x00  // 0x10
#endif

#define MAINLCDRESET \
{ \
    volatile kal_uint32 j;\
    SET_MAINLCD_RESET_OUTPUT;\
    SET_MAINLCD_CLK_OUTPUT; \
    SET_MAINLCD_DATA_OUTPUT; \
    SET_MAINLCD_CLK_HIGH; \
    SET_MAINLCD_DATA_HIGH; \
    SET_MAINLCD_RESET_LOW;\
    for(j=0;j<MAINLCD_I2C_DELAY;j++);\
    SET_MAINLCD_RESET_HIGH;\
    for(j=0;j<MAINLCD_I2C_DELAY;j++);\
}
 
#define MAINLCDI2C_START_TRANSMISSION \
{ \
    volatile kal_uint32 j; \
    SET_MAINLCD_CLK_OUTPUT; \
    SET_MAINLCD_DATA_OUTPUT; \
    SET_MAINLCD_CLK_HIGH; \
    SET_MAINLCD_DATA_HIGH; \
    for(j=0;j<MAINLCD_I2C_DELAY;j++);\
    SET_MAINLCD_DATA_LOW; \
    for(j=0;j<MAINLCD_I2C_DELAY;j++);\
    SET_MAINLCD_CLK_LOW; \
}

#define MAINLCDI2C_STOP_TRANSMISSION \
{ \
    volatile kal_uint32 j; \
    SET_MAINLCD_CLK_OUTPUT; \
    SET_MAINLCD_DATA_OUTPUT; \
    SET_MAINLCD_CLK_LOW; \
    SET_MAINLCD_DATA_LOW; \
    for(j=0;j<MAINLCD_I2C_DELAY;j++);\
    SET_MAINLCD_CLK_HIGH; \
    for(j=0;j<MAINLCD_I2C_DELAY;j++);\
    SET_MAINLCD_DATA_HIGH; \
}

void MAINLCD_send_byte(kal_uint8 send_byte)
{
    volatile signed char i;
    volatile kal_uint32 j;

    for (i=7;i>=0;i--)
    {    /* data bit 7~0 */
        if (send_byte & (1<<i))
        {
            SET_MAINLCD_DATA_HIGH;
        }
        else
        {
            SET_MAINLCD_DATA_LOW;
        }
        for(j=0;j<MAINLCD_I2C_DELAY;j++);
        SET_MAINLCD_CLK_HIGH;
        for(j=0;j<MAINLCD_I2C_DELAY;j++);
        SET_MAINLCD_CLK_LOW;
        for(j=0;j<MAINLCD_I2C_DELAY;j++);
    }
    /* don't care bit, 9th bit */
    SET_MAINLCD_DATA_LOW;
    SET_MAINLCD_DATA_INPUT;
    SET_MAINLCD_CLK_HIGH;
    for(j=0;j<MAINLCD_I2C_DELAY;j++);
    SET_MAINLCD_CLK_LOW;
    SET_MAINLCD_DATA_OUTPUT;
}   


/*
    MAIN LCD use IIC
    read one byte
*/
kal_uint8 MAINLCD_get_byte(void)
{
    volatile signed char i;
    volatile kal_uint32 j;
    kal_uint8 get_byte=0;

    SET_MAINLCD_DATA_INPUT;

    for (i=7;i>=0;i--)
    {    /* data bit 7~0 */
        SET_MAINLCD_CLK_HIGH;
        for(j=0;j<MAINLCD_I2C_DELAY;j++);
        if (GET_MAINLCD_DATA_BIT)
            get_byte |= (1<<i);
        for(j=0;j<MAINLCD_I2C_DELAY;j++);
        SET_MAINLCD_CLK_LOW;
        for(j=0;j<MAINLCD_I2C_DELAY;j++);
    }
    /* don't care bit, 9th bit */
    SET_MAINLCD_DATA_OUTPUT;
    SET_MAINLCD_DATA_HIGH;
    for(j=0;j<MAINLCD_I2C_DELAY;j++);
    SET_MAINLCD_CLK_HIGH;
    for(j=0;j<MAINLCD_I2C_DELAY;j++);
    SET_MAINLCD_CLK_LOW;

    return get_byte;
}

如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2010-01-29 11:13
万里独行
Rank: 1
来 自:襄樊
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-3-7
得分:0 
现在还看不懂,不久的以后,我想应该就看得懂了。
2010-04-03 15:36
tl86923
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-8-29
得分:0 
回复 楼主 一起补天
谢谢楼主的分享,看了很有收获
2010-08-29 11:01
mobilephone
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-1-29
得分:0 
正在PIC mcu上面调试I2C接口的128*64 lcm。就是flash太小,没地方放字库
2012-01-29 22:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-281076-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.537115 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved