zoukankan      html  css  js  c++  java
  • 51单片机总线与非总线的程序对比

    不多说,先来非总线型的51的1602液晶显示器的显示程序:

    #include<reg52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    uchar code table[]="The distance is ";
    uchar code table1[]="     00.0cm     ";
    sbit shuru=P1^0;
    sbit yidianling=P1^0;
    sbit yidianyi=P1^3;//延时
    void delay(uint z)
    {
        uint x,y;
        for(x=z;x>0;x--)
            for(y=110;y>0;y--);
    }
    
    //1602写地址
    void write_com(uchar com)
    {
        yidianling=0;
        yidianyi=0;
        P0=com;
        delay(5);
        shuru=1;
        delay(5);
        shuru=0;
    } 
    //1602写数据                                                                        
    void write_data(uchar date)
    {
        yidianling=1;
        yidianyi=0;
        P0=date;
        delay(5);
        shuru=1;
        delay(5);
        shuru=0;
    }
    //初始化
    void init()
    {
        uchar num;
        shuru=0;    
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x10);
        write_com(0x80);
        for(num=0;num<16;num++)
        {
            write_data(table[num]);
            delay(2);
        }
        write_com(0x80+0x40);//0x53
        for(num=0;num<16;num++)
        {
            write_data(table1[num]);
            delay(2);
        }
    }
    //1602选 写的位置和数据
    void write_sfm(uchar add,uchar date)
    {
        write_com(0x80+0x40+add);
        write_data(0x30+date);    
    }
    //主函数
    void main()
    {
        P1=0xff;
        P0=0xff;
        init();
        while(1);
    }

      板子原理图是当时自己画的,目测找不到了。T T.但是看程序还是可以看出点什么吧~

      这是以前的程序了,当时是用来红外测距,测的数据经AD转换显示出来,我把AD部分都删去了。

      很明显,非总线型的1602程序就是完全按照1602数据手册上的高低电平来控制的,写了很多代码。

    接下来,看总线型的1602显示程序吧:

    #include <AT89X51.H>
    #include <absacc.h>
    #define LCD_COM XBYTE[0XD000]
    #define LCD_Data XBYTE[0xD001]
    delay()
    {
     unsigned short i,j;
     for(i=0;i<=200;i++)
     {
      for(j=0;j<=200;j++);
     }
    }
    void main()
    { 
     LED=0X55;
     LCD_COM=0X01;
     delay();
     LED=0XAA;
     delay();
     LED=0X55;
     LCD_COM=0X01;
     delay();
     LED=0XAA;
     LCD_COM=0X38;
     delay();
     LCD_COM=0X38;
     delay();
     LCD_COM=0X38;
     delay();
     LCD_COM=0X38;
     delay();
     LCD_COM=0X08;
     delay();
     LED=0XAA;
     LCD_COM=0X01;
     delay();
     LCD_COM=0X06;
     delay();
     LCD_COM=0X0F;
     delay();
     while(1);
    }

    眨眼一看,程序确实少了很多,如果要写数据,在while(1);前面加数据便可。

    LCD_Data='a';

    先上板子的原理图:

    简单分析一下:

      P0口线既用作地址线,又用作数据线(分时复用),因此需要加一个8位的锁存器。

      使用ALE作为地址锁存的通选信号,以实现低8位地址的锁存。

      地址I/O是从P2.7到P2.0,接着P0.7到P0.0,这里可以很明显的理解

    #define LCD_COM XBYTE[0XD000]
    #define LCD_Data XBYTE[0xD001]

      这两句话了。

      剩下直接看main()函数里面的了,里面也是按照1602的资料写的,但是是直接给出的,不是看高低电平判断延时时间写的,省事不少呀。

      虽然只是简单阐述了一下,但是按照总线型来设计电路图,来写程序,真心好。当然除此之外还有CAN总线,IIC,SPI,以及dala公司的一根线搞定,哈哈。再说一下总线吧,三总线简称ADC,这总是让我想起ADC的芯片,A是地址总线,D是数据总线,C是控制总线,是控制片外ROM、RAM和I/O的。这学期学单片机这门课程,之前没有上过微机原理那些,老师几个课时直接讲完,实在是精彩。当时也说过了解了总线型的话后面开发ARM芯片都很容易了,唉,我要走的路还很长呀。

    转载请注明出处:http://www.cnblogs.com/yydcdut/p/3480811.html

  • 相关阅读:
    【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置
    【Quartz】配置最简单的集群
    【Quartz】将定时任务持久化到数据库
    【Quartz】Quartz的搭建、应用(单独使用Quartz)
    【Linux】用grep在文档中查找内容
    【Linux】方便的SecureCRT文件上传、下载命令
    【MySQL】MySQL复制表结构、表数据
    【Linux】vi(vim)起步学起来有些困难,一步一步温习
    【MySQL】MySQL PLSQL Demo
    【Linux】VMware中为CentOS设置静态IP(非动态获取IP)
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3480811.html
Copyright © 2011-2022 走看看