//*************************************************************************************************
//* *
//* ******************************LCD12864驱动程序************************** *
//* *
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************头文件及宏定义************************** *
//* *
//*************************************************************************************************
#include <at89x51.h>
#define RST P2_0
#define E P2_1
#define RW P2_2
#define DI P2_3
#define CS1 P2_5
#define CS2 P2_4
#define LCDPORT P0
#define BUSYSTATUS P0_7 //忙状态位。
//#define DISONSTATUS P0_5 //显示开关状态位。
//#define RSTSTATUS P0_4 //复位状态位。
#define LCDSTARTROW 0xC0 //设置起始行指令。
#define LCDPAGE 0xB8 //设置页指令。
#define LCDLINE 0x40 //设置列指令。
//*************************************************************************************************
//* *
//* ********************************读忙标志位********************************* *
//* *
//*************************************************************************************************
bit bCheckBusy()
{
LCDPORT=0xFF;
RW=1;
DI=0;
E=1;
E=0;
return BUSYSTATUS;
}
//*************************************************************************************************
//* *
//* ********************************写数据********************************* *
//* *
//*************************************************************************************************
void vWriteData(unsigned char ucData)
{
while(bCheckBusy());
LCDPORT=0xFF;
RW=0;
DI=1;
LCDPORT=ucData;
E=1;
E=0;
}
//*************************************************************************************************
//* *
//* ********************************写指令********************************* *
//* *
//*************************************************************************************************
void vWriteCMD(unsigned char ucCMD)
{
while(bCheckBusy());
LCDPORT=0xFF;
RW=0;
DI=0;
LCDPORT=ucCMD;
E=1;
E=0;
}
//*************************************************************************************************
//* *
//* ********************************LCD初始化函数******************************* *
//* *
//*************************************************************************************************
void vLCDInitialize()
{
CS1=1;
CS2=1;
vWriteCMD(0x38); //8位形式,两行字符。
vWriteCMD(0x0F); //开显示。
vWriteCMD(0x01); //清屏。
vWriteCMD(0x06); //画面不动,光标右移。
vWriteCMD(LCDSTARTROW); //设置起始行。
}
//*************************************************************************************************
//* *
//* ******************************显示自定义行********************************* *
//* *
//*************************************************************************************************
//在8×128的格子里显示自定义长度的一行
void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
{
unsigned char ucCount; //取值范围:ucPage:0~7;ucLine:0~127;
if(ucLine<64) //ucWidth:0~127;ucLine+ucWidth<1128。
{
CS1=1;
CS2=0;
vWriteCMD(LCDPAGE+ucPage);
vWriteCMD(LCDLINE+ucLine);
if((ucLine+ucWidth)<64)
{
for(ucCount=0;ucCount<ucWidth;ucCount++)
vWriteData(*(ucaRow+ucCount));
}
else
{
for(ucCount=0;ucCount<64-ucLine;ucCount++)
vWriteData(*(ucaRow+ucCount));
CS1=0;
CS2=1;
vWriteCMD(LCDPAGE+ucPage);
vWriteCMD(LCDLINE);
for(ucCount=64-ucLine;ucCount<ucWidth;ucCount++)
vWriteData(*(ucaRow+ucCount));
}
}
else
{
CS1=0;
CS2=1;
vWriteCMD(LCDPAGE+ucPage);
vWriteCMD(LCDLINE+ucLine-64);
for(ucCount=0;ucCount<ucWidth;ucCount++)
vWriteData(*(ucaRow+ucCount));
}
}
//*************************************************************************************************
//* *
//* *****************************汉字显示函数*********************************** *
//* *
//*************************************************************************************************
//此函数将16×16汉字显示在8×128的格子里。
void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)
{
vShowCustomRow(ucPage,ucLine,16,ucaChinMap);
vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16);
}
//*************************************************************************************************
//* *
//* *****************************字符显示函数*********************************** *
//* *
//*************************************************************************************************
//此函数将8×16字符显示在8×128的格子里。
void vShowOneChar(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
{
vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);
}
//*************************************************************************************************
//* *
//* **********************************显示图片*********************************** *
//* *
//*************************************************************************************************
void vShowGraph(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char ucHigh,unsigned char * ucaGraph)
{
unsigned char ucCount;
for(ucCount=0;ucCount<ucHigh;ucCount++)
vShowCustomRow(ucPage+ucCount,ucLine,ucWidth,ucaGraph+ucCount*ucWidth);
}
单片机51单片机12864大液晶屏proteus仿真实例.rar
需积分: 0 150 浏览量
更新于2023-12-10
收藏 84KB RAR 举报
单片机51单片机12864大液晶屏proteus仿真实例是一个深入学习和实践单片机控制技术的重要资源。这个压缩包包含了一系列基于51系列单片机的实操项目,利用Proteus软件进行仿真实验,同时也提供了DSN文件和Keil编程环境下的源代码,方便用户直接导入并运行。以下是关于这些知识点的详细说明:
1. **51单片机**:51系列单片机是微控制器领域中最经典的型号之一,由Intel公司推出,广泛应用于工业控制、家用电器、仪器仪表等领域。它的结构简单、指令集丰富,适合初学者学习和开发者快速实现项目。
2. **12864大液晶屏**:12864是指屏幕分辨率,即128个像素宽乘以64个像素高。这种液晶屏常用于单片机的显示输出,可以显示文字、图形,甚至简单的动画,是许多嵌入式系统的人机交互界面。
3. **Proteus仿真**:Proteus是一款强大的电子设计自动化(EDA)软件,它集成了电路原理图绘制、元器件库、虚拟原型仿真以及与多种编程环境的集成。在Proteus中,用户可以直观地看到单片机控制的硬件电路的工作情况,无需物理硬件即可进行调试,极大地提高了开发效率。
4. **Keil编程环境**:Keil是著名的嵌入式开发工具,尤其适用于8051系列单片机的C语言编程。它提供了集成开发环境(IDE)、编译器、调试器等,使得代码编写、编译和调试变得更为便捷。
5. **DSN文件**:DSN是Proteus中的工程文件格式,包含了电路的设计和配置信息。用户可以通过打开DSN文件在Proteus环境中重现电路布局,并进行仿真。
通过这个压缩包,学习者可以:
- 掌握51单片机的基本操作和编程技巧。
- 学习12864液晶屏的驱动程序编写,包括字符显示、图形绘制等。
- 了解如何使用Proteus进行电路仿真,理解硬件工作原理。
- 熟悉Keil的使用,包括创建项目、编写C代码、编译和下载到模拟器或实际硬件。
- 通过实际的仿真实例,提升问题解决能力和工程实践经验。
这份资源为单片机初学者和爱好者提供了一个全面学习和实践51单片机控制12864液晶屏的平台,结合理论与实践,有助于加深对单片机系统设计的理解。
若忘即安
- 粉丝: 1195
- 资源: 408
最新资源
- 【新增】-110 -食堂薪酬体系设计方案.doc
- 【新增】-112 -私立学校薪酬福利方案.doc
- 【新增】-113 -通用薪酬绩效管理制度方案.doc
- 【新增】-117 -外贸业务薪资及提成方案(暂行).doc
- 【新增】-118 -万科房地产公司全套销售薪酬管理制度 (1).doc
- 【新增】-116 -外贸薪酬制度原版.doc
- 【新增】-124 -物业公司薪酬体系方案(1).doc
- 【新增】-121 -物业公司绩效考核及薪酬方案.doc
- 【新增】-125 -物业公司组织架构与薪酬设计(修订版).doc
- 【新增】-129 -新华医院薪酬方案设计报告.doc
- 【新增】-134 -信托投资公司薪酬设计方案.doc
- 【新增】-137 -学校食堂员工薪资方案.doc
- 【新增】-139 -药店薪酬体系设计方案.doc
- 【新增】-138 -学校薪酬体系设计方案.doc
- 基于matlab 的ofdm仿真 具体点 想要加好友 不同调制方式ofdm误码率分析
- 【新增】-142 -油田公司薪酬制度与薪酬体系设计方案.doc