#include "config.h" const uint32 rst=1; //resrt const uint32 rs=1<<1 ; //H=data; L=command; const uint32 rw=1<<4 ; //H=read; L=write; const uint32 e=1<<5 ; //input enable; const uint32 busy=1<<25 ; // test busy const uint32 DB8=(0xFF<<18); // P1[25:18]控制D0-D7, #define uint unsigned int #define uchar unsigned char #define comm 0 #define dat 1 void wr_lcd(uchar dat_comm,uchar content); void chk_busy (void); uchar tab1[]={ "本系列中文模块内" "任意位置反白显示" "置二级字库,可在" "使用更方便更灵活" }; /*------------------初始化-----------------*/ void init_lcd(void) { IO0SET=rst; wr_lcd(comm,0x30); /*30---基本指令动作*/ wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/ wr_lcd(comm,0x06); /*光标的移动方向*/ wr_lcd(comm,0x0c); /*开显示,关游标*/ } /*---------------显示汉字或字符----------------*/ void chn_disp(uchar *chn) { uchar i,j; wr_lcd (comm,0x30); //30,基本指令集 wr_lcd (comm,0x80); //80,从第一行第一列开始显示 for (j=0;j<4;j++) { for(i=0;i<16;i++) wr_lcd(dat,chn[j*16+i]); } } /*--------------写数据和指令-----------------*/ void wr_lcd(uchar dat_comm,uchar content) { uint i; chk_busy (); if(dat_comm) { IO0SET=rs; //data IO0CLR=rw; //write } else { IO0CLR=rs; //command IO0CLR=rw; //write } IO1PIN=content<<18; //write data or comm IO0SET=e; //模拟使能E下降沿 for (i=0; i<0xFFFF; i++); IO0CLR=e; } /*--------------检验忙信号-----------------*/ void chk_busy(void) { uint i; IO0CLR=rs; //读取忙信号 IO0SET=rw; IO0SET=e; for (i=0; i<0xFFFF; i++); while((IO1PIN&busy)==1); IO0CLR=e; for (i=0; i<0xFFFF; i++); } /*------------------主程序--------------------*/ int main(void) { uint i; PINSEL0 = 0x00000000; PINSEL2 = PINSEL2 & (~0x08); // P1[25:18]连接GPIO IO0DIR = 0xff; // 设置0口为输出 IO1DIR = DB8; // 设置DB控制口为输出 init_lcd(); chn_disp(tab1); for (i=0; i<0xFFFFFF; i++); return 0; }