本帖最后由 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)
|
|