在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
仿真如图所示:
本程序包含三个文件:LCD.c PORT.h lcd1602.h LCD.c文件的代码如下: 1 #include <reg51.h> 2 #include<intrins.h> 3 #include<PORT.h> 4 #include "lcd1602.h" 5 6 //初始化LCD1602 7 void init() 8 { 9 setFunc(1,1,0);//总线8,双行显示,显示5X7的点阵字符 10 delayMS(2);//延时2毫秒 11 12 clearScreen();//清屏 13 delayMS(2);//延时2毫秒 14 15 setInputMode(1,0);//光标右移,字符不动 06 16 delayMS(2);//延时2毫秒 17 18 setKaiGuan(1,0,0);//打开显屏,没有光标,不闪烁 0c 19 delayMS(2);//延时2毫秒 20 } 21 22 //第y+1行x+1列显示数据str 23 void disp(uchar x,uchar y,uchar *str) 24 { 25 setDataRegAddr(y*0x40|x); 26 while(*str) 27 write(DATA,*str++); 28 } 29 30 //光标左移 31 void curLeftMove() 32 { 33 setDataRegAddr(readCurAddr()-1); 34 } 35 36 //光标右移 37 void curRightMove() 38 { 39 setDataRegAddr(readCurAddr()+1); 40 } 41 42 //扫描按键 43 uchar scanKey() 44 { 45 uchar key = P3;//扫描P3口 46 if(key!=0xff)//表示有按键按下 47 { 48 delayMS(10);//去抖动 49 key=P3;//在扫描一次P3 50 while(P3!=0xff);//表示确实是有按键按下,防止连续按下产生的事件 51 } 52 return key; 53 } 54 //主方法 55 void main() 56 { 57 uchar i=0; 58 uchar key; 59 init(); 60 disp(3,0,"hello,world");//在LCD1602上显示hello,world 61 setKaiGuan(1,1,0); 62 63 //write(DATA,readCurAddr()); 64 while(1) 65 { 66 key=scanKey(); 67 switch(key) 68 { 69 case 0xfe: 70 curRightMove(); 71 break;//右移 72 73 case 0xfd: 74 curLeftMove(); 75 break;//左移 76 } 77 delayMS(10); 78 } 79 }
PORT.h的内容如下: 1 //定义端口,lcd1602的D0~D7连接P0口 2 #define LCD_DATA P0 3 sbit RS=P2^0 ; 4 sbit RW=P2^1 ; 5 sbit EN=P2^2 ;
lcd1602.h文件的内容如下: 1 #define uchar unsigned char 2 #define uint unsigned int 3 #define CMD 0 4 #define DATA 1 5 6 //延时毫秒 7 void delayMS(uint z) 8 { 9 uint i; 10 uchar j; 11 for(i=0;i<z;i++) 12 for(j=0;j<142;j++); 13 } 14 15 //读取忙标志 16 uchar readBF() 17 { 18 uchar bf=0; 19 EN=1; 20 LCD_DATA=0xff; 21 RS=0;//指令 22 RW=1;//读 23 bf=LCD_DATA;//读取LCD_DATA口数据 24 EN=0; 25 return bf; 26 } 27 28 //等待忙 29 void waitBusy() 30 { 31 while(readBF()&0x80); 32 } 33 34 //写数据/指令 35 void write(bit type,uchar di) 36 { 37 waitBusy(); 38 RS=type;//0表示指令,1表示数据 39 RW=0;//写 40 _nop_(); 41 LCD_DATA=di; 42 EN=1; 43 _nop_(); 44 EN=0; 45 } 46 47 //读取数据 48 uchar read_data() 49 { 50 uchar _data=0; 51 //waitBusy(); 52 EN=1; 53 RS=1;//表示数据 54 RW=1;//读 55 _data=LCD_DATA; 56 EN=0; 57 return _data; 58 } 59 //清屏 60 void clearScreen() 61 { 62 write(CMD,0x01); 63 } 64 65 //光标复位 66 void setCurFuwei() 67 { 68 write(CMD,0x02); 69 } 70 71 //置输入模式:光标和显示位置设置 72 //I/D:光标移动方向,高电平右移,低电平左移 73 //S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效 74 void setInputMode(bit ID,bit S) 75 { 76 write(CMD,0x04|ID*2|S); 77 } 78 79 //显示开/关控制 80 //D:控制整体的显示开与关,高电平表示开显示,低电平表示关显示。 81 //C:控制光标的开与关,高电平表示有光标,低电平表示无光标 82 //B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 83 void setKaiGuan(bit D,bit C,bit B) 84 { 85 write(CMD,0x08|(D*4)|(C*2)|B); 86 } 87 88 //光标或字符移位 89 //SC:高电平时显示移动的文字,低电平时移动光标 90 //RL:1表示右移,0表示左移 91 void setCurOrCharMove(bit SC,bit RL) 92 { 93 write(CMD,0x10|SC*8|RL*4); 94 } 95 96 //功能设置 97 //DL:高电平时为8位总线,低电平时为4位总线 98 //N:低电平时为单行显示,高电平时为双行显示 99 //F:低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。 100 void setFunc(bit DL,bit N,bit F) 101 { 102 write(CMD,0x20|(DL*16)|(N*8)|(F*4)); 103 } 104 105 //置字符发生存贮器地址 106 //addr:字符发生存贮器地址 107 void setCharOcCurRegAddr(uchar addr) 108 { 109 write(CMD,0x40|addr); 110 } 111 112 //置显示数据存贮器地址 113 void setDataRegAddr(uchar addr) 114 { 115 write(CMD,0x80|addr); 116 } 117 118 //读取光标地址 119 uchar readCurAddr() 120 { 121 uchar curAddr; 122 //LCD_DATA=0xff; 123 EN=1; 124 RS=0;//指令 125 RW=1;//读 126 curAddr=LCD_DATA&0x7f; 127 EN=0; 128 return curAddr; 129 }
|
请发表评论