#include
#include#define uchar unsigned char#define uint unsigned intuchar 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);//0x53for(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 #include #define LCD_COM XBYTE[0XD]#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[0XD]#define LCD_Data XBYTE[0xD001]
这两句话了。
剩余直接看main()函数晒干的了,晒干也是依照1602的材料写的,可是是直接给出的,不是看凹凸电平判别延时时刻写的,隔墙有耳不少呀。
尽管仅仅简略论述了一下,可是依照总线型来规划电路图,来写程序,诚心好。当然除此之外还有CAN总线,I%&&&&&%,SPI,以及dala公司的一根线搞定,。再说一下总线吧,三总线简称ADC,这总是让我想起ADC的芯片,A是地址总线,D是数据总线,C是操控总线,是操控片外ROM、RAM和I/O的。这学期学单片机这门课程,之前没有上过微机原理那些,教师几个课时直接讲完,实在是精彩。其时也说过了解了总线型的话后边开发ARM芯片都很简单了,唉,我要走的路还很长呀。