51單片機(jī)總線(xiàn)與非總線(xiàn)的程序?qū)Ρ?/h1>
#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;//延時(shí)void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//1602寫(xiě)地址void write_com(uchar com){yidianling=0;yidianyi=0;P0=com;delay(5);shuru=1;delay(5);shuru=0;} //1602寫(xiě)數(shù)據(jù) 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選 寫(xiě)的位置和數(shù)據(jù)void write_sfm(uchar add,uchar date){write_com(0x80+0x40+add);write_data(0x30+date); }//主函數(shù)void main(){P1=0xff;P0=0xff;init();while(1);}
板子原理圖是當(dāng)時(shí)自己畫(huà)的,目測(cè)找不到了。T T.但是看程序還是可以看出點(diǎn)什么吧~
本文引用地址:http://m.butianyuan.cn/article/201611/318154.htm 這是以前的程序了,當(dāng)時(shí)是用來(lái)紅外測(cè)距,測(cè)的數(shù)據(jù)經(jīng)AD轉(zhuǎn)換顯示出來(lái),我把AD部分都刪去了。
很明顯,非總線(xiàn)型的1602程序就是完全按照1602數(shù)據(jù)手冊(cè)上的高低電平來(lái)控制的,寫(xiě)了很多代碼。
接下來(lái),看總線(xiàn)型的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);}
眨眼一看,程序確實(shí)少了很多,如果要寫(xiě)數(shù)據(jù),在while(1);前面加數(shù)據(jù)便可。
LCD_Data=a;
先上板子的原理圖:
簡(jiǎn)單分析一下:
P0口線(xiàn)既用作地址線(xiàn),又用作數(shù)據(jù)線(xiàn)(分時(shí)復(fù)用),因此需要加一個(gè)8位的鎖存器。
使用ALE作為地址鎖存的通選信號(hào),以實(shí)現(xiàn)低8位地址的鎖存。
地址I/O是從P2.7到P2.0,接著P0.7到P0.0,這里可以很明顯的理解
#define LCD_COM XBYTE[0XD]#define LCD_Data XBYTE[0xD001]
這兩句話(huà)了。
剩下直接看main()函數(shù)里面的了,里面也是按照1602的資料寫(xiě)的,但是是直接給出的,不是看高低電平判斷延時(shí)時(shí)間寫(xiě)的,省事不少呀。
雖然只是簡(jiǎn)單闡述了一下,但是按照總線(xiàn)型來(lái)設(shè)計(jì)電路圖,來(lái)寫(xiě)程序,真心好。當(dāng)然除此之外還有CAN總線(xiàn),IIC,SPI,以及dala公司的一根線(xiàn)搞定,。再說(shuō)一下總線(xiàn)吧,三總線(xiàn)簡(jiǎn)稱(chēng)ADC,這總是讓我想起ADC的芯片,A是地址總線(xiàn),D是數(shù)據(jù)總線(xiàn),C是控制總線(xiàn),是控制片外ROM、RAM和I/O的。這學(xué)期學(xué)單片機(jī)這門(mén)課程,之前沒(méi)有上過(guò)微機(jī)原理那些,老師幾個(gè)課時(shí)直接講完,實(shí)在是精彩。當(dāng)時(shí)也說(shuō)過(guò)了解了總線(xiàn)型的話(huà)后面開(kāi)發(fā)ARM芯片都很容易了,唉,我要走的路還很長(zhǎng)呀。
#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;//延時(shí)void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//1602寫(xiě)地址void write_com(uchar com){yidianling=0;yidianyi=0;P0=com;delay(5);shuru=1;delay(5);shuru=0;} //1602寫(xiě)數(shù)據(jù) 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選 寫(xiě)的位置和數(shù)據(jù)void write_sfm(uchar add,uchar date){write_com(0x80+0x40+add);write_data(0x30+date); }//主函數(shù)void main(){P1=0xff;P0=0xff;init();while(1);}
板子原理圖是當(dāng)時(shí)自己畫(huà)的,目測(cè)找不到了。T T.但是看程序還是可以看出點(diǎn)什么吧~
本文引用地址:http://m.butianyuan.cn/article/201611/318154.htm這是以前的程序了,當(dāng)時(shí)是用來(lái)紅外測(cè)距,測(cè)的數(shù)據(jù)經(jīng)AD轉(zhuǎn)換顯示出來(lái),我把AD部分都刪去了。
很明顯,非總線(xiàn)型的1602程序就是完全按照1602數(shù)據(jù)手冊(cè)上的高低電平來(lái)控制的,寫(xiě)了很多代碼。
接下來(lái),看總線(xiàn)型的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);}
眨眼一看,程序確實(shí)少了很多,如果要寫(xiě)數(shù)據(jù),在while(1);前面加數(shù)據(jù)便可。
LCD_Data=a;
先上板子的原理圖:
簡(jiǎn)單分析一下:
P0口線(xiàn)既用作地址線(xiàn),又用作數(shù)據(jù)線(xiàn)(分時(shí)復(fù)用),因此需要加一個(gè)8位的鎖存器。
使用ALE作為地址鎖存的通選信號(hào),以實(shí)現(xiàn)低8位地址的鎖存。
地址I/O是從P2.7到P2.0,接著P0.7到P0.0,這里可以很明顯的理解
#define LCD_COM XBYTE[0XD]#define LCD_Data XBYTE[0xD001]
這兩句話(huà)了。
剩下直接看main()函數(shù)里面的了,里面也是按照1602的資料寫(xiě)的,但是是直接給出的,不是看高低電平判斷延時(shí)時(shí)間寫(xiě)的,省事不少呀。
雖然只是簡(jiǎn)單闡述了一下,但是按照總線(xiàn)型來(lái)設(shè)計(jì)電路圖,來(lái)寫(xiě)程序,真心好。當(dāng)然除此之外還有CAN總線(xiàn),IIC,SPI,以及dala公司的一根線(xiàn)搞定,。再說(shuō)一下總線(xiàn)吧,三總線(xiàn)簡(jiǎn)稱(chēng)ADC,這總是讓我想起ADC的芯片,A是地址總線(xiàn),D是數(shù)據(jù)總線(xiàn),C是控制總線(xiàn),是控制片外ROM、RAM和I/O的。這學(xué)期學(xué)單片機(jī)這門(mén)課程,之前沒(méi)有上過(guò)微機(jī)原理那些,老師幾個(gè)課時(shí)直接講完,實(shí)在是精彩。當(dāng)時(shí)也說(shuō)過(guò)了解了總線(xiàn)型的話(huà)后面開(kāi)發(fā)ARM芯片都很容易了,唉,我要走的路還很長(zhǎng)呀。
評(píng)論