|
楼主 |
发表于 2010-12-31 21:14:50
|
显示全部楼层
=========================.h文件===================================================================
#ifndef _LCD3310_h_
#define _LCD3310_H_
/************** 引 脚 *****************/
/* 1 VDD */
sbit SCLK_3310 = P2^3; /* 2 SCLK */
sbit SDIN_3310 = P2^2; /* 3 SDIN */
sbit D_C_3310 = P2^1; /* 4 D/C */
sbit CS_3310 = P2^6; /* 5 CS */
/* 6 GND */
/* 7 Vout */
sbit RES_3310 = P2^0; /* 8 RES */
/*****************************************/
/************** 函数声明 ***************************/
void write_3310(bit D_C,unsigned char Data); //写函数
void reset_3310(void); //复位
void clear_3310(unsigned char Data); //清屏幕
void init_3310(void); //初始化
void setXY_3310(unsigned char X,unsigned char Y); //设置坐标
void write_3310_str(unsigned char X,unsigned char Y,unsigned char str); //显示ASCII字符
void write_3310_string(unsigned char *str,unsigned char Length); //显示ASCII字符串
void display_1616CN(unsigned char X,unsigned char Y,unsigned char *str); //显示16x16点阵
void display_1212CN(unsigned char X,unsigned char Y,unsigned char WordS,unsigned char Length); //显示12x12点阵
void display_1212CNH(unsigned char X,unsigned char Y,unsigned char WordS,unsigned char Length); //显示12x12点阵上下半句合并
void display_photo(unsigned char *photo_addr); //全屏显示图像
/************** 指 令 集 ***************************/
#define LPH7366_basic_fun_set 0x20 //基本功能设置
#define LPH7366_expand_fun_set 0x21 //扩展功能设置
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 1 0 0 PD V H
// | | |_______1->扩展指令集 0->基本指令集
// | |___________1->垂直寻址 0->水平寻址
// |_______________1->低功耗模式 0->正常模式
/*****************************************************/
/************** 基 本 指 令 集 *********************/
#define LPH7366_dis_set 0x0c /*显示模式设置*/
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 0 1 D 0 E
// | |_______0 0 1 1
// |_______________0 1 0 1
// 白屏 正常显示 全显 反转
/*****************************************************/
#define LPH7366_add_Yset 0x40 /* 设置Y地址 */
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 1 0 0 0 Y1 Y2 Y3
/*****************************************************/
#define LPH7366_add_Xset 0x80 /* 设置X地址 */
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 1 X6 X5 X4 X3 X2 X1
/*****************************************************/
/*************** 扩 展 指 令 集 *******************/
#define LPH7366_tem_set 0x06 /*温度系数设置*/
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 0 0 1 TC1 TC0
/*****************************************************/
#define LPH7366_vot_set 0xD0 /*电压系数设置*/
// D7 D6 D5 D4 D3 D2 D1 D0
// 1 vo6 vo5 vo4 vo3 vo2 vo1 vo0
/*****************************************************/
#define LPH7366_BSx_set 0x11 /*偏置系统设置*/
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 1 0 BS2 BS1 BS0
/*****************************************************/
/************** 宏 定 义 ***************************/
#define Com 0 //指令
#define Dat 1 //数据
#define LINE_Y 1 //Y坐标偏移量
#endif
==========================.c文件===================================================================
#include "LCD3310.h"
#include "CNPIX.h"
#include "ASCII.h"
#include "photo.h"
/**********************************************/
/* 写 函 数 */
/* 输入:D_C 1:数据 0:指令 */
/* Data 数据或指令 */
/* 输出:无 */
/**********************************************/
void write_3310(bit D_C,unsigned char Data)
{
unsigned char i;
D_C_3310 = D_C;
for(i=0;i<8;i++) //串行发送数据
{
if(Data&0x80) //判断数据
SDIN_3310 = 1;
else
SDIN_3310 = 0;
//_nop_();
SCLK_3310 = 0;
//_nop_();
SCLK_3310 = 1;
Data<<=1; //左移1位
};
}
/**********************************************/
/* 复 位 */
/* 输入:无 */
/* 输出:无 */
/**********************************************/
void reset_3310(void)
{
RES_3310 = 1;
RES_3310 = 0;
RES_3310 = 1;
}
/**********************************************/
/* 清 屏 幕 */
/* 输入:Data 填充字符 */
/* 输出:无 */
/**********************************************/
void clear_3310(unsigned char Data)
{
unsigned int i = 0;
write_3310(Com,0x0c); //显示模式:普通
write_3310(Com,0x80); //设置X地址:0x00
for(i = 0; i < 504; i++)
write_3310(Dat,Data); //填充Data
}
/**********************************************/
/* 初 始 化 */
/* 输入:无 */
/* 输出:无 */
/**********************************************/
void init_3310(void)
{
reset_3310();
write_3310(Com,LPH7366_expand_fun_set); //扩展指令集 水平寻址 活动
write_3310(Com,LPH7366_vot_set); //设置偏置电压
write_3310(Com,LPH7366_tem_set); //设置温度系数
write_3310(Com,LPH7366_BSx_set); //设置偏置系统 1:48
write_3310(Com,LPH7366_basic_fun_set); //使用基本指令
clear_3310(0x00); //清屏,填充“ ”
write_3310(Com,LPH7366_dis_set); //显示模式:普通
}
/**********************************************/
/* X Y 轴 设 置 函 数 */
/* 输入:X:X坐标0~84 Y:Y坐标0~5 */
/* 输出:无 */
/**********************************************/
void setXY_3310(unsigned char X,unsigned char Y)
{
write_3310(Com,LPH7366_basic_fun_set); //使用基本指令
write_3310(Com,LPH7366_add_Xset|X); //设置X坐标
write_3310(Com,LPH7366_add_Yset|Y); //设置Y坐标
}
/**********************************************/
/* 显示ASCII字符 */
/* 输入:X:X坐标0~84 Y:Y坐标0~5 */
/* str: ‘ASCII字符’ */
/* 输出:无 */
/**********************************************/
void write_3310_str(unsigned char X,unsigned char Y,unsigned char str)
{
unsigned char i=0;
setXY_3310(X,Y);
for(i=0;i<5;i++)
{
write_3310(Dat,ASCII[str-0x20]);
};
}
/**********************************************/
/* 写 字 符 串 函 数 */
/* 输入:*str 指向字符串的指针 */
/* Length 字符串长度 */
/* 输出:无 */
/**********************************************/
void write_3310_string(unsigned char *str,unsigned char Length)
{
unsigned char i;
unsigned char L=0;
for(L=0;L<Length;L++)
{
for(i=0;i<5;i++)
{
write_3310(Dat,ASCII[str[L]-0x20]);
};
};
}
/**********************************************/
/* 显示16x16点阵汉字或图像 */
/* 输入:X:X坐标0~84 Y:Y坐标0~5 */
/* *str 指向点阵数据的指针 */
/* 输出:无 */
/**********************************************/
void display_1616CN(unsigned char X,unsigned char Y,unsigned char *str)
{
unsigned char i;
setXY_3310(X,Y);
for(i=0;i<17;i++)
{
write_3310(Dat,str);
};
setXY_3310(X,Y+LINE_Y);
for(i=16;i<33;i++)
{
write_3310(Dat,str);
};
}
/**********************************************/
/* 显示12x12点阵汉字或图像 */
/* 输入:X:X坐标0~84 Y:Y坐标0~5 */
/* Words 显示第几个汉字 */
/* Length 显示多少个汉字 */
/* 输出:无 */
/**********************************************/
void display_1212CN(unsigned char X,unsigned char Y,unsigned char WordS,unsigned char Length)
{
unsigned char x,Word;
setXY_3310(X,Y); //设置坐标
for(Word=WordS;Word<Length;Word++) //写字
{
for(x=0;x<24;x++) //写入一个12x12汉字
{
write_3310(Dat,ADD[Word][x]);
if(x==11)
setXY_3310(X,Y+1); //字体下半部分属于第二行,Y坐标需+1
};
// X+=12; //写一个汉字的x坐标+12
setXY_3310(X+=12,Y); //设置XY坐标
};
}
/**********************************************/
/* 显示12x12点阵汉字或图像第1.5-2行部分 */
/* 输入:X:X坐标0~84 Y:Y坐标0~5 */
/* Words 显示第几个汉字 */
/* Length 显示多少个汉字 */
/* 输出:无 */
/**********************************************/
void display_1212CNH(unsigned char X,unsigned char Y,unsigned char WordS,unsigned char Length)
{
unsigned char x,Word,zuhe;
setXY_3310(X,Y);
for(Word=WordS;Word<Length;Word++)
{
for(x=0;x<12;x++) //写入一个12x12汉字
{
zuhe=(ADD[Word-7][x+12]); //高位=这行字x的低位;低位=上一行字x+12的低位
zuhe|=(ADD[Word][x]<<4);
write_3310(Dat,zuhe);
};
X+=12; //写一个汉字的x坐标+12
setXY_3310(X,Y); //设置XY坐标
};
Y+=1;
X=0;
setXY_3310(X,Y);
for(Word=WordS;Word<Length;Word++)
{
for(x=0;x<12;x++) //写入一个12x12汉字
{
zuhe=(ADD[Word][x]>>4);
zuhe|=(ADD[Word][x+12]<<4);
write_3310(Dat,zuhe);
};
//X+=12; //写一个汉字的x坐标+12
setXY_3310(X+=12,Y); //设置XY坐标
};
}
/**********************************************/
/* 显示84x48点阵图像第1.5-2行部分 */
/* 输入:无
/* 输出:无 */
/**********************************************/
void display_photo(unsigned char *photo_addr)
{
unsigned char i,s,X,Y;
X=0x00;Y=0x00;
setXY_3310(X,Y);
for(s=0;s<42;s++)
{
if(s%7==0)
{
setXY_3310(0,Y);
Y+=1;
};
for(i=0;i<12;i++)
{
write_3310(Dat,*photo_addr++); //数组地址+1
};
(*photo_addr)++; //数组地址+12
};
}
/**********************************************/
/* 显示坐标点函数 */
/* 输入:X:X坐标0~84 Y:Y坐标0~48 */
/* 输出:无 */
/**********************************************/
void display_point(unsigned char x,unsigned char y)
{
unsigned char line;
line=(1<<(y%8));
setXY_3310(x,y/8);
write_3310(Dat,line);
}
========================================================================================
其中3310的指令集在H文件已经很清楚。复位似乎只需要RES端给一个低电平脉冲就可以了。 |
|