集成开发环境IDE Keil uVision4
仿真软件Proteus ISIS 7 Professional
【1】打开Proteus仿真软件,找到所需的元器件。MCU搜索AT89C52LCD1602搜索LM016L排阻搜索RESPACK-8【2】用元件器绘制好仿真电路图。LCD1602数据地址引脚连接在P0口,P0口默认是高阻状态,加排阻使其初始状态为高电平状态。LCD1602两个控制引脚接在P2口,LCD1602_RW引脚直接接地。P0口只是用低四位,高四位未使用。 说明:因为是仿真所以有些部分可以省略不管,节约时间。本经验只讲解往LCD 1602里写数据,不讲解从LCD 1602里读出数据,所以第3引脚,即读写控制引脚WR直接接地即可。MCU选用Proteus里最常见的AT89C52单片机,其他单片机原理相似。MCU的复位电路和振荡电路可以省略不画,但是在做事物电路图时复位电路和振荡电路必须有。
【1】打开Keil uVision4软件,建立好相应的工程。 【2】在工程中添加分组一下分组Core、User、Delay、LCD。Core存放启动代码STARTUP.A51,该启动代码用汇编编写的,初学者可以不用理会。User存放main.c文件,主函数所在的文件。Delay存放delay.c和delay.h文件,主要用于简答延时函数。LCD存放lcd.c和lcd.h文件主要是LCD1602相关的函数,比如写指令函数、写数据函数、初始化函数等 【3】设置IDE生成.hex文件,.hex文件通过烧录软件直接烧录到MCU中运行,仿真中也需要加载这么文件,才能看到效果。 【4】添加头文件路径。只要整个工程中的文件有.h结尾的都需要添加相应的文件路径。 【5】在main.c文件中编写主函数,然后编译下看是否有错,有错,检测并更改错误,知道没错为止。#include
【1】编写延时函数、LCD1602 GIOP引脚的定义与初始化、LCD1602写数据函数、LCD1602写指令函数、LCD1602初始化函数等等。 【2】延时函数:void vDelay(int i){ int x=0, y=0; for(x=0; x<100; x++) for(y=0; y>7)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();} if((dat>>6)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();} if((dat>>5)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();} if((dat>>4)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();} LCD1602_RS_SET(); LCD1602_EN_SET(); vDelay(5); LCD1602_EN_CLR(); if((dat>>3)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();} if((dat>>2)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();} if((dat>>1)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();} if((dat>>0)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();} LCD1602_RS_SET(); LCD1602_EN_SET(); vDelay(5); LCD1602_EN_CLR();} 【6】LCD1602写指令函数void vLCD1602_Write_Command(unsigned char cmd){ if((cmd>>7)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();} if((cmd>>6)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();} if((cmd>>5)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();} if((cmd>>4)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();} LCD1602_RS_CLR(); LCD1602_EN_SET(); vDelay(5); LCD1602_EN_CLR(); if((cmd>>3)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();} if((cmd>>2)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();} if((cmd>>1)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();} if((cmd>>0)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();} LCD1602_RS_CLR(); LCD1602_EN_SET(); vDelay(5); LCD1602_EN_CLR();} 【7】LCD1602初始化函数void vLCD1602_Initialization(void){ vLCD1602_GPIO_Configuration(); vDelay(5); vLCD1602_Write_Command(0x33); vDelay(5); vLCD1602_Write_Command(0x32); vDelay(5); vLCD1602_Write_Command(0x28); vDelay(5); vLCD1602_Write_Command(0x0C); vDelay(5); vLCD1602_Write_Command(0x01); vDelay(5);} 【8】LCD1602显示字符串函数void vLCD1602_Show_String(unsigned char line, unsigned char x, unsigned char *str){ unsigned char WriteAdd = 0; if(line == LINE1) WriteAdd = LINE1_HEAD_ADDRESS + x; else if(line == LINE2) WriteAdd = LINE2_HEAD_ADDRESS + x; if((WriteAdd
编写主函数测试程序。每隔一段时间加1,并显示在LCD1602上。#include 'lcd.h' void main(void){ unsigned char i = 0; unsigned char dat = 0; vLCD1602_Initialization(); //vLCD1602_Initialization vLCD1602_Show_String(LINE1, 1, 'System Running'); vLCD1602_Show_String(LINE2, 2, 'Count:'); while(1) { i++; dat = i / 100 + 0x30; vLCD1602_Write_Command(LINE2_HEAD_ADDRESS + 9); vLCD1602_Write_Data(dat); dat = (i / 10) % 10 + 0x30; vLCD1602_Write_Data(dat); dat = i%10 + 0x30; vLCD1602_Write_Data(dat); vDelay(100); }}
将.hex文件加载到仿真中,验证效果。
本人原创经验,仅供参考,若有不足之处请留言指正,若觉得写得好或凑合的话,请点击本页面左下角投票,谢谢了\(^o^)/
若有任何意见与帮助,请关注后私信留言,非喜勿喷
需要相关帮助请投票后关注私信