搜索
bottom↓
回复: 67

成功了!任意3个io通过两个595级联驱动LCD1602,并且还控制8个继电器(cvavr)

[复制链接]

出0入0汤圆

发表于 2007-9-10 00:18:46 | 显示全部楼层 |阅读模式











// main.c


#include <mega8.h>
#include <delay.h>
#include "lcd1602.h"

unsigned char relay=0x55;//继电器通断状态变量,暂时没有用,先设置一个数值
//-----------------------------------------------------------
//主函数
//-----------------------------------------------------------
void main(void)
{

   char p1[]="Hello World!";
   char p2[]="Cqmiao@163.com";
   char p3[]="Create by cqmiao";
   char p4[]="2007-09-09";
   DDRB=0x31;
   PORTB=0x31;
   LCD1602_init();
   LCD1602_clear();                     //显示清屏

   while(1)
   {
         LCD1602_clear();                     //显示清屏
         LCD1602_write_string(2,0,p1);
         LCD1602_write_string(1,1,p2);
         delay_ms(1000);
         LCD1602_clear();                     //显示清屏
         LCD1602_write_string(0,0,p3);
         LCD1602_write_string(5,1,p4);
         delay_ms(1000);
   }
}

出0入0汤圆

 楼主| 发表于 2007-9-10 00:19:19 | 显示全部楼层
//lcd1602.h 头文件



//定义595与LCD的接口

#define LCD_RS         0x08 //595输出Q4
#define LCD_EN         0x04 //595输出Q5
#define LCD_DATA       0xf0   //595输出Q0 Q1 Q2 Q3

//定义595与MCU的接口
#define SER   PORTB.0
#define SRCLK PORTB.4
#define RCLK  PORTB.5

void LCD1602_init         (void);
void LCD1602_en_write     (void);
void LCD1602_clear        (void);
void LCD1602_write_char   (unsigned char command,unsigned char data);
void LCD1602_set_xy       (unsigned char x, unsigned char y);
void LCD1602_write_string (unsigned char X,unsigned char Y,unsigned char *s);
void WriteSIOByte         (unsigned char lcd,unsigned char relays);

#include <mega8.h>
#include <delay.h>
/**********************************************************
光标命令
LCD1602_write_char(1,0x0e);    //光标开
LCD1602_write_char(1,0x0d);    //光标所在字符闪烁
LCD1602_write_char(1,0x0c);    //光标关
**********************************************************/
extern unsigned char relay;
static unsigned char LCD_PORT;
void LCD1602_init(void)
{
    LCD_PORT &=  0x0f;
    LCD_PORT |=  0x20; //等效LCD_DATA=0x20;
    WriteSIOByte(LCD_PORT,relay);
    LCD1602_en_write();
    //delay_us(50);                  //如果晶振频率太高,则可相应提高延时
   
    LCD1602_write_char(1,0x28);      //4bit test
    LCD1602_write_char(1,0x0c);      //显示开
    LCD1602_write_char(1,0x01);      //显示清屏
    LCD1602_write_char(1,0x06);      //显示光标移动设置
}

void LCD1602_en_write(void)          //EN端产生一个高电平脉冲,写LCD
{
    LCD_PORT |= LCD_EN;
    WriteSIOByte(LCD_PORT,relay);
    //delay_us(30);                    //如果晶振频率太高,则可相应提高延时
    LCD_PORT &= ~LCD_EN;
    WriteSIOByte(LCD_PORT,relay);
}

/************************************************************************/
/* LCD1602清屏                                                          */
/************************************************************************/
void LCD1602_clear(void)
{
    LCD1602_write_char(1,0x01);
    delay_ms(5);
}

/*-----------------------------------------------------------------------
LCD1602_write_char    : 英文字符串显示函数

输入参数:*s      :英文字符串指针;
          X、Y    : 显示字符串的位置,X:0-15,Y:0-1
                    LCD第一行显示寄存器地址:0x80-0x8F
                    LCD第一行显示寄存器地址:0xC0-0xCF
-----------------------------------------------------------------------*/
void LCD1602_write_char(unsigned char command,unsigned char data)
{
    unsigned char datah,datal;        

    datah = data;
    datal = data<<4 ;
    if (command == 0)                       //data
       {
       LCD_PORT |= LCD_RS;                  //RS=1
       WriteSIOByte(LCD_PORT,relay);
       }
    else                                    //command
       {
       LCD_PORT &= ~LCD_RS;                  //RS=0
       WriteSIOByte(LCD_PORT,relay);
       }
    LCD_PORT &= 0x0f;
    WriteSIOByte(LCD_PORT,relay);
    LCD_PORT |= datah&0xf0;
    WriteSIOByte(LCD_PORT,relay);            //send high 4bit
    LCD1602_en_write();

    LCD_PORT &= 0x0f;
    WriteSIOByte(LCD_PORT,relay);
    LCD_PORT |= datal&0xf0;
    WriteSIOByte(LCD_PORT,relay);            //send low 4bit
    LCD1602_en_write();
}


/*-----------------------------------------------------------------------
LCD_set_xy        : 设置LCD显示的起始位置

输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
                    LCD第一行显示寄存器地址:0x80-0x8F
                    LCD第一行显示寄存器地址:0xC0-0xCF
-----------------------------------------------------------------------*/
void LCD1602_set_xy( unsigned char x, unsigned char y )
{
    unsigned char address;
    if (y == 0)
       address = 0x80 + x;
    else
       address = 0xc0 + x;
    LCD1602_write_char( 1,address );
}
/*-----------------------------------------------------------------------
LCD1602_write_string  : 英文字符串显示函数

输入参数:*s      :英文字符串指针;
          X、Y    : 显示字符串的位置
-----------------------------------------------------------------------*/
void LCD1602_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
    LCD1602_set_xy( X, Y );
    while (*s)
    {
        LCD1602_write_char( 0, *s );
        s++;
    }
}

void WriteSIOByte(unsigned char lcd,unsigned char relays)
{
  unsigned char i;

  for (i=0;i<8;i++)
  {
    SRCLK=0;//拉低74HC595时钟
    SER=relays&0x01;//发送74HC595一位串行数据
    relays=relays>>1;//右移一位数据
    SRCLK=1;//拉高74HC595时钟
    #asm("nop");//延时
  }

  for (i=0;i<8;i++)
  {
    SRCLK=0;//拉低74HC595时钟
    SER=lcd&0x01;//发送74HC595一位串行数据
    lcd=lcd>>1;//右移一位数据
    SRCLK=1;//拉高74HC595时钟
    #asm("nop");//延时
  }

  SER=1;//释放数据总线
//以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令
  RCLK=0;
  #asm("nop");//延时
  RCLK=1;//打入并行数据
}

出0入0汤圆

发表于 2007-9-10 08:57:17 | 显示全部楼层

出0入0汤圆

发表于 2007-9-10 09:32:25 | 显示全部楼层

出0入0汤圆

发表于 2007-9-10 09:37:07 | 显示全部楼层
用那个狗日的仿真器仿真能行,实际做出来就有问题,多实际点好一些

出0入0汤圆

 楼主| 发表于 2007-9-10 10:05:10 | 显示全部楼层
我是在搭建电路采用,仿真过了,然后进行硬件调试,因为平时没什么时间去焊接,只有调试好了,再上硬件去调试。软件仿真过了的话应该实际应用上面调整也不太多了。

出0入0汤圆

发表于 2007-9-10 12:14:56 | 显示全部楼层
只能写不能读,有些功能实现起来比较麻烦

出0入0汤圆

 楼主| 发表于 2007-9-10 15:53:44 | 显示全部楼层
楼上说的确实也是,只不过对于单纯的显示够用了~~~~~特别是对于M8这种io稀少的芯片

出0入0汤圆

发表于 2007-10-19 09:26:00 | 显示全部楼层
//定义595与LCD的接口

#define LCD_RS         0x08 //595输出Q4
#define LCD_EN         0x04 //595输出Q5
#define LCD_DATA       0xf0   //595输出Q0 Q1 Q2 Q3

这里595与lcd接口可以修改吗?是否只要修改这里?

出0入0汤圆

 楼主| 发表于 2007-10-19 13:54:04 | 显示全部楼层
595与Lcd连接修改的话就麻烦

出0入0汤圆

发表于 2007-10-19 16:43:55 | 显示全部楼层
省IO口﹐但是麻煩

出0入0汤圆

 楼主| 发表于 2007-10-30 01:02:56 | 显示全部楼层
从模拟器上面移植到实际电路上面一次成功,但是需要注意的是MR必须上拉。



出0入0汤圆

发表于 2007-10-30 08:05:35 | 显示全部楼层
不错,在IO口比较紧张的情况下是个好的方法。

出0入0汤圆

发表于 2007-10-30 15:31:05 | 显示全部楼层
不好
在芯片这么便宜的今天,没必要搞那么多的硬件东西出来
多一个595就会多一些问题
还是经典的东西好
至少给产品的量产带来不少好处

出0入0汤圆

发表于 2009-7-26 18:58:29 | 显示全部楼层
如果在多个数字的IC和多个单片机的话,
在同价钱我优先选数字IC的,
单片机在我修理当中是最麻烦的事!
烂了就没戏了!
还有不稳定是肯定的!

出0入0汤圆

发表于 2009-7-27 00:45:17 | 显示全部楼层
14楼是修理的吧?

出0入0汤圆

发表于 2009-7-27 16:33:59 | 显示全部楼层
只有做出来,那就付出了心血.辛苦了.顶

出0入10汤圆

发表于 2009-7-27 18:17:17 | 显示全部楼层
15楼   做设计必须考虑修理!!!   没有谁敢说自己设计的东西不坏!!!

出0入20汤圆

发表于 2009-7-27 18:28:35 | 显示全部楼层
不错。

出0入0汤圆

发表于 2009-7-27 19:09:04 | 显示全部楼层
【12楼】 cltemail 常乐天
不错,在IO口比较紧张的情况下是个好的方法。
==================================
可惜 这个东东很难在干扰大的场合工作

出0入0汤圆

发表于 2009-7-27 19:17:15 | 显示全部楼层
好东西,程序资源够用,支持这种做法。

出0入0汤圆

发表于 2009-7-27 19:55:45 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2009-10-28 14:54:20 | 显示全部楼层
赞一个

出0入0汤圆

发表于 2009-10-28 16:29:21 | 显示全部楼层
赞一个

出0入0汤圆

发表于 2009-10-28 16:49:02 | 显示全部楼层
用一片595够了,也能控制1602LCD和8个继电器。
595输出可以给继电器和1602复用,1602 数据传输期间继电器状态错乱,但只要速度较快,如1mS内,继电器响应不过来,会保持原状态。

出0入0汤圆

发表于 2009-11-5 19:09:34 | 显示全部楼层
很好、、、顶一个、、

出0入0汤圆

发表于 2009-11-5 21:29:53 | 显示全部楼层
24楼,你的想法用在试验的时候行

如果工业控制,那太危险了

出0入0汤圆

发表于 2009-11-12 10:49:21 | 显示全部楼层
不合理!

出0入0汤圆

发表于 2009-11-12 15:08:02 | 显示全部楼层
术到需时才有用!

出0入0汤圆

发表于 2009-11-13 10:18:43 | 显示全部楼层
mark,不错,关键的时候很有用

出0入0汤圆

发表于 2010-1-3 17:03:44 | 显示全部楼层
楼主的继电器估计要乱跳了!!

出0入0汤圆

发表于 2010-1-3 20:38:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-3 21:05:09 | 显示全部楼层
mark一个

出0入0汤圆

发表于 2010-1-12 10:30:00 | 显示全部楼层
人民的创造力是无限的

出0入0汤圆

发表于 2010-1-12 12:38:51 | 显示全部楼层

出0入0汤圆

发表于 2010-1-24 15:45:28 | 显示全部楼层
LZ,如果D4-D7和Q0-Q3反过来接是怎么写程序呢?我把每半个字节反过来发怎么没有用呀

出0入0汤圆

发表于 2010-1-24 16:42:24 | 显示全部楼层
先留着··到时候再说···估计可能会用到啊

出0入0汤圆

发表于 2010-1-24 16:46:49 | 显示全部楼层
不能读忙了。。。但这个不是主要问题。

出0入0汤圆

发表于 2010-1-28 12:17:46 | 显示全部楼层
呵呵,不错,学习了,

出0入0汤圆

发表于 2010-1-31 16:25:06 | 显示全部楼层
MARK

出10入10汤圆

发表于 2010-1-31 16:46:31 | 显示全部楼层
【19楼】 xgame
       【12楼】 cltemail 常乐天
        不错,在IO口比较紧张的情况下是个好的方法。
==================================
可惜 这个东东很难在干扰大的场合工作


_____________________________
如果布局布线做好了一样没问题,做不好的话,就是只有M8也有问题

出0入0汤圆

发表于 2010-1-31 21:53:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-2 15:51:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-25 15:27:35 | 显示全部楼层
好东西,有创意!

出0入0汤圆

发表于 2010-6-26 08:29:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-26 09:56:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-27 10:00:26 | 显示全部楼层
mark

出0入4汤圆

发表于 2010-7-14 14:52:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-11 11:31:02 | 显示全部楼层
很好 我去试一试

出0入0汤圆

发表于 2010-9-29 19:42:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-4 17:57:00 | 显示全部楼层
很好 我也试一试

出0入0汤圆

发表于 2010-11-5 08:16:00 | 显示全部楼层
强悍!!!

出0入0汤圆

发表于 2010-11-7 11:18:26 | 显示全部楼层
好酷!!学习学习~~~~!

出0入0汤圆

发表于 2011-5-10 17:41:37 | 显示全部楼层
m!

出0入0汤圆

发表于 2011-5-10 21:59:28 | 显示全部楼层
这个是可行的,我这里有一块,,用两个595,,控制1602液晶跟处理4个按键,,就可以,可行的!

出0入0汤圆

发表于 2011-5-30 15:14:43 | 显示全部楼层
可以用来做IO输入吗?

出0入0汤圆

发表于 2011-5-30 19:34:07 | 显示全部楼层
不合理呀不合理
头像被屏蔽

出0入0汤圆

发表于 2011-6-1 10:31:15 | 显示全部楼层
好东西啊。学习了!

出0入0汤圆

发表于 2011-6-1 12:58:47 | 显示全部楼层
感觉挺有创意的。

出0入0汤圆

发表于 2011-6-2 19:47:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-14 15:47:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-30 15:39:51 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-1-30 16:34:42 | 显示全部楼层
人民的创造力是无限的

出0入0汤圆

发表于 2012-1-30 16:47:19 | 显示全部楼层
回复【61楼】wuyu061  
学习了
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-5-2 11:18:04 | 显示全部楼层
不错。 帮顶。。

出0入0汤圆

发表于 2012-7-12 08:28:04 | 显示全部楼层
这个做法不错。下次把它移植到STC上去。顺便试试12864

出0入0汤圆

发表于 2012-8-16 01:23:12 | 显示全部楼层
马克一个,以后有用!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-8 04:07

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

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