📄 jj12864.c
字号:
#include "config.h" //头函数
#define lcd 10
#define LCM_Data (0xff<<16) //P1.16~P1.23
#define LCM_E (1<<27) //P0.27
#define LCM_RW (1<<26) //P0.26
#define LCM_RS (1<<25) //P0.25
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
unsigned char code BMP1[] = {图形}
unsigned char code HZ1[]={0x10,0x08,0x0B,0xFC,0x40,0x88,0x22,0x8C,
0x0A,0x8A,0x54,0x88,0x21,0x08,0x22,0x28,
0x25,0x10,0x01,0x04,0xFF,0xFE,0x05,0x40,
0x09,0x20,0x11,0x1C,0x61,0x08,0x01,0x00};
unsigned char code HZ2[]={0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,
0x03,0x80,0x05,0x40,0x09,0x20,0x11,0x10,
0x21,0x0E,0xC1,0x04,0x01,0x00,0x00,0x00,
0x24,0x90,0x22,0x48,0x22,0x44,0x40,0x04
};
unsigned char code HZ3[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,
0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,
0x08,0x10,0x10,0x0E,0x60,0x04,0x00,0x00 };
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void ding(unsigned char Page, unsigned char Col, unsigned char code *w);
void delay(unsigned int MS);
void Lcd12864_Location_XY(unsigned char x,unsigned char y);
void lcd_12864_clr(void);
void Display(unsigned char dd );
void PHO_DISP(unsigned char code *s);
void lcd_12864_16x16(unsigned char x,unsigned char y,unsigned char code *w);
void main(void)
{
unsigned char z;
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000000;//set P000~P031 to GPIO
PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIO
//PINSEL2 = PINSEL2 & (~0x0C);// P1[31:16]连接GPIO,但占用了〔31:26〕JTAG仿真口
IO0DIR = 0xFFFFFFFF; // 设置P0控制口为输出
IO1DIR = 0xFFFFFFFF; //set port P1 out
delay(400); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
delay(5); //延时片刻(可不要)
z=0x80;
hanzi();
}
/*=======================================================
库汉字显示
=======================================================*/
void hanzi(unsigned char X,unsigned char Y,uint8 *DData)
{
unsigned char ListLength;
ListLength = 0;
WriteCommandLCM(Y,1); //限制X不能大于15,Y不能大于1
while (mao[ListLength]!='\0') //若到达字串尾则退出,字符长度小于32
{
WriteDataLCM(mao[ListLength]);
ListLength++;
delay(400);
Y++;if(Y>0x9f)Y=0x80;
}
WriteCommandLCM(0x0c,1);
}
/*======================================================
点阵汉字显示
=======================================================*/
void ding(unsigned char Page,unsigned char Col,unsigned char code *w)
{ unsigned char shu,ju;
shu=0x10;
for(;shu!=0;shu--)
{
WriteCommandLCM(0x34,1);
WriteCommandLCM(Page,1);
WriteCommandLCM(Col,1);
WriteCommandLCM(0x30,1);
ju=0x02;
for(;ju!=0;ju--)
{
WriteDataLCM(*w++);
}
Page+=1;
}}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
uint32 temp;
temp = WDLCM<<16;
ReadStatusLCM();//检测忙
IO0SET=LCM_RS;
IO0CLR=LCM_RW;
IO1CLR = LCM_Data;
IO1SET = temp;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
uint32 temp;
if(BuysC)ReadStatusLCM();//根据需要检测忙
temp = WCLCM<<16;
IO1DIR=0xff<<16;//set lcd8 out
IO0CLR=LCM_RS;
IO0CLR=LCM_RW;
IO1CLR = LCM_Data;
IO1SET = temp;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
}
//读数据
unsigned char ReadDataLCM(void)
{
uint8 pdata;
IO1DIR=0x00<<16;
IO0SET=LCM_RS;
IO0SET=LCM_RW;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
pdata=IO1PIN>>16;
IO1DIR=0xff<<16;
return(pdata);
}
//读状态
unsigned char ReadStatusLCM(void)
{
uint8 pdata;
IO1DIR=0x00<<16;
IO0CLR=LCM_RS;
IO0SET=LCM_RW;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
pdata=IO1PIN >>16;
while( pdata&Busy);//检测忙信号
IO1DIR=0xff<<16;
return(pdata);
}
/*=======================================================
LCD初始化
=======================================================*/
void LCMInit(void) //LCM初始化
{
IO1CLR=LCM_Data;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0F,1); // 显示开及光标设置
lcd_12864_clr();
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
//x表示列、y 表示行
{
Y &= 0x03;
X &= 0x07;
switch(Y)
{
case 0:
Y=0x80;break;
case 1:
Y=0x90;break;
case 2:
Y=0x88;break;
case 3:
Y=0x98;break;
default:break;
}
WriteCommandLCM(Y+X,1);
WriteDataLCM(DData);
}
/*=======================================================
延时
=======================================================*/
void delay(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0)
{
usn = 2; //for 12M
while(usn!=0)
{
us=0xf6;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/*=======================================================
显示光标定位
=======================================================*/
void Lcd12864_Location_XY(unsigned char x,unsigned char y)
{
y &= 0x03;
x &= 0x07;
switch(y)
{
case 0:
y=0x80;break;
case 1:
y=0x90;break;
case 2:
y=0x88;break;
case 3:
y=0x98;break;
default:break;
}
WriteCommandLCM(y+x,1);
}
//**********显示图形子程序*********************
void PHO_DISP(unsigned char code *s)
{
unsigned char Page; //行 地址
unsigned char Col; //列 地址 用于返回第二行
unsigned char COUNT1,COUNT2,COUNT3;
COUNT3=0X02; //上下片
Col=0X80; //上片首地址
for (;COUNT3!=0;COUNT3--)
{
Page=0X80; //小行的地址.一直加,到下片时,保持连续`不用变值
COUNT2=0X20; //每片32行扫描
for (;COUNT2!=0;COUNT2--)
{
COUNT1=0X10; //16组8点阵=128点
WriteCommandLCM(0x34,1);
WriteCommandLCM(Page,1);
WriteCommandLCM(Col,1);
WriteCommandLCM(0x30,1);
for (;COUNT1!=0;COUNT1--)
{
WriteDataLCM(*s++);
}
Page+=1;
}
Col=0X88; //下片首地址
}
WriteCommandLCM(0x36,1);
delay(20);
WriteCommandLCM(0x30,1);
WriteCommandLCM(0x0C,1);
}
void lcd_12864_clr(void)
{ unsigned char Page; //行 地址
unsigned char Col; //列 地址
unsigned char COUNT1,COUNT2,COUNT3;
COUNT3=0X02;
Col=0X80;
for (;COUNT3!=0;COUNT3--)
{
Page=0X80;
COUNT2=0X20;//32
for (;COUNT2!=0;COUNT2--)
{
COUNT1=0X10;//16
WriteCommandLCM(0x34,1);
WriteCommandLCM(Page,1);
WriteCommandLCM(Col,1);
WriteCommandLCM(0x30,1);
for (;COUNT1!=0;COUNT1--)
{
WriteDataLCM(0x00);
}
Page+=1;
}
Col=0X88;
}
WriteCommandLCM(0x36,1);
delay(20);
WriteCommandLCM(0x30,1);
WriteCommandLCM(0x0C,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -