📄 lcd_12864_drv.c
字号:
/****************************************************************************
* 文件名: 128_64_DRV.C
* 功能: 128_64驱动程序
硬件使用:NT7532H-BDT型号的液晶屏,使用SPI接口方式
硬件连接设计:
#define RST_pin (1<<20)//--------复位引脚 P1.20
#define CS_pin (1<<21)//--------片选引脚 P1.21
#define RS_pin (1<<19)//--------数据/命令控制引脚 P1.19
#define CLK_pin (1<<18)//--------时钟引脚 P1.18
#define DIO_pin (1<<17)//--------数据引脚 P1.17
****************************************************************************/
#include "config.h"
#include "LPC2294.h"
#include "ctype.h"
#include "word_pixel.h"
#define RST_pin (1<<21)//--------复位引脚 P1.21
#define CS_pin (1<<20)//--------片选引脚 P1.20
#define RS_pin (1<<25)//--------数据/命令控制引脚 P1.25
#define CLK_pin (1<<24)//--------时钟引脚 P1.24
#define DIO_pin (1<<23)//--------数据引脚 P1.23
#define CS_PIN_H() (IO1SET|=CS_pin)
#define CS_PIN_L() (IO1CLR|=CS_pin)
#define RS_pin_H() (IO1SET|=RS_pin)
#define RS_pin_L() (IO1CLR|=RS_pin)
#define CLK_pin_H() (IO1SET|=CLK_pin)
#define CLK_pin_L() (IO1CLR|=CLK_pin)
#define DIO_pin_H() (IO1SET|=DIO_pin)
#define DIO_pin_L() (IO1CLR|=DIO_pin)
#define RST_pin_H() (IO1SET|=RST_pin)
#define RST_pin_L() (IO1CLR|=RST_pin)
void SET_LCD_RESER_PIN_L(void);
void SET_LCD_RESER_PIN_H(void);
void delay_lcd(uint8 delay_msec)
{
uint8 k=0;
int m=0;
for(k=0;k<delay_msec;k++)
{
for(m=0;m<1055;m++)
;
}
}
/****************************************************************************
* 名称:send_lcd_command()
* 功能:发送命令字节函数
* 入口参数:comand
命令
* 出口参数:无
****************************************************************************/
void send_lcd_command(uint8 comand)
{
uint8 k=0;
CS_PIN_L();
RS_pin_L();
for(k=0;k<8;k++)
{
CLK_pin_L();
if(comand&(0x80>>k))
{
DIO_pin_H();
}
else
{
DIO_pin_L();
}
CLK_pin_H();
}
RS_pin_H();
}
/****************************************************************************
* 名称:send_lcd_data()
* 功能:发送数据字节函数
* 入口参数:data
数据
* 出口参数:无
****************************************************************************/
void send_lcd_data(uint8 data)
{
uint8 k=0;
CS_PIN_L();
RS_pin_H();
for(k=0;k<8;k++)
{
CLK_pin_L();
if(data&(0x80>>k))
DIO_pin_H();
else
DIO_pin_L();
CLK_pin_H();
}
}
/****************************************************************************
* 名称:set_scr_postion()
* 功能:设定光标位置
* 入口参数:X_position----------X方向的位置
Y_position----------Y方向的位置
* 出口参数:无
****************************************************************************/
void set_scr_postion(uint8 X_position,uint8 Y_position)
{
X_position+=4;
if(X_position<128)
{
send_lcd_command(0x10|(X_position>>4));
send_lcd_command(X_position&0x0F);
}
if(Y_position<64)
{
send_lcd_command(0xB0|Y_position);
}
}
/****************************************************************************
* 名称:GET_ZM_Zk_INDEX()
* 功能:输入一个字母得到字库索引
* 入口参数:data--------------------输入的字符
* 出口参数:字库的索引实际为字库的首地址
****************************************************************************/
int GET_ZM_Zk_INDEX(uint8 data)
{
int k=0;
for(k=0;k<82;k++)
{
if(ZM_ZK_INDEX[k][0]==data)
return ZM_ZK_INDEX[k][1];
}
return 1;
}
/****************************************************************************
* 名称:wzf_0816()
* 功能:写字符函数,为6*16的字符
* 入口参数:
x=0-15
y=0-8
hz_no=字符编号
c=颜色
* 出口参数:无
* 说明:写字符函数,为6*16的字符
****************************************************************************/
void wzf_0816(uint8 x,uint8 y,uint8 zf,uint8 c) //8x16 写字符?(x=0-15,y=0-8hz_no=字符编号,c=颜色)
{
int i;
uint8 dd;
uint8 zf_index=GET_ZM_Zk_INDEX(zf);
set_scr_postion(x*8,y);
for(i=0;i<8;i++) {
if(c) dd=ZM_ZK[zf_index][7-i];
else dd=~ZM_ZK[zf_index][7-i];
send_lcd_data(dd);
}
set_scr_postion(x*8,y+1);
for(i=0;i<8;i++) {
if(c) dd=ZM_ZK[zf_index][7-i+8];
else dd=~ZM_ZK[zf_index][7-i+8];
send_lcd_data(dd);
}
}
/****************************************************************************
* 名称:wzf_0816_str()
* 功能:写字符函数,为6*16的字符
* 入口参数:
x=0-15
y=0-3
hz_no=字符编号
c=颜色
* 出口参数:无
* 说明:写字符函数,为6*16的字符
****************************************************************************/
void wzf_0816_str(uint8 x,uint8 y,uint8 * data_str,uint8 data_str_len,uint8 c) //8x16 写字符?(x=0-15,y=0-8hz_no=字符编号,c=颜色)
{
uint8 k=0;
uint8 point_Y;
uint8 temp_data[16];
x=16-data_str_len-x;
point_Y=y;
if(data_str_len>16)
data_str_len=16;
for(k=0;k<16;k++)
temp_data[k]=data_str[k];
point_Y*=2;
for(k=0;k<data_str_len;k++)
{
wzf_0816(x+k,point_Y,temp_data[data_str_len-1-k],c);
}
}
/****************************************************************************
* 名称:GET_ZM_INDEX()
* 功能:输入一个双字得到字库索引
* 入口参数:data--------------------输入的字符
* 出口参数:字库的索引实际为字库的首地址
****************************************************************************/
int GET_HZ_Zk_INDEX(uint8 data_H,uint8 data_L)
{
int k=0;
for(k=0;k<HZK_MAX_INDEX;k++)
{
if(HZ_ZK_INDEX[k].KZ_[0]==data_H&&HZ_ZK_INDEX[k].KZ_[1]==data_L)
return HZ_ZK_INDEX[k].KZ_index;
}
return 1;
}
/****************************************************************************
* 名称:whz_1616_ZK()
* 功能:写汉字函数,为16*16的汉字,使用的是字库---menu_ZK
* 入口参数:
x=0-7
y=0-8
hz_no=汉字编号
c=颜色
* 出口参数:无
* 说明:V998液晶屏清屏函数
****************************************************************************/
void whz_1616_ZK(uint8 x,uint8 y,uint8 hz_no,uint8 c) //16x16 写汉字 (x=0-7,y=0-8,hz_no=汉字编号,c=颜色)
{
uint8 i,dd;
int zx_pt;
zx_pt=hz_no*32;
set_scr_postion(x*8,y);
for(i=0;i<16;i++)
{
if(c) dd=HZ_ZK[zx_pt+15-i];
else dd=~HZ_ZK[zx_pt+15-i];
send_lcd_data(dd);
}
set_scr_postion(x*8,y+1);
for(i=0;i<16;i++)
{
if(c) dd=HZ_ZK[zx_pt+16+15-i];
else dd=~HZ_ZK[zx_pt+16+15-i];
send_lcd_data(dd);
}
}
/****************************************************************************
*函数说明:show_16X16_str()
显示一行宽度为16*16的点阵数据,数据长度可以改变
*函数输入:
ZK_start-----------起始象素的起点(在字库中)
len---------------长度,实际的象素长度为len*16
color--------------颜色
*函数输出:
无
*使用的全局变量
无
*调用的模块
无
****************************************************************************/
void show_16X16_str_(uint8 X,uint8 Y,uint8* str,uint8 len,uint8 color)
{
uint8 k;
if(len+X>8)
len=8-X;//保护
X=8-len-X;
for(k=0;k<len;k++)
whz_1616_ZK(2*(k+X),2*Y,GET_HZ_Zk_INDEX(str[(len-1-k)*2],str[(len-1-k)*2+1]),color);
}
/****************************************************************************
* 名称:INI_LCD()
* 功能:初始化LCD
* 入口参数:无
* 出口参数:无
****************************************************************************/
void INI_LCD(void)
{
IO1DIR|=(RST_pin|CS_pin|RS_pin|CLK_pin|DIO_pin);
SET_LCD_RESER_PIN_L();
delay_lcd(250);
SET_LCD_RESER_PIN_H();
CS_PIN_H();
//设置管脚状态
send_lcd_command(0xE2);
send_lcd_command(0xAF);
send_lcd_command(0x23);
send_lcd_command(0x2F);
send_lcd_command(0x40);
send_lcd_command(0x81);
send_lcd_command(0x23);
send_lcd_command(0xA1);
send_lcd_command(0xA3);
send_lcd_command(0xA4);
send_lcd_command(0xA6);
send_lcd_command(0xB0);
send_lcd_command(0xC8);
send_lcd_command(0xAD);
send_lcd_command(0x03);
send_lcd_command(0xA8);
send_lcd_command(0x3F);
send_lcd_command(0xa9);
send_lcd_command(0x63);
send_lcd_command(0xAA);
send_lcd_command(0xD4);
send_lcd_command(0x40);
//打开显示
//设置对比度
//
}
/****************************************************************************
* 名称:SET_LCD_RESER_PIN_L()
* 功能:设置LCD复位引脚为低(复位有效)
* 入口参数:无
* 出口参数:设置LCD复位引脚为低(复位有效)
****************************************************************************/
void SET_LCD_RESER_PIN_L(void)
{
RST_pin_L();
}
/****************************************************************************
* 名称:SET_LCD_RESER_PIN_H()
* 功能:设置LCD复位引脚为高(复位完成)
* 入口参数:无
* 出口参数:设置LCD复位引脚为高(复位完成)
****************************************************************************/
void SET_LCD_RESER_PIN_H(void)
{
RST_pin_H();
}
/****************************************************************************
* 名称:write_ZF_HZ_STR()
* 功能:写到LCD上的汉字和字符混合串
* 入口参数:无
x------------列(0-15)
y------------行(0-3)
data-------------数据指针
c=颜色
* 出口参数:写到LCD上的汉字和字符混合串,有长度限制
****************************************************************************/
void write_ZF_HZ_STR(uint8 x,uint8 y,uint8 * data,uint8 len,uint8 color)
{
uint8 x_x=x;
uint8 y_y=y*2;
uint8 k;
for(k=0;k<len&&k<16;)
{
if(isprint(data[k]))
{
if(x_x+1>16)
break;
wzf_0816(15-x_x,y_y,data[k],color);
x_x++;
k++;
}
else
{
if(x_x+2>16)
break;
whz_1616_ZK(14-x_x,y_y,GET_HZ_Zk_INDEX(data[k],data[k+1]),color);
k+=2;
x_x+=2;
}
}
}
/****************************************************************************
* 名称:wzf_0816_str_sp_index()
* 功能:写字符函数,为8*16的字符,并且给定一个高亮的索引,从前往后排0-----16
* 入口参数:
x=0-15
y=0-3
hz_no=字符编号
sel_index----------高亮索引
* 出口参数:无
* 说明:写字符函数,为8*16的字符,并且给定一个高亮的索引,从前往后排0-----16
****************************************************************************/
void wzf_0816_str_sp_index(uint8 x,uint8 y,uint8 * data_str,uint8 data_str_len,uint8 sel_index)
{
uint8 k=0;
uint8 point_Y;
uint8 temp_data[16];
x=16-data_str_len-x;
point_Y=y;
if(data_str_len>16)
data_str_len=16;
for(k=0;k<16;k++)
temp_data[k]=data_str[k];
point_Y*=2;
for(k=0;k<data_str_len;k++)
{
if((15-sel_index)==k)
wzf_0816(x+k,point_Y,temp_data[data_str_len-1-k],0);
else
wzf_0816(x+k,point_Y,temp_data[data_str_len-1-k],1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -