📄 lcd.c
字号:
/***********************************************************/
/* */
/*文 件 名:lcd.c */
/*功 能:液晶终端机主系统文件 */
/*当前版本:V1.0 */
/*作 者:白广斌 */
/* */
/*授 权: */
/* */
/*开始日期:2007.10.01 */
/*完成日期:2007.10.01 */
/* */
/***********************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <LCM.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
/*********************************************************/
//函数名称:FullScreenFill(x,x,x)
//函数功能:整屏幕写入数据函数
//输入参数:low、high、fill_data
//输出参数:无
//返 回 值:无
/********************************************************/
void FullScreenFill(uchar low,uchar high,uchar fill_data)
{
uchar i,j;
CmdWrite(0x46); //光标显示位置设置
DataWrite(low);
DataWrite(high);
CmdWrite(0x42);
for(i=0;i<240;i++)
for(j=0;j<40;j++)
DataWrite(fill_data);
}
/******************************************************/
//函数名称:LcdRead(void)
//函数功能:读数据函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*****************************************************/
uchar LcdRead(void)
{
uchar x;
DDRC =0x00;//定义端口C为输入引脚
PORTC=0x00;//上拉电阻有效
_WR(1); // init all control signal
_RD(1);
A0(0);
_CS(0); // enable the access
_RD(0);
_RD(1);
x=bit_is_set(PINC,PINC6);
_CS(1);
DDRC =0xff;//定义端口C为输出引脚
PORTC=0xFF;//上拉电阻无效
return(x);
}
/********************************************************/
//函数名称:DataWrite(unsigned char wrdata)
//函数功能:写命令函数
//输入参数:unsigned char wrdata
//输出参数:无
//返 回 值:无
/*******************************************************/
void CmdWrite(uchar cmdcode)
{
_WR(1); // init all control signal
_RD(1);
A0(1); // for command
LCDBUS = cmdcode; //写入数据或参数
_CS(0); // enable the access
_WR(0);
_WR(1);
_CS(1);
}
/******************************************************/
//函数名称:DataWrite(unsigned char wrdata)
//函数功能:写数据或参数函数
//输入参数:unsigned char wrdata
//输出参数:无
//返 回 值:无
/*****************************************************/
void DataWrite(uchar wrdata)
{
while(!(LcdRead()==0));/*消除雪花显现*/
_WR(1); // init all control signal
_RD(1);
A0(0);
LCDBUS = wrdata;
_CS(0); // enable the access
_WR(0);
_WR(1);
_CS(1);
}
/****************************************************/
//函数名称: LCD_Initial()
//函数功能:显示系统初始化函数
//输入参数:无
//输出参数:无
//返 回 值:无
/***************************************************/
void LCD_Initial(void)
{
LCD_RES(0);
_delay_ms(5);
LCD_RES(1);
_delay_ms(5);
CmdWrite(0x40); //系统设置
DataWrite(0x30); //P1参数:单屏幕,CGROM+CGRAM1+CGRAM2
DataWrite(0x87); //P2参数:8点列
DataWrite(0x07); //P3参数:8点行
DataWrite(0x27); //P4参数:显示窗口宽度为40
DataWrite(0x42); //P5参数:TC/R>=C/R+4
DataWrite(0xEF); //P6参数:240行扫描
DataWrite(0x28); //P7参数:APL 显示一行占用40字节,即0x0028
DataWrite(0x00); //P8参数:APH
CmdWrite(0x44); //显示区域设置
DataWrite(0x00); //显示一区首地址为0000H
DataWrite(0x00); //
DataWrite(0xef); //显示一区扫描行数为120行
DataWrite(0x00); //显示二区首地址为2800H
DataWrite(0x28); //
DataWrite(0xef); //显示二区的扫描行数为240行
DataWrite(0x00); //显示三区首地址为5000H
DataWrite(0x50); //
CmdWrite(0x58); //显示状态设置,显示总开关关闭
DataWrite(0x54); //打开各区显示和光标
CmdWrite(0x4c); //设置光标移动方向,自动右移
CmdWrite(0x5b); //合成方式设置
DataWrite(0x1c); //两重合成显示,一、三区为文本,三个区"或"关系
CmdWrite(0x5c); //CGRAM的起始地址为7800H
DataWrite(0x00); //
DataWrite(0x78); //
CmdWrite(0x5d); //光标形状设置
DataWrite(0x07); //
DataWrite(0x07); //
ClearScreen(); //清屏
CmdWrite(0x59); //打开显示总开关
}
/******************************************************/
//函数名称:ClearScreen(void)
//函数功能:清屏函数
//输入参数:无
//返 回 值:无
/*****************************************************/
void ClearScreen(void)
{
FullScreenFill(0x00,0x00,0x00); //清显示三区
FullScreenFill(0x00,0x28,0x00); //清显示二区
FullScreenFill(0x00,0x50,0x00); //清显示三区
}
/****************************************************************************************/
//函数名称:LCM_Screen_str(uchar low,uchar high,const prog_char *pstr,uchar Layer,uchar fs)
//函数功能:16X8点阵字符串输出到屏幕指定位置显示
//输入参数:low 行地址
//输入参数:high 列地址
//输入参数:*pstr 字符串
//输入参数:Layer 显示区(Layer=2时在3区,否则在1区)
//输入参数:fs 显示方式(0,反显,否则正常显示)
//返 回 值:无
/****************************************************************************************/
void LCM_Screen_str(uchar low,uchar high,const prog_char *pstr,uchar Layer,uchar fs)
{
uchar i,Temp;
const prog_char *STR_p;
uint CN=0;
uint Screen_Addr; //屏幕地址
if(Layer==2)
{
Screen_Addr=low*40+high+0x5000; //3区
}
else
{
Screen_Addr=low*40+high+0x2800; //1区
}
CN=high;
low=(uchar)(Screen_Addr);
high=(uchar)(Screen_Addr>>8);
CmdWrite(0x4f); //设置光标自动下移
while(*pstr) //指针内容非空
{
CmdWrite(0x46); //光标显示位置设置
DataWrite(low++);
DataWrite(high);
CmdWrite(0x42);
STR_p=&ASCII_16X8[0]; //取16x8 ASCII码点阵库地址
for(i=0;i<(*pstr-32);i++){STR_p+=16;}
for(i=0;i<16;i++)
{
Temp=pgm_read_byte(STR_p);
if(fs==0) //当fs=0时反显,否则正常显示
{
DataWrite(~Temp); //反显
}
else
{
DataWrite(Temp);
}
STR_p++;
}
pstr++;
CN++;
if(CN>39){break;}
}
CmdWrite(0x4c); //恢复光标自动移动方向
}
/****************************************************************************/
//函数名称:LCM_Screen_HZ(uchar Row,uchar Col,uchar bm,uchar Layer,uchar fs)
//函数功能:将16x16点阵汉字输出到屏幕指定位置显示
//输入参数:low 行地址
//输入参数:Col 列地址
//输入参数:bm 汉字编码
//输入参数:Layer 显示区(Layer=2时在3区,否则在1区)
//输入参数:fs 显示方式(0,反显,否则正常显示)
//返 回 值:无
/****************************************************************************/
void LCM_Screen_HZ(uchar Row,uchar Col,uchar bm,uchar Layer,uchar fs)
{
uchar i,j,low,high,Temp;
const prog_char *STR_p;
uint Screen_Addr; //屏幕地址
STR_p=&HZ_16X16[bm*32]; //取16x16 中文点阵库地址
CmdWrite(0x4c); //设置光标自动右移
for(j=0;j<16;j++)
{
if(Layer==2)
{
Screen_Addr=Row*40+Col+0x5000; //3区
}
else
{
Screen_Addr=Row*40+Col+0x2800; //1区
}
low=(uchar)(Screen_Addr);
high=(uchar)(Screen_Addr>>8);
CmdWrite(0x46); //光标显示位置设置
DataWrite(low);
DataWrite(high);
CmdWrite(0x42);
for(i=0;i<2;i++)
{
Temp=pgm_read_byte(STR_p);
if(fs==0) //当fs=0时反显,否则正常显示
{
DataWrite(~Temp); //反显
}
else
{
DataWrite(Temp);
}
STR_p++;
}
Row++;
}
}
/********************************************************************************/
//函数名称:LCM_Screen_RAMstr(uchar Row,uchar Col,uchar *pstr,uchar Layer,uchar fs)
//函数功能:将动态(内存中)字符串输出到屏幕指定位置显示
//输入参数:low 行地址
//输入参数:Col 列地址
//输入参数:*pstr 字符串
//输入参数:Layer 显示区(Layer=2时在3区,否则在1区)
//输入参数:fs 显示方式(0,反显,否则正常显示)
//返 回 值:无
/********************************************************************************/
void LCM_Screen_RAMstr(uchar Row,uchar Col,uchar *pstr,uchar Layer,uchar fs)
{
uchar i,Temp;
const prog_char *STR_p;
uint CN=0;
uint Screen_Addr; //屏幕地址
if(Layer==2)
{
Screen_Addr=((Row*40)+Col+0x5000); //3区
}
else
{
Screen_Addr=((Row*40)+Col+0x2800); //1区
}
Row=(uchar)(Screen_Addr);
Col=(uchar)(Screen_Addr>>8);
CmdWrite(0x4f); //设置光标自动下移
while(*pstr) //指针内容非空
{
CmdWrite(0x46); //光标显示位置设置
DataWrite(Row++);
DataWrite(Col);
CmdWrite(0x42);
STR_p=&ASCII_16X8[0]; //取16x8 ASCII码点阵库地址
for(i=0;i<(*pstr-32);i++)
{
STR_p+=16;
}
for(i=0;i<16;i++)
{
Temp=pgm_read_byte(STR_p);
if(fs==0) //当fs=0时反显,否则正常显示
{
DataWrite(~Temp); //反显
}
else
{
DataWrite(Temp);
}
STR_p++;
}
pstr++;
CN++;
if(CN>39){break;}
}
CmdWrite(0x4c); //恢复光标自动移动方向
}
/*************************************************************************************************/
//函数名称:LCM_BigStrDisplay(uchar Row,uchar Col,uchar Layer,uchar Number)
//函数功能:数值输出到屏幕指定位置显示
//输入参数:low 行地址
//输入参数:high 列地址
//输入参数:Layer 显示区(Layer=2时在3区,否则在1区)
//输入参数:Number 显示的数值
//返 回 值:无
/*************************************************************************************************/
void LCM_NumberDisplay(uchar Row,uchar Col,uchar Layer,uchar Number,uchar fs)
{
switch (Number)
{
case 0:
{
LCM_Screen_str(Row,Col,"0",Layer,fs);
break;
}
case 1:
{
LCM_Screen_str(Row,Col,"1",Layer,fs);
break;
}
case 2:
{
LCM_Screen_str(Row,Col,"2",Layer,fs);
break;
}
case 3:
{
LCM_Screen_str(Row,Col,"3",Layer,fs);
break;
}
case 4:
{
LCM_Screen_str(Row,Col,"4",Layer,fs);
break;
}
case 5:
{
LCM_Screen_str(Row,Col,"5",Layer,fs);
break;
}
case 6:
{
LCM_Screen_str(Row,Col,"6",Layer,fs);
break;
}
case 7:
{
LCM_Screen_str(Row,Col,"7",Layer,fs);
break;
}
case 8:
{
LCM_Screen_str(Row,Col,"8",Layer,fs);
break;
}
case 9:
{
LCM_Screen_str(Row,Col,"9",Layer,fs);
break;
}
default:
{
LCM_Screen_str(Row,Col," ",Layer,fs);
break;
}
}
}
/****************************************************************/
//函数名称:On_Pic(void)
//函数功能:公司名头显示函数
//输出参数:无
//返 回 值:无
/****************************************************************/
void GS_NameDisplay(uchar Row,uchar Col,uchar Layer,uchar fs)
{
LCM_Screen_HZ(Row,Col,0,Layer,fs); //盘锦利方石油科技有限公司
LCM_Screen_HZ(Row,(Col+2),1,Layer,fs);
LCM_Screen_HZ(Row,(Col+4),2,Layer,fs);
LCM_Screen_HZ(Row,(Col+6),3,Layer,fs); LCM_Screen_HZ(Row,(Col+8),4,Layer,fs);
LCM_Screen_HZ(Row,(Col+10),5,Layer,fs);
LCM_Screen_HZ(Row,(Col+12),6,Layer,fs);
LCM_Screen_HZ(Row,(Col+14),7,Layer,fs);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -