📄 lcd._c
字号:
/************************************************************
FileName: lcd.c
Description: 液晶显示模块初始化lcd,向lcd发送命令字和数据,显示指定大小的图像,清屏。
Function List:
1.Send_Byte()
功能:向lcd的控制芯片发送数据
2.Send_Commnad()
功能:向lcd的控制芯片发送命令字
3.Gen_Column_MSB()
Gen_Column_MSB()
功能:生成设置高4位和低4位列地址的命令字
4.Initial_LCD()
功能:初始化lcd
5.Gen_Page()
功能:生成设置页地址的命令字
6.Clear_DDRAM()
功能:清除lcd指定页内显示的所有数据
7.Bmp8x8()
功能:显示8个点乘8个点的图像
9.Bmp8x16()
功能:显示8个点乘16个点的图像
10.Bmp8x16_Rev()_
功能:反白显示8个点乘16个点的图像
11.Draw_NtoArab()
功能:将数值显示为阿拉伯数字
***********************************************************/
#include <iom16v.h>
#include <macros.h>
#include "main.h"
#include "lcd.h"
void Send_Byte(unsigned char bdata)
{
set_CS; //模拟时序信号
set_CS;
set_RS;
set_WR;
_nop; //开始发送数据
PORTA = bdata; //将显示数据放在端口A
set_RS;
clr_CS;
clr_WR;
_nop;
clr_WR;
_nop;
set_WR;
_nop;
set_CS;
set_RS;
}
void Send_Command(unsigned char cdata)
{
set_CS;
set_RS;
set_WR;
_nop; //开始发送命令
PORTA = cdata; //将命令字放在端口A
clr_RS;
clr_CS;
_nop;
clr_WR;
_nop;
set_WR;
_nop;
set_CS;
set_RS;
}
unsigned char Gen_Column_MSB(unsigned char column)
{
unsigned char temp; //用于保存列数的高4bit命令字
temp = column+0x04 ;
temp = temp >>4; //右移4位,得到高4位的列数据
temp |=0x10; //00010000,将列地址的DB4置1
return temp;
}
unsigned char Gen_Column_LSB(unsigned char column)
{
unsigned char temp = column;
temp = column+0x04 ;
temp &= 0x0f; //取出column的低四位
return temp;
}
unsigned char Gen_Page(unsigned char page)
{
unsigned char temp;
temp = page & 0x0f;
temp |= 0xb0; //得到显示数据页的控制字
return temp;
}
void Initial_LCD(void)
{
Send_Command(0xe2); //初始化内部功能(RESET),初始化初始显示线,列地址,页地址和普通
//输出地址状态到初始状态,但是不能影响显示数据RAM的内容
wait; //等待2个时钟周期
Send_Command(0xaf); //Display on
Send_Command(0x23); //internal voltage regulator resistor ratio,(4.5)0x23
Send_Command(0x2f); //内部供电VC=VR=VF:111,使内部VC,VR,VF的电压控制电路工作
Send_Command(0x40); //初始化显示线在line address 0
Send_Command(0x81); //设置参考电压模式对比度共64级
Send_Command(0xa1);
Send_Command(0xa1);
Send_Command(0xa3); //选择LCD偏置电压比率以驱动LCD,bias=1
Send_Command(0xa4); //全亮显示,EON=0,normal display(不管显示RAM中有何数据)
Send_Command(0xb0); //设置页地址为0
Send_Command(0x0c); //选择COM(行地址)输出扫描方向,决定LCD驱动器的输出状态。SHL=0,normal direction(COM0-COM63)
Send_Command(0xad); //设置STATIC INDICATOR STATUS(SM=1,STATIC INDICATOR ON)
Send_Command(0x03); //STATUS OF STATIC INDICATOR OUTPUT ALWAYS ON
}
void Clear_DDRAM(unsigned char c_page_start,unsigned char c_page_end)
{
unsigned char i,j;
unsigned char start_page; //用于存放清除的起始页数
unsigned char c_column_msb=0x10,c_column_lsb=0x04; //清除的起始列为第4列
start_page = Gen_Page(c_page_start); //取得清除的起始页地址
for(j=c_page_start;j<=c_page_end;j++)
{
Send_Command(0x10); //从第4列开始清除LCD显示的数据
Send_Command(0x04);
Send_Command(start_page); //清除位置在第start_page页
for(i=0;i<=127;i++)
{
Send_Byte(WHITE); //清除页内所有列显示的数据
}
start_page++; //清除下一页数据
}
}
//////////////////////////////////////////////////////////////////////////
//绘制一个8*8大小的位图
//////////////////////////////////////////////////////////////////////////
void Bmp8x8(unsigned char page,unsigned char column,const unsigned char
*pdata)
{
unsigned char i;
Send_Command(Gen_Page(page)); //送页地址
Send_Command(Gen_Column_LSB(column)); //送低4位地址
Send_Command(Gen_Column_MSB(column)); //送高4位地址
for(i=0;i<=7;i++) //水平宽度为8列
{
Send_Byte(*pdata);
pdata++;
}
}
//////////////////////////////////////////////////////////////////////////
//绘制一个8*16大小的位图
//////////////////////////////////////////////////////////////////////////
void Bmp8x16(unsigned char page,unsigned char column,const unsigned char
*pdata)
{
unsigned char i;
unsigned char j;
for(j=0;j<=1;j++)
{
Send_Command(Gen_Page(page));
Send_Command(Gen_Column_LSB(column));
Send_Command(Gen_Column_MSB(column));
for(i=0;i<=7;i++)
{
Send_Byte(*pdata);
pdata++;
}
page++;
}
}
//////////////////////////////////////////////////////////////////////////
//绘制一个反白显示8*16大小的位图
//////////////////////////////////////////////////////////////////////////
void Bmp8x16_rev(unsigned char page,unsigned char column,const unsigned char
*pdata)
{
unsigned char i;
unsigned char j;
for(j=0;j<=1;j++)
{
Send_Command(Gen_Page(page));
Send_Command(Gen_Column_LSB(column));
Send_Command(Gen_Column_MSB(column));
for(i=0;i<=7;i++)
{
Send_Byte(~(*pdata));
pdata++;
}
page++;
}
}
//////////////////////////////////////////////////////////////////////
//数值大小与阿拉伯数字之间的转换显示
//////////////////////////////////////////////////////////////////////
void Draw_NtoArab(unsigned char page,unsigned char column,unsigned char number)
{
switch(number)
{
case 0x00:
{
Bmp8x16(page,column,arab_0);
break;
}
case 0x01:
{
Bmp8x16(page,column,arab_1);
break;
}
case 0x02:
{
Bmp8x16(page,column,arab_2);
break;
}
case 0x03:
{
Bmp8x16(page,column,arab_3);
break;
}
case 0x04:
{
Bmp8x16(page,column,arab_4);
break;
}
case 0x05:
{
Bmp8x16(page,column,arab_5);
break;
}
case 0x06:
{
Bmp8x16(page,column,arab_6);
break;
}
case 0x07:
{
Bmp8x16(page,column,arab_7);
break;
}
case 0x08:
{
Bmp8x16(page,column,arab_8);
break;
}
case 0x09:
{
Bmp8x16(page,column,arab_9);
break;
}
default:
{
Bmp8x16(page,column,arab_0);
}
break;
}
}
//////////////////////////////////////////////////////////////////////
//数值大小与阿拉伯数字之间的转换反白显示
//////////////////////////////////////////////////////////////////////
void Draw_NtoArab_rev(unsigned char page,unsigned char column,unsigned char number)
{
switch(number)
{
case 0x00:
{
Bmp8x16_rev(page,column,arab_0);
break;
}
case 0x01:
{
Bmp8x16_rev(page,column,arab_1);
break;
}
case 0x02:
{
Bmp8x16_rev(page,column,arab_2);
break;
}
case 0x03:
{
Bmp8x16_rev(page,column,arab_3);
break;
}
case 0x04:
{
Bmp8x16_rev(page,column,arab_4);
break;
}
case 0x05:
{
Bmp8x16_rev(page,column,arab_5);
break;
}
case 0x06:
{
Bmp8x16_rev(page,column,arab_6);
break;
}
case 0x07:
{
Bmp8x16_rev(page,column,arab_7);
break;
}
case 0x08:
{
Bmp8x16_rev(page,column,arab_8);
break;
}
case 0x09:
{
Bmp8x16_rev(page,column,arab_9);
break;
}
default:
{
Bmp8x16_rev(page,column,arab_0);
}
break;
}
}
//////////////////////////////////////////////////////////////////////////
//绘制菜单界面
//////////////////////////////////////////////////////////////////////////
void Draw_Menu_Interface()
{ Bmp8x16(0x00,0x18,T);
Bmp8x16(0x00,0x20,maohao);
Bmp8x16(0x00,0x38,maohao);
Bmp8x16(0x00,0x50,maohao);
Bmp8x16(0x02,0x00,t);
Bmp8x16(0x02,0x08,maohao);
Bmp8x16(0x02,0x30,xiaoshudian);
Bmp8x16(0x02,0x40,E);
Bmp8x16(0x02,0x48,maohao);
Bmp8x16(0x02,0x70,xiaoshudian);
Bmp8x16(0x04,0x10,l);
Bmp8x16(0x04,0x18,g);
Bmp8x16(0x04,0x20,P);
Bmp8x8(0x04,0x28,ll);
Bmp8x8(0x05,0x28,H);
Bmp8x16(0x04,0x30,maohao);
Bmp8x16(0x04,0x50,xiaoshudian);
Bmp8x16(0x06,0x10,l);
Bmp8x16(0x06,0x18,g);
Bmp8x16(0x06,0x20,P);
Bmp8x8(0x06,0x28,lll);
Bmp8x8(0x07,0x28,H);
Bmp8x16(0x06,0x30,maohao);
Bmp8x16(0x06,0x50,xiaoshudian);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -