专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

pic单片机两个IO口四线驱动LCD1602

作者:佚名   来源:本站原创   点击数:  更新时间:2013年08月06日   【字体:

   经过多天调式,优化程序。只用两个IO端口驱动74LS164扩展成并口驱动LCD1602(四线模式),这是个完整简单的例子,可实现字符串左移200次,右移200次,不停的循环。现上传与大家共享成果!//引入头文件*********************************************************
#include      <pic.h>
#include      <pic12f6x.h>
#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.pic16.com   "};       //
     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);                                 //发送字符
      } 
 }



源代码下载:http://www.51hei.com/f/1602ym.rar
仿真文件下载:http://www.51hei.com/f/1602fz.rar

 

关闭窗口

相关文章