📄 lcm12864zk.c
字号:
/*
;************************************************************************************************************
;* 湖南华盛科技有限公司
;* 研 发 部
;*
;* http://www.unistrong.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;*
;* 文件名称 :Lcm12864zk.c
;* 文件功能 :LCM驱动程序
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : 研 发 部
;* 修改日期 : 2005/11/29
;* 版本声明 : V1.0.1
;************************************************************************************************************
;*/
/****和硬件总线相关定义********/
#define E 0x00000100 /*E脚对应P2.8*/
#define RW 0x00000200 /*EW脚对应P2.9*/
#define RS 0x00000400 /*RS脚对应P2.10*/
#define BG 0x00000001 /*背光对应P2.0*/
#define PSB 0x00020000/*PSB脚对应P0.17*/
#define RST 0x00008000/*RST脚对应P0.15*/
#define NC 0x00010000/*NC脚对应P0.16*/
#define DATA_PORTA 0x000000fe/*D0_6对应P2.7_P2.1*/
#define DATA_PORTB 0x00100000/*D7对应P1.20*/
#define _GLOBAL_LCD
#include "INCLUDES.h"
/*
*************************************************************************************************************
- 函数名称 : Delayus(uint8 t)
- 函数说明 : 延时函数
- 输入参数 : uint8 t
- 输出参数 : 无
*************************************************************************************************************
*/
void Delay_Lcd(uint8 t)/*t 为1是1us*/
{
uint8 i,j;
for (i=0;i<t;i++)
for (j=0;j<16;j++);
}
/*
*************************************************************************************************************
*************************************************************************************************************
- 函数名称 : Data_Shift(uint8 data,uint8 bit_hight,uint8 bit_hight)
- 函数说明 : 数据调整
- 输入参数 : uint8 data,uint8 bit_hight,uint8 bit_hight
- 输出参数 : uint8 temp
*************************************************************************************************************
*/
uint8 Data_Shift(uint8 data,uint8 bit_right,uint8 bit_left)
{uint8 temp;
uint8 left_pointer,right_pointer;
temp=0;
left_pointer=bit_left;
right_pointer=bit_right;
while(left_pointer!=right_pointer)
{if(data&(0x01<<left_pointer))
temp|=(0x80>>(7-right_pointer));
if(data&(0x80>>(7-right_pointer)))
temp|=(0x01<<left_pointer);
left_pointer++;
right_pointer--;
}
return temp;
}
/*
*************************************************************************************************************
- 函数名称 : Write_command(Uchar CMD,Uchar bb)
- 函数说明 : LCM写命令函数
- 输入参数 : uint8 CMD 命令内容
-
- 输出参数 : 无
*************************************************************************************************************
*/
void Write_command(uint8 CMD)
{ int8 st;
uint8 t=0x40;
uint8 j=0x02;
uint8 i;
/*转换数据格式*/
for(i=0;i!=7;i++)
{if((CMD&t)!=0)
st|=j;
else
st&=(~j);
t>>=1;
j<<=1;
}
IO2CLR=RS;
IO2CLR=RW;
IO2SET=E;
/*送p1.20(最高位)*/
if((CMD&0x80)!=0)
IO1SET|=DATA_PORTB;/*p1.20置1*/
else
IO1CLR|=DATA_PORTB;/*p1.20清0*/
/*送低七位*/
IO2SET|=(st&0xfe);
IO2CLR=((~st)&0xfe);
Delay_Lcd(20);
IO2CLR=E;
Delay_Lcd(100);/*100*/
}
/*
*************************************************************************************************************
- 函数名称 : Read_Data(uint8 row,uint8 line)
- 函数说明 : LCM读数据函数
- 输入参数 : uint8 row,uint8 line
-
- 输出参数 :
*************************************************************************************************************
*/
uint8 Read_Data(void)
{uint8 temp1,temp2;
IO2DIR&=(~0x000000fe);/*改变管脚为输入模式*/
IO1DIR&=(~0x00100000);
IO2SET=RS;
IO2SET=RW;
IO2SET=E;
Delay_Lcd(25);
temp1=IO2PIN;
if(IO1PIN&0x00100000)
temp2=1;
else
temp2=0;
temp1=Data_Shift(temp1,7,1)>>1;
temp1|=temp2;
IO2CLR=E;
IO1DIR|=0x00100000;/*还原LCD管脚模式*/
IO2DIR|=0x000007ff;
return temp1;
}
/*
*************************************************************************************************************
- 函数名称 : Write_data(Uchar DATA)
- 函数说明 : LCM写数据
- 输入参数 : uint8 DATA 数据
- 输出参数 : 无
*************************************************************************************************************
*/
void Write_data(uint8 DATAs)
{ int8 st;
uint8 t=0x40;
uint8 j=0x02;
uint8 i;
/*转换数据格式*/
for(i=0;i!=7;i++)
{if((DATAs&t)!=0)
st|=j;
else
st&=(~j);
t>>=1;
j<<=1;
}
IO2SET=RS;
IO2CLR=RW;
IO2SET=E;
/*送p1.20(最高位)*/
if((DATAs&0x80)!=0)
IO1SET|=DATA_PORTB;/*p1.20置1*/
else
IO1CLR|=DATA_PORTB;/*p1.20清0*/
/*送低七位*/
IO2SET|=(st&0xfe);
IO2CLR=((~st)&0xfe);
Delay_Lcd(20);
IO2CLR=E;
Delay_Lcd(100);/*100*/
}
/*
*************************************************************************************************************
- 函数名称 : Lcd_init(void)
- 函数说明 : LCM初始化
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Lcd_init(void)
{
Delay_Lcd(200);
Write_command(0x30);/*设置为8位控制界面*/
Write_command(0x30);
Write_command(0x0C);/*开整体显示*/
Write_command(0x01);/*清显示*/
Write_command(0x06);/*初始化原点*/
}
/*
*************************************************************************************************************
- 函数名称 : void Lcd_clr(void)
- 函数说明 : LCM清屏函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Lcd_clr(void)
{
Write_command(0x01);/*清显示*/
Write_command(0x06);/*初始化原点*/
Delay_Lcd(200);/*200*/
}
/*
*************************************************************************************************************
- 函数名称 :uint8 Lcd_dispp(uint8 *ptr,uint8 row,uint8 line,uint8 byte_length)
- 函数说明 : 字符显示函数
- 输入参数 : *ptr row line byte_length
- 输出参数 :i(显示的字节长度)
*************************************************************************************************************
*/
uint8 Lcd_dispp(uint8 *ptr,uint8 row,uint8 line,uint8 byte_length)
{
uint8 y,i,f,t;
f=t=0;/*初次显示标志*/
switch(row)
{case 1:{y=0x80+(--line);break;}
case 2:{y=0x90+(--line);break;}
case 3:{y=0x88+(--line);break;}
case 4:{y=0x98+(--line);break;}
}
Write_command(y); /* 定位显示起始地址*/
for(i=0;i!=byte_length;)
{if(y>0x0a0) return(i-1);
if(ptr[i]<0x80)/*ASCII显示*/
{
if(f==0)
{Write_data(ptr[i]); /*单个ASCII字符*/
i++;
f=1;
y++;
}
else
{Write_data(ptr[i]); /*连续ASCII字符*/
i++;
f=0;
}
}
else/*汉字显示*/
{
if(f==1)/*上次是ASCII显示且显示单数个*/
{
f=0;
if(y==0x88|y==0x98|y==0x90)
{
if(row==1)
{row++;
Write_command(0x90);
y=0x90;
}
else if(row==2)
{row++;
Write_command(0x88);
y=0x88;
}
else if(row==3)
{row++;
Write_command(0x98);
y=0x98;
}
}
Write_command(y);
Write_data(ptr[i]);
i++;
t=1;
y++;
}
else if(t==0)/*第一个字符是汉字或新的汉字*/
{
Write_data(ptr[i]); /*输出单个字符*/
i++;
t=1;
y++;
}
else/*第二次是汉字或上次是ASCII显示的第二字节*/
{
Write_data(ptr[i]); /*输出单个字符*/
i++;
t=0;
}
}
if((y==0x88|y==0x98|y==0x90)&&t!=1&&f!=1)
{
if(row==1)
{row++;
Write_command(0x90);
y=0x90;
}
else if(row==2)
{row++;
Write_command(0x88);
y=0x88;
}
else if(row==3)
{row++;
Write_command(0x98);
y=0x98;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -