打印
[菜农助学交流]

第五批 学习笔记第二篇——LCM(带液晶资料及工程)

[复制链接]
2773|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiaoweixu 于 2012-2-22 15:53 编辑

又研究了助学板好多天,现在终于对M0编程有点熟悉了。正好手头有一个12864液晶,研究了好几天,终于显示出字来了!!首先手头的12864液晶是20针的,大叔的接口是18针的,两种接口的定义还不一样,很是头疼啊。思来想去,还是改一下板子吧,毕竟板子还好改些于是对板子做手术来适应液晶吧。液晶的资料我附在后面。
板子上M0的管脚已经用了好多,为了节约管脚资源,单片机和LCM的通信使用串行。
LCD_CS接E_GPA,8 ;   
LCD_STD接E_GPA,7 ;
LCD_EN接E_GPA,6 ;
LCD_RST接E_GPA,5 ;

再接好电源,LCM就能工作了。
现在贴出显示源代码:
主函数:
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvADC.h"
#include "DrvGPIO.h"
#include "DrvUART.h"
#include "DrvSYS.h"
#include "ds18b20.h"

int main (void)
{
        UNLOCKREG();                                                                                                                 //  芯片注册解锁
    SYSCLK->;PWRCON.XTL12M_EN = 1;                                                                                 //  设定12M外部晶振

    DrvSYS_Delay(5000);                                                                                                         //  等待时钟就绪
        LOCKREG();                                                                                                                         //向“0x5000_0100”写入任何值,就可以重锁保护寄存器

//---------------------------------------------------------                                 // 系统初始化

        DrvGPIO_Open(E_GPA, 9, E_IO_OUTPUT);
        DrvGPIO_Open(E_GPA, 8, E_IO_OUTPUT);                                                        
        DrvGPIO_Open(E_GPA, 7, E_IO_OUTPUT);                                                                 
        DrvGPIO_Open(E_GPA, 6, E_IO_OUTPUT);                                                         
        DrvGPIO_Open(E_GPA, 5, E_IO_OUTPUT);
        DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);                                                                 //  设置GPB10端口为输出模式
        DrvGPIO_Open(E_GPA, 9, E_IO_OUTPUT);
        DrvGPIO_ClrBit(E_GPB, 10);               
        DrvSYS_Delay(6000);
        LCMInit();

        Chn_disp_char("祝大家龙年大吉",1,1)   ;
        Chn_disp_char("祝大叔的助学园地",2,1)   ;
        Chn_disp_char("越办越火!",3,1)   ;
        Chn_disp_char("      By Xiaowei",4,1)   ;

}


LCM.h
//用于TG12864
//串口通信
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#define LCD_CS           E_GPA,8 ;
#define LCD_STD           E_GPA,7 ;
#define LCD_EN                 E_GPA,6 ;
#define LCD_RST                 E_GPA,5 ;

#define                FirstLine_Start                0x80
#define                SecondLine_Start        0x90
#define                ThirdLine_Start                0x88
#define                FourthLine_Start        0x98
#define         comm_flag  0
#define         data_flag  1

void WriteLCM(int32_t data_comm,int32_t in_com)           ;
void LCMInit(void)                                                                        ;
void Chn_disp_char( char *chn, int32_t line_pos, int32_t dis_pos) ;
void Digtal_disp( int32_t digt, int32_t line_pos, int32_t dis_pos) ;

LCM.c

