📄 lcd.c
字号:
/*--------------------------------------------------*/
/* AVR-ARM开发网论坛 */
/* http://www.avrarm.com */
/* AVR生成代码测试程序 */
/*--------------------------------------------------*/
/* 程序由AVR辅助开发工具V2.1.0自动生成 */
/* AVR系统的处理器为: ATMega16 */
/* AVR系统的晶振频率: 8.0000 Mhz */
/*--------------------------------------------------*/
#include <iom16v.h>
#include <macros.h>
#include "lcd.h"
/* 定义显示缓冲区 */
//TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];
const unsigned char turnf[8] = {7,6,5,4,3,2,1,0};
// 读状态
unsigned char RD_LCM(void)
{
unsigned char temp;
DATABUS = 0x00;
CD_H;
CS_L;
RD_L;
NOP();
temp=DATAIN;
RD_H;
DATABUS = 0xff;
CS_H;
return(temp);
}
// 读数据
unsigned char RD_DAT(void)
{
unsigned char temp;
DATABUS = 0x00;
CD_L;
CS_L;
RD_L;
NOP();
temp=DATAIN;
RD_H;
DATABUS = 0xff;
CS_H;
return(temp);
}
// 写数据
void WR_DAT(unsigned char val)
{
DATABUS = 0xff;
CD_L;
CS_L;
DATAOUT = val;
WR_L;
NOP();
NOP();
WR_H;
CS_H;
}
// 写命令
void WR_CMD(unsigned char val)
{
DATABUS = 0xff;
CD_H;
DATAOUT = val;
CS_L;
WR_L;
NOP();
NOP();
WR_H;
CS_H;
}
// 状态位STA1,STA0判断读写指令和读写数据
// 在读写数据或者写入命令前必须保证均为1
unsigned char fnSTA01(void)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((RD_LCM() & 0x03) == 0x03) // 读取状态
{
break;
}
}
return(i); // 若返回零说明错误
}
// 检查STA2,如果STA2=1 为自动读状态
unsigned char fnSTA2(void)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((RD_LCM() & 0x04) == 0x04)
{
break;
}
}
return(i); // 若返回零说明错误
}
// 状态位STA3 判断STA3 = 1 数据自动写状态
unsigned char fnSTA3(void)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((RD_LCM() & 0x08) == 0x08)
{
break;
}
}
return(i); // 若返回零说明错误
}
// 写双参数的指令
unsigned char fnPR1(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2)
{
if(fnSTA01() == 0)
{
return 1;
}
WR_DAT(uPar1);
if(fnSTA01() == 0)
{
return 2;
}
WR_DAT(uPar2);
if(fnSTA01() == 0)
{
return 3;
}
WR_CMD(uCmd);
return(0); // 返回0 成功
}
// 写单参数的指令
unsigned char fnPR11(unsigned char uCmd,unsigned char uPar1)
{
if(fnSTA01() == 0)
{
return 1;
}
WR_DAT(uPar1);
if(fnSTA01() == 0)
{
return 2;
}
WR_CMD(uCmd);
return(0); // 返回0 成功
}
// 写无参数的指令
unsigned char fnPR12(unsigned char uCmd)
{
if(fnSTA01() == 0)
{
return 1;
}
WR_CMD(uCmd);
return(0); // 返回0 成功
}
// 写数据
unsigned char fnPR13(unsigned char uData)
{
if(fnSTA3() == 0)
{
return 1;
}
WR_DAT(uData);
return(0); // 返回0 成功
}
// 读数据
unsigned char fnPR2(void)
{
unsigned char temp;
if(fnSTA01() == 0)
{
return 1; // 获取状态如果状态错
}
temp=RD_DAT();
return(temp); // 返回数据
}
// 设置当前地址
void fnSetPos(unsigned char urow, unsigned char ucol)
{
unsigned int iPos;
iPos = (unsigned int)urow * 30 + ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
}
/**********************/
/* 设置当前显示行列*/
/**********************/
void cursor(unsigned char uRow, unsigned char uCol)
{
fnSetPos(uRow * 16, uCol);
}
/**********************/
/* 液晶初始化*/
/**********************/
void LCD_Init(void)
{
LCD_CE_DDR |= LCD_CE_BIT;
CS_H;
LCD_CD_DDR |= LCD_CD_BIT;
CD_H;
LCD_RD_DDR |= LCD_RD_BIT;
RD_H;
LCD_WR_DDR |= LCD_WR_BIT;
WR_H;
LCD_RES_DDR |= LCD_RES_BIT;
RES_L;
NOP();
NOP();
RES_H;
fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
fnPR12(LC_CUR_SHP | 0x01); // 光标形状
fnPR12(LC_MOD_OR); // 显示方式设置
fnPR12(LC_DIS_SW | 0x08); // 显示开关设置,0x08开图形层
// GUI_ClearSCR();
}
/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat 填充的数据
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_FillSCR(TCOLOR dat)
{
unsigned int k;
//填充LCM
k=0x2580;
fnSetPos(0,0);
fnPR12(LC_AUT_WR);
do
{
fnPR13(dat);
k--;
}
while(k>0);
}
/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_ClearSCR(void)
{
unsigned int i;
fnSetPos(0,0);
//fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<GUI_LCM_XMAX*GUI_LCM_YMAX/8;i++)// 清一屏
{
fnSTA3();
fnPR13(0x0); // 写数据实际使用时请将0x55 改成0x0
}
fnPR12(LC_AUT_OVR); // 自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
}
/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x 指定点所在列的位置
* y 指定点所在行的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址
* 超出有效范围)
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
unsigned char GUI_Point(unsigned int x, unsigned char y, unsigned char color)
{
unsigned char x1;
if(x>=GUI_LCM_XMAX)
return(0);
if(y>=GUI_LCM_YMAX)
return(0);
x1 = x >> 3; // 取Y方向分页地址
fnSetPos(y,x1); // 起点定位
x1 = turnf[ x & 0x07 ];
if(color==1)
x1 = 0xF0 | x1 | 0x08; // 字节内位置计算
else
x1 = 0xF0 | x1 | 0x00; // 字节内位置计算
fnPR12(x1); // 画上屏幕S显示属性8 画点0 擦除点
return(1);
}
/****************************************************************************
* 名称:GUI_ReadPoint()
* 功能:读取指定点的颜色。
* 入口参数:x 指定点所在列的位置
* y 指定点所在行的位置
* ret 保存颜色值的指针
* 出口参数:返回0表示指定地址超出缓冲区范围
* 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
* RGB结构则R、G、B变量有效。
****************************************************************************/
unsigned char GUI_ReadPoint(unsigned int x, unsigned char y, TCOLOR *ret)
{
unsigned char x1,temp,temp1;
if(x>=GUI_LCM_XMAX)
return(0);
if(y>=GUI_LCM_YMAX)
return(0);
x1 = x/8; // 取Y方向分页地址
temp=x & 0x0007;
temp =(unsigned char)(7-temp);
temp = 1<<temp;
fnSetPos(y,x1); // 起点定位
if(fnSTA01() == 0)
{
return (0); // 获取状态如果状态错
}
temp1=RD_DAT();
if(temp1&temp==0)
*ret = 0x00;
else
*ret = 0x01;
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -