搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2008-12-11 09:37:19 | 显示全部楼层 |阅读模式
   经过多天调式,优化程序。只用两个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) 

出0入0汤圆

 楼主| 发表于 2008-12-11 14:46:26 | 显示全部楼层
自己顶一下!!!

出0入0汤圆

发表于 2008-12-11 09:51:45 | 显示全部楼层
沙发! 不错,我来顶一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 15:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表