LCD1602小程序

仿真如图所示:

 

 

 

本程序包含三个文件: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 }

 

 

posted @ 2013-07-09 15:36  Please Call me 小强  阅读(667)  评论(0编辑  收藏  举报