/////////////////////////////////////////////////////////////////////////////////////////////
//LCM显示程序
//2011.12.30 by xiaowei
/////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "lcm.h"
void WriteLCM(int32_t data_comm,int32_t in_com)                        //1 for data,0 for comm
{  
   int32_t com,i,j,std;
       DrvSYS_Delay(100);
   com = in_com;
                          DrvGPIO_SetBit( E_GPA,8 );  //LCD_CS = 1;

                  DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
                     DrvGPIO_SetBit(E_GPA,7);//LCD_STD = 1;
                 for(i=5;i>0;i--)
                        {
                          DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
                        DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;                        
                        }

                          DrvGPIO_ClrBit(E_GPA,7);//LCD_STD = 0;
                           DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
                        DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;

                        if(data_comm==1)
                                DrvGPIO_SetBit(E_GPA,7);//LCD_STD = 1;
                        else
                            DrvGPIO_ClrBit(E_GPA,7);//LCD_STD = 0;
                           DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
                        DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;

                              DrvGPIO_ClrBit(E_GPA,7);//LCD_STD = 0;
                        DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
                        DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  
        for(j=2;j>0;j--)
        {
                for(i=4;i>0;i--)
                {
                        
                        std=com&0x80;
                        if(std==0x80)
                                DrvGPIO_SetBit(E_GPA,7);   //LCD_STD = 1;        
                        else
                                DrvGPIO_ClrBit(E_GPA,7);   //LCD_STD = 0;        
                                com=com<<1;
                        DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
                        DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
                }
                DrvGPIO_ClrBit(E_GPA,7);   //LCD_STD = 0;
                for(i=4;i>0;i--)
                {
                        DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
                        DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
                }
        }
}
////////////////////////////////////////////////////////////////////////////////
void LCMInit(void)                //LCM初始化
{
        DrvGPIO_ClrBit(E_GPA,5 );
    DrvSYS_Delay(6000);
         DrvGPIO_SetBit(E_GPA,5 );  
    WriteLCM(0,0x30)        ;                         //设接口数据位数(DL),显示行数(L),及字型(F)
    DrvSYS_Delay(6000);
        WriteLCM(0,0x01)        ;                 //清屏指令
    DrvSYS_Delay(6000);        
        WriteLCM(0,0x0c)        ;           //设整体显示开关(D),光标开关关(C),及光标位的字符不闪耀(B)
    DrvSYS_Delay(6000);
        WriteLCM(0,0x06)        ;           //7设光标移动方向并指定整体显示是否移动
    DrvSYS_Delay(6000);
        WriteLCM(0,0x01)        ;                //清屏指令
    DrvSYS_Delay(6000);         
        WriteLCM(0,0x80)        ;                //设DDRAM地址,设置后DDRAM数据被发送和接收
}
/////////////////////////////////////////////////////////////////////////
//写汉字
//输入char[]={"显示的字"},行数,列数                                显示数字时,如果列数为0,则接着显示
void        Chn_disp_char( char *chn, int32_t line_pos, int32_t dis_pos)
{
char i=0,Start_pos;
        WriteLCM (comm_flag,0x30);
        switch(line_pos)
        {
                case 1:
                        Start_pos=FirstLine_Start;
                        break;
                case 2:
                        Start_pos=SecondLine_Start;
                        break;               
                case 3:
                        Start_pos=ThirdLine_Start;
                        break;
                case 4:
                        Start_pos=FourthLine_Start;
                        break;        
        }
        if(dis_pos!=0)
                WriteLCM (comm_flag,(Start_pos+dis_pos-1));
    while(chn!='\0')
    {
                   WriteLCM (data_flag,chn);
            i++;
        }
}

////////////////////////////////////////////////////////
//写数字
//输入 (数字,行数,列数)
void        Digtal_disp( int32_t digt, int32_t line_pos, int32_t dis_pos)
{
        char digt_ []={""};
        sprintf(digt_,"%.2d",digt);
        Chn_disp_char(digt_,line_pos,dis_pos);
}
/////////////////////////////////////////////////////////////////
TG12864E.pdf (211.94 KB)

LCM.rar (2.88 MB)

相关帖子

沙发
lixiaoxu2meng| | 2012-2-7 07:34 | 只看该作者
不错顶

使用特权

评论回复
板凳
cnjxlxp| | 2012-2-7 16:03 | 只看该作者
能不能把工程打包上来呢?我这几天在用MINI51驱动LM3037搞了几天都还么有搞出显示来

使用特权

评论回复
地板
xiaoweixu|  楼主 | 2012-2-22 15:52 | 只看该作者
工程已经打包发上来了

使用特权

评论回复
5
xyz549040622| | 2012-2-23 14:16 | 只看该作者
哈哈,飞线

使用特权

评论回复
6
xiaoweixu|  楼主 | 2012-3-3 19:51 | 只看该作者
为了直接接液晶,只好飞线了

使用特权

评论回复
7
gzh19680820| | 2013-1-6 17:56 | 只看该作者
谢谢分享!!!!!!!!!!!!

使用特权

评论回复
8
zhbbhz| | 2013-1-8 08:06 | 只看该作者
顶,感谢分享!

使用特权

评论回复
9
zhao00010001| | 2013-11-19 12:53 | 只看该作者
学习了,顶!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

113

帖子

1

粉丝