行业资讯

proteus使用教程51单片机仿真

先上仿真图,图比较简单,一个51单片机最小系统,加上一个LM016L液晶显示器,需要注意的是,实际的LM016L芯片内部有上拉电阻,但是仿真中是没有的,如果用P0口传输数据的话,需要给P0口接上拉电阻。

proteus使用教程51单片机仿真

然后上代码,有详细的注释,就不多解释了。

#include<reg51.h>#include<intrins.h>//引脚定义sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit BF=P0^7;void delay1ms(){unsigned char i,j;for(i=0;i<10;i )for(j=0;j<33;j );}/*****************************************************函数功能:延时若干毫秒入口参数: n***************************************************/void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i )delay1ms();}/********************函数功能:判断液晶模块是否忙碌入口参数:无返回值:result 1忙碌 0空闲**********************/bit BusyTest(void){bit result;RS=0;RW=1;//此时才可以读状态E=1;//此时才允许读写_nop_();_nop_();_nop_();_nop_();//四个空操作,给硬件反应时间result=BF;//将忙碌标值赋值给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数: dictate***************************************************/void WriteInstruction(unsigned char dictate){while(BusyTest()==1);RS=0;RW=0;E=0;_nop_();_nop_();P0=dictate;_nop_();_nop_();_nop_();_nop_(); // 空操作四个机器周期,给硬件反应时间E=1;_nop_();_nop_();_nop_();_nop_(); // 空操作四个机器周期,给硬件反应时间E=0;}/*****************************************************函数功能:指定字符显示的实际地址入口参数: x***************************************************/void WriteAddress(unsigned char x){WriteInstruction(x|0x80); // 显示位置的确定方法规定为 "80H 地址码 x"}/*****************************************************函数功能:将数据 (字符的标准 ASCII 码) 写入液晶模块入口参数: y( 为字符常量 )***************************************************/void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS 为高电平, RW为低电平时,可以写入数据RW=0;E=0; //E 置低电平 ( 根据表 8-6 ,写指令时, E 为高脉冲,// 就是让 E 从 0 到 1 发生正跳变,所以应先置 "0"P0=y; // 将数据送入 P0 口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); // 空操作四个机器周期,给硬件反应时间E=1; //E 置高电平_nop_();_nop_();_nop_();_nop_(); // 空操作四个机器周期,给硬件反应时间E=0; // 当 E 由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对 LCD的显示模式进行初始化设置***************************************************/void LcdInitiate(void){delaynms(15); // 延时 15ms,首次写指令时应给 LCD一段较长的反应时间WriteInstruction(0x38); // 显示模式设置: 16×2 显示, 5×7 点阵, 8 位数据接口delaynms(5); // 延时 5ms ,给硬件一点反应时间WriteInstruction(0x38);delaynms(5); // 延时 5ms ,给硬件一点反应时间WriteInstruction(0x38); // 连续三次,确保初始化成功delaynms(5); // 延时 5ms ,给硬件一点反应时间WriteInstruction(0x0c); // 显示模式设置:显示开,无光标,光标不闪烁delaynms(5); // 延时 5ms ,给硬件一点反应时间WriteInstruction(0x06); // 显示模式设置:光标右移,字符不移delaynms(5); // 延时 5ms ,给硬件一点反应时间WriteInstruction(0x01); // 清屏幕指令,将以前的显示内容清除delaynms(5); // 延时 5ms ,给硬件一点反应时间}void main(void){LcdInitiate(); // 将液晶初始化WriteAddress(0x01); // 写 Date 的显示地址 , 将在第 1 行第 2 列开始显示WriteData('Z'); // 将字符常量写入 LCDWriteData('h'); // 将字符常量写入 LCDWriteData('a'); // 将字符常量写入 LCDWriteData('n'); // 将字符常量写入 LCDWriteData('g'); // 将字符常量写入 LCDWriteData(' '); // 将字符常量写入 LCDWriteData('S'); // 将字符常量写入 LCDWriteData('a'); // 将字符常量写入 LCDWriteData('n'); // 将字符常量写入 LCD}

相关推荐

手机

邹总:15818552076

微信
微信
分享本页
返回顶部