[原创]两个IO端口驱动LCD1602 【恢复】

2020-02-10 08:47发布

   经过多天调式,优化程序。只用两个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.ouravr.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 = buff[i - 1];                            //数据右移

        }

     

       buff[0] = temp;                                     //首尾交换

      }

 

     else                                                  //字符左移

      {

       temp = buff[0];                                     //取首字符



       for (i = 0; i < 15; i++)

        {

         buff = 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);                                 //发送字符

      }  

 }





(原文件名:LCD1.jpg) 





(原文件名:LCD2.JPG) 



点击此处下载 ourdev_536997.rar(文件大小:33K) (原文件名:Lcd1602.rar) 



点击此处下载 ourdev_536998.rar(文件大小:27K) (原文件名:Lcd1602仿真.rar) 



点击此处下载 ourdev_536999.pdf(文件大小:644K) (原文件名:LCD 数据手册.pdf) 



点击此处下载 ourdev_537000.pdf(文件大小:21K) (原文件名:LCD 应用电路.pdf) 
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。