//*************************************************************************************************
//* *
//* ******************************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 7 浏览量
更新于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液晶屏的平台,结合理论与实践,有助于加深对单片机系统设计的理解。
若忘即安
- 粉丝: 1185
- 资源: 408
最新资源
- 基于Python+ Dijkstra 算法的最短路径规划
- 上机六 Java UI设计及图形功能.mhtml
- 毕设-ssm的最多跑一次微信小程序-源码-LW-PPT.rar
- 圣诞树网页HTML代码,这个版本包含了更多的交互性和动态效果
- 基于 Python 控制台的动态规划 0-1 背包问题 的课程设计作业程序实现
- 矩阵与线程的对应关系图
- location-cleaned16.7驱动
- 机器学习(预测模型):用户对ChatGPT(一个人工智能聊天机器人)的评价和反馈数据集
- int201 Decision Computation and Language xjtlu 复习笔记
- GEMM优化代码实现1-1PPT
- 操作系统课设-虚拟文件系统模拟-基于java实现
- AMGA 算法是基于微生物群体群落的演化过程而来的一类元启发式算法,其核心思想是借鉴微生 物在进化过程中的竞争、合作、交流等行为特征,对问题进行求解 AMGA 算法的主要特点包括 了:1)
- 机器学习(预测模型):地震检波器数据集
- 计算机专业学习和职业指南
- 基于Python+socket的聊天管理系统
- 蓝桥杯嵌入式-主板或主板+拓展板测试