|
本帖最后由 qwer1415926 于 2020-11-16 14:24 编辑
一盒LCD液晶屏在这需要感谢数码之家好坛友"亡灵and序曲"免费且包邮赠送的一盒拆机屏.
后续在研究其它屏的驱动
#ifndef dianzhen12864_h
#define dianzhen12864_h
#define uchar unsigned char
#define uint unsigned int
#define cs1 PTFD_PTFD4 //串行数据输入端
#define reset PTFD_PTFD3 //数据锁存端
#define rs PTFD_PTFD2 //时钟
#define sclk PTFD_PTFD1 //数据锁存端
#define sid PTFD_PTFD0
#include "tab1.h"
#include "tab2.h"
void DisplayNumber1608(unsigned char page, unsigned char column, uint a);
void DisplayString1608(int page,int column, unsigned char *p);
void display_graphic_8x16(int page,int column,char *dp) ;
/*写指令到 LCD 模块*/
void transfer_command(int data1)
{
int i;
cs1=0;
rs=0;
for(i=0;i<8;i++)
{
sclk=0;
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
data1=data1<<=1;
}
}
/*写数据到 LCD 模块*/
void transfer_data(int data1)
{
int i;
cs1=0;
rs=1;
for(i=0;i<8;i++)
{
sclk=0;
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
data1=data1<<=1;
}
}
/*延时*/
void delay1(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<70;k++);
}
//初始化液晶屏
void InitLCD(void)
{
cs1=0;
reset=0; /*低电平复位*/
delay1(100);
reset=1; /*复位完毕*/
delay1(20);
transfer_command(0xe2); /*软复位*/
delay1(5);
transfer_command(0x2f); /*升压*/
delay1(5);
transfer_command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/
transfer_command(0x81); /*微调对比度*/
transfer_command(0x238); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/
transfer_command(0xa2); /*1/9 偏压比(bias)*/
transfer_command(0xc8); /*行扫描顺序:从上到下*/
transfer_command(0xa0); /*列扫描顺序:从左到右*/
transfer_command(0x40); /*起始行:第一行开始*/
transfer_command(0xaf); /*开显示*/
cs1=1;
}
void lcd_address(int page,int column)
{
cs1=0;
column=column-1; //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
page=page-1;
transfer_command(0xb0+page); /*设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
我们平常所说的第 1 页,在 LCD 驱动 IC 里是第 0 页,所以
在这里减去 1*/
transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高 4 位
transfer_command(column&0x0f); //设置列地址的低 4 位
}
/*全屏清屏*/
void clear_screen(void)
{
unsigned char i,j;
cs1=0;
for(i=0;i<9;i++)
{
lcd_address(1+i,1);
for(j=0;j<132;j++)
{
transfer_data(0x00);
}
}
cs1=1;
}
//==================display a piture of 128*64 dots================
void full_display(void)
{
int i,j;
for(i=0;i<8;i++)
{
cs1=0;
lcd_address(i+1,0);
for(j=0;j<70;j++)
{
transfer_data(0xff);
}
}
}
/*显示 32x32 点阵图像、汉字、生僻字或 32x32 点阵的其他图标*/
void display_graphic_32x32(int page,int column,char *dp)
{
int i,j;
cs1=0;
for(j=0;j<4;j++)
{
lcd_address(page+j,column);
for (i=0;i<31;i++)
{
transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
cs1=1;
}
/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/
void display_graphic_16x16(int page,int column,char *dp)
{
int i,j;
cs1=0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<16;i++)
{
transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
cs1=1;
}
/*显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标*/
void display_graphic_8x16(int page,int column,char *dp)
{
int i,j;
cs1=0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<8;i++)
{
transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
cs1=1;
}
//在指定页、指定列显示尺寸为1608的数字
void DisplayNumber1608(unsigned char page, unsigned char column, uint a)
{
char i=0, j;//注意这里用的是char,不是unsigned char
for(i=1; i>0; i--)//判断数字数组是否结束
{
j = a % 10 + 16;//获取当数字加16后的值,这个值就是这个数字在精简版ASCII表中的序号
display_graphic_8x16(page, (column + i*8), &tab2[j * 16]);//这里j*16以后就是它的图形的位置
a /= 10;
}
}
void DisplayString1608(int page,int column, unsigned char *p)
{
unsigned char i=0, j;
while(p > 0x00)//判断字符数组是否结束
{
j = p - 0x20;//获取当前字符减32后的值
display_graphic_8x16(page, (column + 8), &tab2[j*16 ] );
i++;
}
}
#endif
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|