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,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
24 0
|
8月前
|
数据处理 C语言
侃侃单片机的裸奔程序的框架
侃侃单片机的裸奔程序的框架
82 0
【单片机】延迟程序&延迟子程序的设计(入门)
【单片机】延迟程序&延迟子程序的设计(入门)
|
1月前
基于51单片机的简单交通灯程序
基于51单片机的简单交通灯程序
14 2
|
4月前
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
61 0
|
9月前
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
124 0
|
8月前
|
存储 Go 芯片
单片机外围模块漫谈之四,USB总线基本概念。
单片机外围模块漫谈之四,USB总线基本概念。
|
8月前
|
监控 芯片
单片机外围模块漫谈之三,CAN总线
单片机外围模块漫谈之三,CAN总线
|
9月前
【单片机期中测试】1.简单的流水灯程序
【单片机期中测试】1.简单的流水灯程序
63 0