IO端口驱动LCD1602

发布者:数据梦行者最新更新时间:2017-12-06 来源: eefocus关键字:IO端口  驱动LCD1602 手机看文章 扫描二维码
随时随地手机看文章

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

//引入头文件********************************************************* 
#include      IC.h> 

#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 引用地址:IO端口驱动LCD1602

上一篇:pic单片机4*4键盘扫描程序
下一篇:LCD1602显示C语言

推荐阅读最新更新时间:2024-03-16 15:48

自制单片机之四……LCD1602驱动
  LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示: 字符型LCD的引脚定义 iframe id="iframe_0.16092616319656372" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%
[单片机]
自制单片机之四……<font color='red'>LCD1602</font>的<font color='red'>驱动</font>
ATMEGA16 IO端口相关总结
ATMEGA16 IO端口相关的寄存器总共有三个DDRX、PORTX和PINX。如果要对IO操作基本上就是对这三个寄存器进行相关的操纵。DDRX也称为数据方向寄存器、PORTX称为数据寄存器、PINX称为端口输入引脚。 DDRX的作用: 当DDRX = 0时,表示的是某端口的引脚为输入;当DDRX = 0xff时表示某端口的引脚为输出。 引脚的状态:输入或者输出是根据什么定义的呢? 是根据高低电平是输入单片机还是从单片机输出。输入是指:不属于单片机的外部的电平输入到单片机;输出是指:单片机的电平输出到单片机的外部。 PORTX的作用: 当DDRX = 0时,若把PORTX置位则表示启动了上拉电阻;若PORTX为0,
[单片机]
ATMEGA16 <font color='red'>IO</font><font color='red'>端口</font>相关总结
51单片机驱动LCD1602程序详解
  51单片机LCD1602程序详解   LCD1602   工业字符型液晶。1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符。   特殊接口说明   RS:寄存器选择输入端   RS=1:指向数据寄存器   RS=0:指向指令寄存器   RW:读写控制输入端   RW=0:写操作 RW=1:读操作   E:使能信号输入端   读操作时,高电平有效;   写操作时,下降沿有效;   程序编写:   #include《reg51.h》   #include《intrins.h》 //其中有nop函数的定义   /*对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时
[单片机]
51单片机<font color='red'>驱动</font><font color='red'>LCD1602</font>程序详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved