📄 lcd.c
字号:
/****************************************Copyright(c)************************************
** 内蒙古大学理工学院
** 04级自动化系
** 谭新源
**-----文件说明---------------------------------------------------------------------------
**器件: PG160*128A
**控制器: T6963C
**说明: PROTEUS仿真软件中的灰度LCD显示器
**功能: LCD显示器的基本驱动函数
*****************************************************************************************/
/*****************************************LCD驱动函数************************************/
//具体连接的管脚根据实际电路选择
#include "config.h"
#define WR (1<<8) //写选通信号: 低电平有效,输出信号
#define RD (1<<9) //读选通信号: 低电平有效,输出信号
#define CD (1<<10) //通道选择信号:1为指令通道,0为数据通道
/*****************************************************************************************
**名称:ReadState()
**功能:读LCD的当前状态
**输入:无
**输出:uint8类型的LCD状态
*****************************************************************************************/
uint8 Read_State()
{
uint8 temp;
IODIR=0x700; //输入输出连接
IOSET=CD; //指令通道
IOCLR=RD; //读信号有效
temp=IOPIN; //读状态
IOSET=RD; //恢复原始状态
return(temp); //返回状态信息
}
/*****************************************************************************************
**名称:RW_Enable()
**功能:等待可读写
**输入:无
**输出:无
*****************************************************************************************/
void RW_Enable()
{
uint8 temp;
temp=Read_State(); //读LCD状态
while((temp&0x03)!=0x03) //等待可读写状态
temp=Read_State(); //读LCD状态
}
/*****************************************************************************************
**名称:Read_Auto()
**功能:等待自动读
**输入:无
**输出:无
*****************************************************************************************/
void Read_Auto()
{
uint8 temp;
temp=Read_State();
while((temp&0x04)!=0x04)//判断状态
temp=Read_State();
}
/*****************************************************************************************
**名称:Write_Auto()
**功能:等待自动写
**输入:无
**输出:无
*****************************************************************************************/
void Write_Auto() //等待自动写
{
uint8 temp;
temp=Read_State();
while((temp&0x08)!=0x08)
temp=Read_State();
}
/*****************************************************************************************
**名称:Write_Data(uint8 data1,uint8 data2,uint8 cmd,uint8 num)
**功能:写入数据或命令
**输入:data1:输入数据1, data2:输入数据2,cmd:输入的命令1,num:参数的个数
**输出:无
*****************************************************************************************/
void Write_Data(uint8 data1,uint8 data2,uint8 cmd,uint8 num)
{
uint8 temp;
temp=num;
if(temp==2)
{
RW_Enable();
IODIR=0x7ff;
IOCLR=CD;
IOCLR=0xff;
IOSET=data1;
IOCLR=WR;
IOSET=WR;
}
if(temp==2||temp==1)
{
RW_Enable();
IODIR=0x7ff;
IOCLR=CD;
IOCLR=0xff;
IOSET=data2;
IOCLR=WR;
IOSET=WR;
}
RW_Enable();
IODIR=0x7ff;
IOSET=CD;
IOCLR=0xff;
IOSET=cmd;
IOCLR=WR;
IOSET=WR;
}
/*****************************************************************************************
**名称:Read_Data()
**功能:读数据
**输入:无
**输出:返回uint8数据
*****************************************************************************************/
uint8 Read_Data () //读数据
{
uint8 temp;
RW_Enable();
IODIR=0x700;
IOCLR=CD;
IOCLR=RD;
temp=IOPIN;
IOSET=RD;
return(temp);
}
/*****************************************************************************************
**名称:Lcd_Init()
**功能:初始化LCD
**输入:无
**输出:无
*****************************************************************************************/
void Lcd_Init()
{
IODIR=CD|RD|WR;
IOSET=CD|RD|WR;
Write_Data(0x00,0x00,0x40,0x02); //设置文本显示首地址
Write_Data(0x14,0x00,0x41,0x02); //设置文本显示宽度
Write_Data(0x40,0x10,0x42,0x02); //设置图形显示首地址 非常的重要
Write_Data(0x14,0x00,0x43,0x02); //设置图形显示宽度
Write_Data(0x00,0x00,0xa1,0x00); //光标形状设置
Write_Data(0x00,0x00,0x80,0x00); //显示方式设置,“或”
Write_Data(0x00,0x00,0x9c,0x00); //显示开关设置
}
/*-------------------------------------------------------------------------结束---------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -