谢谢分享,我下个学习一下。 |
谢谢分享,我下个学习一下。 |
本帖最后由 zl2168 于 2017-5-7 20:38 编辑 实例67 LCD1602显示屏显示 本例编制的LCD 1602显示程序标准化程度很好,若要显示其他字符,只需给数组x[16]、y[16]重新赋值即可。 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1 。书中电路和程序设计有详细说明,程序语句条条有注解。 仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。 |
#include <reg51.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char #define lcd_data P0 sbit RS=P2^5; sbit RW=P2^6; sbit E=P2^7; /*uchar code table1[]="Huan Ying Cheng Zuo"; uchar code table2[]="Li Gong Nan Yuan Dao Le"; uchar code table3[]="Li Gong Xue Yuan Dao Le"; uchar code table4[]="Hua ban Qiao Dao Le"; uchar code table5[]="Xie Xie Cheng Zuo"; */ uchar code table1[]="LCD1206 check ok"; uchar code table2[]="study up"; void lcd_w_cmd(unsigned char com); //写命令字函数 void lcd_w_dat(unsigned char dat); //写数据函数 unsigned char lcd_r_start(); //读状态函数 void lcd_int1(); //LCD初始化函数 void delay (uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void delay1() { _nop_(); _nop_(); _nop_(); } unsigned char lcd_r_start() { unsigned char s; RW=1; //RW=1,RS=0,读LCD状态 delay1(); RS=0; delay1(); E=1; //E端时序 delay1(); s=lcd_data; //从LCD的数据口读状态 delay1(); E=0; delay1(); RW=0; delay1(); return(s); //返回读取的LCD状态字 } //函数名:lcd_w_cmd //函数功能:写命令字 //形式参数:命令字已存入com单元中 //返回值:无 void lcd_w_cmd(unsigned char com) { unsigned char i; do { // 查LCD忙操作 i=lcd_r_start(); // 调用读状态字函数 i=i&0x80; // 与操作屏蔽掉低7位 delay(2); } while(i!=0); // LCD忙,继续查询,否则退出循环 RW=0; delay1(); RS=0; // RW=1,RS=0,写LCD命令字 delay1(); E=1; //E端时序 delay1(); lcd_data=com; //将com中的命令字写入LCD数据口 delay1(); E=0; delay1(); RW=1; delay(255); } //函数名:lcd_w_dat //函数功能:写数据 //形式参数:数据已存入dat单元中 //返回值:无 void lcd_w_dat(unsigned char dat) { unsigned char i; do { // 查忙操作 i=lcd_r_start(); // 调用读状态字函数 i=i&0x80; // 与操作屏蔽掉低7位 delay(2); } while(i!=0); // LCD忙,继续查询,否则退出循环 RW=0; delay1(); RS=1; // RW=1,RS=0,写LCD命令字 delay1(); E=1; // E端时序 delay1(); lcd_data=dat; // 将dat中的显示数据写入LCD数据口 delay1(); E=0; delay1(); RW=1; delay(255); } void lcd_init() { lcd_w_cmd(0x38); // 设置工作方式 lcd_w_cmd(0x0c); // 设置光标 lcd_w_cmd(0x01); // 清屏 lcd_w_cmd(0x06); // 设置输入方式 lcd_w_cmd(0x80); // 设置初始显示位置 } void main() { uchar n,m=0; lcd_init(); lcd_w_cmd(0x80); for(m=0;m<16;m++) { lcd_w_dat(table1[m]); delay(200); } while(1) { lcd_w_cmd(0xC4); for(n=0;n<8;n++) { lcd_w_dat(table2[n]); delay(200); } } } 程序附上,你可以看看。我只改变了,使能端,你可以改。 |
1602.png (9.66 KB, 下载次数: 48)
你的主程序不应该写while(1);等待,还有你1602的各个函数有误