IO端口驱动LCD1602

2017-12-06 20:08:52来源: eefocus 关键字:IO端口  驱动LCD1602

只用两个IO端口驱动74LS164扩展成并口驱动LCD1602(四线模式),这是个完整简单的例子,可实现字符串左移200次,右移200次,不停的循环。现上传与大家共享成果!  

//引入头文件********************************************************* 
#include       

#include       
#include   "delay.h" 
#include   "delay.c"  

//熔丝配置*********************************************************** 
__CONFIG(PROTECT & CPD & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO); 

//端口定义*********************************************************** 
#define       Port      GPIO                               //端口址址 
#define       Tris      TRISIO                             //方向设置 

//脚位定义*********************************************************** 
#define       Dat       GPIO4                              //数据引脚 
#define       Clk       GPIO5                              //时钟引脚 

//显示字符*********************************************************** 
     unsigned char TopChar[] = {"www.picbbs.net   "};       // 
     unsigned char BotChar[] = {"ivws            "};       //        

//******************************************************************* 
//函数名称:PortInit(); 
//输入参数:无 
//输出参数:无 
//功能描述:端口设置 
//建造日期:2008.12.08 
//******************************************************************** 
void PortInit(void) 
 { 
     Port = 0x00;                                          //端口设置  
     Tris = 0x00; 
 } 

//******************************************************************* 
//函数名称:ConInit(); 
//输入参数:无 
//输出参数:无 
//功能描述:定时器设置 
//建造日期:2008.12.08 
//******************************************************************* 
void ConInit(void) 
 {    
     OPTION = 0x00;                                        //允许上拉  
     CMCON  = 0x07;                                        //关比较器 
 } 

//******************************************************************* 
//函数名称: TxLs164(data); 
//输入参数:串行数据 
//输出参数:无 
//功能描述:串行发送数据 
//建造日期:2008.12.08 
//******************************************************************* 
void TxLs164(unsigned char data) 
 { 
     unsigned char i; 
      
     i = 6;                                                //送出六位 
         
     do 
      { 
       Dat = 0;                                            //数据清零 
       Clk = 1;                                            //时钟置位 
       Clk = 0;                                            //时钟清零 
      } 
     while (--i);                                          //循环发送                                      

     i = 6;                                                //送出六位 

     do 
      { 
       Dat = 0;                                            //先高后低 

       if (data & 0x20) Dat = 1;                             

       Clk = 1;                                            //时钟置位 
       data <<= 1;                                         //数据左移 
       Clk = 0;                                            //时钟清零 
      }  
     while (--i);                                          //循环发送 
 } 
      
//******************************************************************* 
//函数名称: WritEDAta(data, rs); 
//输入参数:待写数据, 0 = 指令,1 = 数据 
//输出参数:无 
//功能描述:数据写入LCD 
//建造日期:2008.12.08 
//******************************************************************* 
void WriteData(unsigned char data, unsigned char rs) 
 {    
     unsigned char temp; 

     temp = data >> 4;                                     //取高四位 
     temp |= 1 << 5;                                       //使用置位 

     if (rs & 0x01) temp |=  1 << 4;                       //数据选择                              

     TxLs164(temp);                                        //写高四位  
     Dat = 1;                                              //使能下沿 
     Dat = 0; 
     DelayUs(50);                                          //延时等待 

     temp = data & 0x0f;                                   //取低四位 
     temp |= 1 << 5;                                       //使用置位 

     if (rs & 0x01) temp |=  1 << 4;                       //数据选择 

     TxLs164(temp);                                        //写高四位  
     Dat = 1;                                              //使能下沿 
     Dat = 0; 
     DelayUs(50);                                          //延时等待 
 } 

//******************************************************************* 
//函数名称:AddrSite(x, y); 
//输入参数:坐标参数 
//输出参数:无 
//功能描述:设置显示地址 
//建造日期:2008.12.08 
//******************************************************************* 
void AddrSite(unsigned char x, unsigned char y) 
 {    
     x &= 0x3f;                                            //截取地址       

     if (y == 0) 
      { 
       WriteData((0x80 | x), 0);                           //首行地址 
      } 

     else  
      { 
       WriteData((0xc0 | x), 0);                           //次行地址 
      } 
 } 

//******************************************************************* 
//函数名称:PriNTChar(*s); 
//输入参数:缓冲区首址 
//输出参数:无 
//功能描述:字符串输出显示 
//建造日期:2008.12.08 
//******************************************************************* 
void PrintChar(unsigned char *s) 
 { 
     while(*s)                                              
      { 
       WriteData(*s, 1);                                   //字符数据 
       s++;                                                //下个字符 
      } 
 } 

//******************************************************************* 
//函数名称:LcdInit(); 
//输入参数:无 
//输出参数:无 
//功能描述:液晶初始化 
//建造日期:2008.12.08 
//******************************************************************* 
void LcdInit(void) 
 {    
     unsigned char i = 3;   

     TxLs164(0x23);                                        //接口设置 
    
     do 
      { 
       Dat = 1;                                            //使能下沿 
       Dat = 0; 
       DelayUs(50);                                        //延时等待 
      } 
     while (--i); 

     TxLs164(0x22);                                        //四线模式  

     Dat = 1;                                              //使能下沿 
     Dat = 0; 
     DelayUs(50);                                          //延时等待 

     WriteData(0x28, 0);                                   //接口设置 
     WriteData(0x0c, 0);                                   //显示打开 
     WriteData(0x01, 0);                                   //显示清屏 
     WriteData(0x06, 0);                                   //光标右移 
 } 

//******************************************************************* 
//函数名称:ShiftChar(*buff); 
//输入参数:缓冲区首址, 0 = 左移 1 = 右移 
//输出参数:无 
//功能描述:移动字符 
//建造日期:2008.12.08 
//******************************************************************* 
void ShiftChar(unsigned char *buff, unsigned char rl) 
 { 
     unsigned char temp, i; 
      
     if (rl & 0x01)                                        //字符右移 
      {  
       temp = buff[15];                                    //取尾字符 
      
       for (i = 15; i > 0; i--)                               
        { 
         buff[i] = buff[i - 1];                            //数据右移 
        } 
      
       buff[0] = temp;                                     //首尾交换 
      } 
  
     else                                                  //字符左移 
      { 
       temp = buff[0];                                     //取首字符 

       for (i = 0; i < 15; i++) 
        { 
         buff[i] = buff[i + 1];                            //数据左移 
        } 
        
       buff[15] = temp;                                    //字符交换                                 
      } 
 } 

//******************************************************************* 
//函数名称:main(); 
//输入参数:无 
//输出参数:无 
//功能描述:主要程序 
//建造日期:2008.12.08 
//******************************************************************* 
void main(void)                                             
 {    
     unsigned char i, rl; 

     PortInit();                                           //脚位设置 
     ConInit();                                            //配置设置 
     LcdInit();                                            //液晶设置 
  
     DelayMs(50);                                          //短暂延时 
     AddrSite(0, 0);                                       //坐标设置 
     PrintChar(TopChar);                                   //发送字符 
            
     i  = 0;                                               //移动记数 
     rl = 0;                                               //左右移动    

     while (1) 
      { 
       if (i++ > 200)                                      //移动记数 
        { 
         i = 0;                                            //记数清零 
         rl ^= 0x01;                                       //移动取反  
        } 

       DelayMs(250);                                       //延时显示  
       ShiftChar(BotChar, rl);                             //移动字符  

       AddrSite(0, 1);                                     //坐标设置 
       PrintChar(BotChar);                                 //发送字符 
      }   
 } 

关键字:IO端口  驱动LCD1602

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2017120636618.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:pic单片机4*4键盘扫描程序
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
IO端口
驱动LCD1602

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved