1185|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

LCD1602的MSP430驱动函数 [复制链接]

C文件 LCD1602_Driver.c



  1 /**************引用头文件***************/
  2 #include <msp430F149.h>         //视具体单片机型号引用不同头文件
  3  #include "LCD1602_Driver.h"
  4  #define uchar unsigned char
  5  #define uint unsigned int
  6 
  7 /**************接口定义***************/
  8 #define DataDir     P4DIR       //8位数据线=P4口
  9 #define DataPort    P4OUT
 10 #define DataIn      P4IN                
 11 #define Busy        0x80        //Busy信号为数据线最高位BIT7
 12 #define CtrlDir     P3DIR
 13 #define CLR_RS P3OUT&=~BIT0;    //RS = P3.0    
 14 #define SET_RS P3OUT|=BIT0;    
 15 #define CLR_RW P3OUT&=~BIT1;    //RW = P3.1
 16 #define SET_RW P3OUT|=BIT1;    
 17 #define CLR_EN P3OUT&=~BIT2;    //EN = P3.2    
 18 #define SET_EN P3OUT|=BIT2;    
 19 
 20 /*******************************************
 21 函数名称:LcdWriteCommand
 22 功    能:向液晶模块写入命令
 23 参    数:cmd--命令,
 24           chk--是否判忙的标志,1:判忙,0:不判
 25 返回值  :无
 26 ********************************************/
 27 void LcdWriteCommand(uchar cmd,uchar chk) 
 28 {
 29 
 30     if (chk) CheckBusy();   // 检测忙信号?
 31     
 32     CLR_RS;    
 33     CLR_RW; 
 34     _NOP();
 35 
 36     DataPort = cmd;             //将命令字写入数据端口 
 37     _NOP();                    
 38     
 39     SET_EN;                     //产生使能脉冲信号
 40     _NOP();
 41     _NOP();
 42     CLR_EN;            
 43 }
 44     
 45 /*******************************************
 46 函数名称:LcdWriteData
 47 功    能:向液晶显示的当前地址写入显示数据
 48 参    数:data--显示字符数据
 49 返回值  :无
 50 ********************************************/
 51 void LcdWriteData( uchar DataByte ) 
 52 {
 53     CheckBusy();        //等待液晶不忙
 54 
 55     SET_RS;
 56     CLR_RW; 
 57     _NOP();
 58 
 59     DataPort = data;        //将显示数据写入数据端口
 60     _NOP();
 61 
 62     SET_EN;                 //产生使能脉冲信号
 63     _NOP(); 
 64     _NOP(); 
 65     CLR_EN;        
 66 }
 67 /*******************************************
 68 函数名称:CheckBusy
 69 功    能:检测1602是否忙,等待1602液晶完成内部操作
 70 参    数:无
 71 返回值  :无
 72 ********************************************/
 73 void CheckBusy(void)
 74 {
 75     DataDir &= 0x00;  //将P4口切换为输入状态
 76 
 77     CLR_RS;
 78     SET_RW;
 79     _NOP();
 80     SET_EN; 
 81     _NOP();
 82     _NOP();
 83     
 84     while((DataIN & Busy)!=0);  //检测忙标志
 85 
 86     CLR_EN;
 87 
 88     DataDir |= 0xFF;  //将P4口切换为输出状态
 89 }    
 90                        
 91 /*******************************************
 92 函数名称:Delay5ms
 93 功    能:延时约5ms
 94 参    数:无
 95 返回值  :无
 96 ********************************************/
 97 void Delay5ms(void)
 98 { 
 99     uint i=40000;
100     while (i != 0)
101     {
102         i--;
103     }
104 }
105 
106 /*******************************************
107 函数名称:LcdReset
108 功    能:对1602液晶模块进行复位操作
109 参    数:无
110 返回值  :无
111 ********************************************/
112 void LcdReset(void) 
113 {
114     CtrlDir |= 0x07;                 //控制线端口设为输出状态 
115     DataDir  = 0xFF;                 //数据端口设为输出状态
116   
117     LcdWriteCommand(0x38, 0);        //规定的复位操作
118     Delay5ms();
119     LcdWriteCommand(0x38, 0);        
120     Delay5ms();
121     LcdWriteCommand(0x38, 0);
122     Delay5ms();
123 
124     LcdWriteCommand(0x38, 1);        //显示模式设置
125     LcdWriteCommand(0x08, 1);        //显示关闭
126     LcdWriteCommand(0x01, 1);        //显示清屏
127     LcdWriteCommand(0x06, 1);        //写字符时整体不移动
128     LcdWriteCommand(0x0c, 1);        //显示开,不开游标,不闪烁
129 }
130 /*******************************************
131 函数名称:LocateXY
132 功    能:向液晶输入显示字符位置的坐标信息
133 参    数:x--位置的列坐标0-15
134           y--位置的行坐标0-1
135 返回值  :无
136 ********************************************/
137 void LocateXY(uchar x,uchar y) 
138 {
139     uchar temp;
140 
141     temp = x&0x0f;
142     y &= 0x01;
143     if(y)   temp |= 0x40;  //如果在第2行
144     temp |= 0x80;//第一行为0x80,第二行为0x80+0x40
145 
146     LcdWriteCommand(temp,1);
147 }
148 /*******************************************
149 函数名称:Disp1Char
150 功    能:在某个位置显示一个字符
151 参    数:x--位置的列坐标0-15
152           y--位置的行坐标0-1
153           data--显示的字符数据
154 返回值  :无
155 ********************************************/
156 void Disp1Char(uchar x,uchar y,uchar DataByte) 
157 {
158     LocateXY( x, y );            
159     LcdWriteData( DataByte );        
160 }
161 /***********************************************
162 函数名称:DispStr
163 功    能:让液晶从某个位置起连续显示一个字符串
164 参    数:x--位置的列坐标0-15
165           y--位置的行坐标0-1
166           ptr--指向字符串存放位置的指针
167 返回值  :无
168 ***********************************************/
169 void DispStr(uchar x,uchar y,uchar *ptr) 
170 {
171     uchar *temp;
172     uchar i,n = 0;
173     
174     temp = ptr;
175     while(*ptr++ != '\0')   n++;    //计算字符串有效字符的个数
176     
177     for (i=0;i<n;i++)
178     {
179         Disp1Char(x++,y,temp[i]);
180         if (x == 0x0f)
181         {
182            x  = 0; 
183            y ^= 1;//异或操作,换行
184         }
185     }
186 }
187 /*******************************************
188 函数名称:DispNchar
189 功    能:让液晶从某个位置起连续显示N个字符
190 参    数:x--位置的列坐标0-15
191           y--位置的行坐标0-1
192           n--字符个数
193           ptr--指向字符存放位置的指针
194 返回值  :无
195 ********************************************/
196 void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) 
197 {
198     uchar i;
199     
200     for (i=0;i<n;i++)
201     {
202         Disp1Char(x++,y,ptr[i]);
203         if (x == 0x0f)
204         {
205            x = 0; 
206            y ^= 1;
207         }
208     }
209 }

相应头文件 LCD1602_Driver.h



 1 #define uchar unsigned char
 2 #define uint unsigned int
 3 /**************底层函数***************/
 4 void LcdWriteCommand(uchar cmd,uchar chk);
 5 void LcdWriteData( uchar DataByte );
 6 void CheckBusy(void);
 7 void Delay5ms(void);
 8 /**************功能函数***************/
 9 void LcdReset(void);
10 void LocateXY(uchar x,uchar y);
11 void Disp1Char(uchar x,uchar y,uchar DataByte);
12 void DispStr(uchar x,uchar y,uchar *ptr);
13 void DispNChar(uchar x,uchar y, uchar n,uchar *ptr);
 

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表