新概念51單片機C語言教程實例代碼_第1頁
新概念51單片機C語言教程實例代碼_第2頁
新概念51單片機C語言教程實例代碼_第3頁
新概念51單片機C語言教程實例代碼_第4頁
新概念51單片機C語言教程實例代碼_第5頁
已閱讀5頁,還剩136頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

新概念

51單片機C語言教程

--入門、提高、開發(fā)、拓展全攻略

郭天祥編著

電子工業(yè)出版社

例2.2.1編寫程序,點亮第一個發(fā)光二極管(part2_l.cP27)

#include<reg52.h>//52系列單片機頭文件

sbitledl=P?O;〃聲明單片機Pl口的第一位

voidmain()〃主函數(shù)

(

led1=0;/*點亮第一個發(fā)光二極管*/

例2.2.2編寫程序,點亮P1口的若干二極管(part2_2.cP39)

#include<reg52.h>//52系列單片機頭文件

voidmain()〃主函數(shù)

(

Pl=0xaa;

//while(l);

例2.5.1利用for語句延時特性,編寫第?個發(fā)光二極管以間隔1S亮滅閃動的程序(part2_3.c

P42)

#include<reg52.h>//52系列單片機頭文件

#defineuintunsignedint〃宏定義

sbitledl=PlA0;〃聲明單片機Pl口的第一位

uinti,j;

voidmain()〃主函數(shù)

(

while(l)〃大循環(huán)

{

led1=0;/*點亮第一個發(fā)光二極管刃

for(i=l;i>0;i-)〃延時

for(j=110;j>0;j-);

ledl=l;/*關閉第一個發(fā)光二極管*/

for(i=1000;i>0;i-)〃延時

for(j=110;j>0;j-);

例2.6.1編寫程序使第一個發(fā)光二極管以間隔500ms亮滅閃動。(part2_4.cP48)

#include<reg52.h>//52系列單片機頭文件

#defineuintunsignedint〃宏定義

sbitledl=PlA0;〃聲明單片機Pl口的第一位

voiddelayls();〃聲明子函數(shù)

voidmain()〃主函數(shù)

while(l)〃大循環(huán)

{

led1=0;/*點亮第一個發(fā)光二極管*/

delayls();〃調用延時子函數(shù)

ledl=l;/*關閉第一個發(fā)光二極管*/

delayls();〃調用延時子函數(shù)

voiddelay1s()〃子函數(shù)體

uinti,j;

for(i=500;i>0;i-)

for(j=110;j>0;j-);

)

例2.7.1編寫程序使第?個二極管以亮200ms、滅800ms的方式閃動。(part2_5.cP49)

#include<reg52.h>//52系列單片機頭文件

#defineuintunsignedint〃宏定義

sbitledl=PlA0;〃聲明單片機Pl口的第?位

voiddelayms(uint);〃聲明子函數(shù)

voidmain()〃主函數(shù)

[

\

while(l)〃大循環(huán)

(

led1=0;/*點亮第一個發(fā)光二極管*/

delayms(200);〃延時200毫秒

ledl=l;/*關閉第一個發(fā)光二極管*/

delayms(800);〃延時800毫秒

voiddelayms(uintxms)

(

uinti,j;

for(i=xms;i>0;i-)//i=xms即延時約xms毫秒

for(j=110;j>0;j-);

例2.8.3利用C51自帶庫_crol_()似間隔500ms,實現(xiàn)流水燈程序(part2_6.cP53)

#include<reg52.h>//52系列單片機頭文件

#include<intrins.h>

#defineuintunsignedint〃宏定義

#defineucharunsignedchar

voiddelayms(uint);〃聲明子函數(shù)

ucharaa;

voidmain()〃主函數(shù)

(

aa=0xfe;〃賦初值11111110

while(l)〃大循環(huán)

Pl=aa;

delayms(500);〃延時500毫秒

aa=_crol_(aa,1);〃將aa循環(huán)左移1位后再賦給aa

voiddelayms(uintxms)

(

uinti,j;

for(i=xms;i>0;i—)//i=xms即延時約xms毫秒

for(j=110;j>0;j-);

例3.2.1編寫程序使第一個數(shù)碼管顯示8(part2.1_.lcP59)

#include<reg52.h>//52系列單片機頭文件

sbitdula=P2A6;〃申明UI鎖存器的鎖存端

sbitwela=P2A7;〃申明U2鎖存器的鎖存端

voidmain()

wela=1;//打開U2鎖存器

P0=0xFE;//送入位選信號

wela=0;〃關閉U2鎖存器

dula=1;〃打開U1鎖存器

P0=0x7F;〃送入段選信號

dula=0;〃關閉U2鎖存器

while(l);〃程序停止到這里

例322讓實驗板上6個數(shù)碼管同時點亮,依次顯示0到F,時間間隔為0.5ms,循環(huán)下去。

(part2.1_2.cP61)

#include<reg52.h>//52系列單片機頭文件

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2A6;〃申明UI鎖存器的鎖存端

sbitwela=P2A7;〃申明U2鎖存器的鎖存端

ucharnum;

uncharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddelayms(uint);

voidmain()

(

wela=l;〃打開U2鎖存端

P0=0xco;〃送入位選信號

wela=0;〃關閉U2鎖存端

while(l)

(

for(num=0;num<16;num++)//I6個數(shù)循環(huán)顯示

(

dula=l;〃打開UI鎖存端

P0=table[num];〃送入段選信號

dula=0;〃關閉U1鎖存端

delay(500);〃延時0.5秒

voiddelayms(uintxms)

uinti,j;

for(i=xms;i>0;i—)〃i=xms即延時約xms毫秒

forG=110;j>0;j-);

例3.3.1第一個數(shù)碼管顯示1,時間為0.5s,然后關閉它,立即讓第二個數(shù)碼管顯示2,時間

為0.5s,在關閉它.....直到最后一個數(shù)碼管顯示6,時間同樣為0.5s,關閉它之后再回來顯

示第一個數(shù)碼管,一直循環(huán)下去。(part2.1_3.cP62)

例3.5.2用定時器0的方式1實現(xiàn)第一個發(fā)光二極管以200ms間隔閃爍,用定時器1的方式

1實現(xiàn)數(shù)碼管前兩位59s循環(huán)計時。(part2.1_5.cP75)

例4.1.1用數(shù)碼管前兩位顯示一個十進制數(shù),變化范圍為00~59,開始時顯示00,每按下S2

鍵?次,數(shù)值加1;每按下S3鍵一次,數(shù)值減1;每按下S4鍵-次,數(shù)值歸零;按下S5

鍵一次,利用定時器功能使數(shù)值開始自動每秒加1,再次按下S5鍵,數(shù)值停止加1,保持

顯示原數(shù)。(part2.2_l.cP82)

#include<reg52.h>//52系列單片機頭文件

#defineucharunsignedchar

#defineuintunsignedint

sbitkeyl=P3A4;

sbitkey2=P3A5;

sbitkey3=P3A6;

sbitkey4=P3A7;

sbitdula=P2A6;〃申明UI鎖存器的鎖存端

sbitwela=P2A7;〃申明U2鎖存器的鎖存端

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddelayms(uint);

ucharnumt0,num;

voiddisplay(ucharnumdis)〃顯示子函數(shù)

(

ucharshi,ge;〃分離兩個分別要顯示的數(shù)

shi=numdis/10;

ge=numdis%10;

dula=l;

PO=table[shi];〃送十位段選數(shù)據(jù)

dula=0;

P0=0xff;〃送位選數(shù)據(jù)前關閉所有顯示,防止打開位選鎖存時

wela=1;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂

P0=0xfe;〃送位選數(shù)據(jù)

wela=0;

delayms⑸;〃延時

dula=l;

P0=table[ge];〃送個位段選數(shù)據(jù)

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0;

delayms(5);

voiddelayms(uintxms)

uinti,j;

for(i=xms;i>0;i-)//i=xms即延時約xms毫秒

for(j=110;j>0;j-);

)

voidinit()〃初始化函數(shù)

(

TMOD=0x01;〃設置定時器。為工作方式1(00000001)

TH0=(65536-45872)/256;〃裝初值50ms一次中斷

TL0=(65536-45872)%256;

EA=1;〃開總中斷

£70=1;〃開定時器0中斷

}

voidkeyscan()

(

if(keyl==0)

(

delayms(lO);

if(keyl==O)

(

num++;

if(num==60)〃當至!J60時重新歸0

num=0;

while(!keyl);〃等待按鍵釋放

if(key2==0)

(

delayms(lO);

if(key2==0)

(

if(num==0)〃當至lj0時重新歸60

num=60;

num—;

while(!key2);

)

)

if(key3==0)

(

delayms(lO);

if(key3==0)

num=0;〃清0

while(!key3);

if(key4==0)

(

delayms(lO);

if(key4==0)

(

while(!key4);

TRO=~TRO;〃啟動或停止定時器0

)

voidmain()

(

init();〃初始化函數(shù)

while(l)

(

keyscan();

display(num);

)

)

voidT0_time()interrupt1

(

TH0=(65536-45872)/256;〃重裝初值

TL0=(65536-45872)%256;

numtO++;

if(numt0==20)〃如果到了20次,說明1秒時間到

(

numt0=0;〃然后把num清0重新再計20次

num++;

if(num==60)

num=0;

例4.2.1實驗班上電時,數(shù)碼管不顯示,順序按下矩陣鍵盤后,數(shù)碼管上依次顯示0?F,六

個數(shù)碼管同時靜態(tài)顯示即可。(part2.2_2.cP87)

#include<reg52.h>//52系列單片機頭文件

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2A6;〃申明UI鎖存器的鎖存端

sbitwela=P2A7;〃申明U2鎖存器的鎖存端

ucharcodetable[J={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x7I};

voiddelayms(uintxms)

(

uinti,j;

for(i=xms;i>0;i—)//i=xms即延時約xms毫秒

for(j=110;j>0;j-);

)

voiddisplay(ucharnum)

(

P0=table[num];〃顯示函數(shù)只送段選數(shù)據(jù)

dula=l;

dula=0;

I

voidmatrixkeyscan()

(

uchartemp,key;

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=OxfO)

(

delayms(lO);

temp=P3;

temp=temp&0xf0;

if(temp!=OxfO)

(

temp=P3;

switch(temp)

(

caseOxee:

key=O;

break;

caseOxde:

key=l;

break;

caseOxbe:

key=2;

break;

case0x7e:

key=3;

break;

while(temp!=OxfO)

(

lemp=P3;

temp=temp&OxfO;

)

display(key);

)

)

P3=0xfd;

temp=P3;

temp=temp&OxfO;

if(temp!=OxfO)

(

delayms(lO);

temp=P3;

temp=temp&OxfO;

if(temp!=OxfO)

(

temp=P3;

switch(temp)

(

caseOxed:

key=4;

break;

caseOxdd:

key=5;

break;

caseOxbd:

key=6;

break;

case0x7d:

key=7;

break;

)

while(temp!=OxfO)

(

temp=P3;

temp=temp&OxfO;

)

display(key);

}

P3=Oxfb;

temp=P3;

temp=temp&OxfO;

if(temp!=OxfO)

(

delayms(lO);

temp=P3;

temp=temp&OxfO;

if(temp!=OxfO)

(

temp=P3;

switch(temp)

(

caseOxeb:

key=8;

break;

caseOxdb:

key=9;

break;

caseOxbb:

key=10;

break;

case0x7b:

key=l1;

break;

)

while(temp!=OxfO)

(

temp=P3;

temp=temp&OxfO;

}

display(key);

)

)

P3=Oxf7;

temp=P3;

temp=temp&OxfO;

if(temp!=OxfO)

(

delayms(lO);

temp=P3;

temp=temp&OxfO;

if(temp!=OxfO)

temp=P3;

switch(temp)

{

case0xe7:

key=12;

break;

caseOxd7:

key=13;

break;

case0xb7:

key=14;

break;

case0x77:

key=15;

break;

)

while(temp!=0xf0)

(

temp=P3;

temp=temp&0xf0;

)

display(key);

)

)

)

voidmain()

(

P0=0;〃關閉所有數(shù)碼管段選

dula=l;

dula=0;

P0=0xc0;〃位選中所有數(shù)碼管

wela=l;

wela=0;

while(l)

matrixkeyscan();〃不停調用鍵盤掃描程序

例531用單片機控制ADC0804進行數(shù)模轉換,當擰動實驗板上A/D旁邊的電位時,在數(shù)

碼管的前三位以十進制方式顯示出A/D轉換后的數(shù)字量(8位A/D轉換后數(shù)值在0?255變

化)。(part2.3_l.cP107)

#include<reg52.h>//52系列單片機頭文件

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2A6;,〃申明UI鎖存器的鎖存端

A

sbitwela=P27;」〃申明U2鎖存器的鎖存端

A

sbitadwr=P36;」〃定義AD的WR端口

sbitadrd=P3A7;〃/定義AD的RD端口

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddelayms(uintxms)

uinti,j;

for(i=xms;i>0;i-)//i=xms即延時約xms毫秒

for(j=H0;j>0;j-);

)

voiddisplay(ucharbai,ucharshi,ucharge)〃顯示子函數(shù)

(

dula=l;

PO=table[bai];〃送段選數(shù)據(jù)

dula=0;

P0=0xff;〃送位選數(shù)據(jù)前關閉所有顯示,防止打開位選鎖存時

wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂

P0=0x7e;〃送位選數(shù)據(jù)

wela=0;

delayms(5);〃延時

dula=l;

PO=table[shi];

dula=0;

P0=0xff;

wela=l;

P0=0x7d;

wela=0;

delayms(5);

dula=l;

PO=table[ge];

dula=O;

PO=Oxff;

wela=l;

P0=0x7b;

wela=O;

delayms(5);

voidmain()//主程序

(

uchara,Al,A2,A3,adval;

wela=l;

P0=0x7f;〃置CSAD為0,選通ADCS以后不必再管ADCS

wela=0;

while(l)

(

adwr=l;

_nop_();

adwr=0;〃啟動AD轉換

_nop_();

adwi-1;

for(a=10;a>0;a—)/“X-IC實驗板AD工作頻率較低,所以啟動轉換后要多

留點時間用來轉換

(〃這里把顯示部分放這里的原因也是為了延長轉換時

I,HJ

display(A1,A2,A3);

)

Pl=Oxff;//讀取P1□之前先給其寫全1

adrd=l;//選通ADCS

_nop_();

adrd=O;//AD讀使能

_nop_();

adval=Pl;〃AD數(shù)據(jù)讀取賦給Pl口

adrd=l;

Al=adval/100;〃分出百,十,和個位

A2=adval%100/10;

A3=adval%10;

例5.5.1用單片機控制DAC0832芯片輸出電流,讓發(fā)光二級管D12由火均勻變到最亮,再

由最亮均勻熄滅。在最亮和最暗時使用蜂鳴器分別警報一聲,完成整個周期時間控制在5S

左右,循環(huán)變化。(part2.3_2.cP121)

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2A6;〃申明U1鎖存器的鎖存端

sbitwela=P2A7;//申明U2鎖存器的鎖存端

sbitdawr=P3A6;〃定義DA的WR端口

sbitdacs=P3A2;〃定義DA的CS端口

sbitbeep=P2A3;〃定義蜂鳴器端口

voiddelayms(uintxms)

uinti,j;

for(i=xms;i>0;i")//i=xms即延時約xms毫秒

for(j=110;j>0;j-);

voidmain()

(

ucharval,flag;

dula=0;

wela=0;

dacs=0;

dawr=0;

P0=0;

while(l)

(

if(flag==O)

{

val+=5;

P0=val;〃通過PO口給DA數(shù)據(jù)口賦值

if(val==255)

(

flag=l;

beep=0;

delayms(lOO);

beep=1;

}

delayms(50);

)

else

(

val-=5;

P0=val;〃通過P0口給DA數(shù)據(jù)口賦值

if(val==O)

flag=O;

beep=O;

delayms(lOO);

beep=l;

delayms(50);

例6.5.1在上位機上用串口調試助手發(fā)送一個字符X,單片機收到字符后返回給上位機"Iget

X”,串口波特率設為9600bps。(part2.4_l.cP137)

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

unsignedcharflag,a,i;

ucharcodetable[]=nIgetH;

//ucharcodetable[]={T,'VgVe'/tV

voidinit()

(

TMOD=0x20;

THl=0xfd;

TLl=0xfd;

TR1=1;

REN=1;

SM0=0;

SM1=1;

EA=1;

ES=1;

)

voidmain()

(

init();

while(l)

(

if(flag==l)

(

ES=0;

for(i=0;i<6;i++)

(

SBUF=table[i];

while(!TI);

TI=0;

)

SBUF=a;

while(!TI);

TI=0;

ES=1;

flag=0;

)

voidser()interrupt4

RI=O;

a=SBUF;

flag=l;

例661單片機上電后等待從上位機串U發(fā)來的命令,同時在數(shù)碼管的前三位以十進制方式

顯示A/D采集的數(shù)值,在未收到上位機發(fā)送來的啟動A/D轉換命令之前數(shù)碼管始終顯示

OOOo當收到上位機以十六進制發(fā)送來的01后,向上位機發(fā)送字符串“Turnonad!”同時間

隔Is讀取一次A/D的值,然后把A/D采集回來的8位二進制轉換成卜進制表示的實際電壓

浮點數(shù),并且從串口發(fā)送給上位機,形式如“Thevoltageis3.398438V”,發(fā)送周期也是一秒

一次,同時在數(shù)碼管上也要每秒刷新現(xiàn)實的數(shù)值。當收到上位機以十六進制發(fā)送過來的02

后,向上位機發(fā)送字符串“Turnoffad!”,然后停止發(fā)送電壓值,數(shù)碼管上顯示上次結束時

保持的值。當收到上位機發(fā)來的其他任何數(shù)時,向上位機發(fā)送字符串“Error!”。

(part2.4_2.cP140)

#include<reg52.h>

#include<intrins.h>

#include<stdio.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2A6;,〃申明UI鎖存器的鎖存端

sbitwela=P2A7;〃)申明U2鎖存器的鎖存端

A

sbitadwr=P36;」〃定義AD的WR端口

A

sbitadrd=P37;」〃定義AD的RD端口

ucharflag,a;

unsignedcharflag_uart,flag_time,flag_on,a,i,tO_num,ad_val;

floatad_vo;

ucharcodetable[J={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddelayms(uintxms)

(

uinti,j;

for(i=xms;i>0;i—)//i=xms即延時約xms亳秒

for(j=H0;j>0;j-);

)

voidinit()

(

TMOD=Ox21;

//SCON=0x50;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

THl=Oxfd;

TLl=Oxfd;

TR1=1;

ETO=1;

SMO=O;

SM1=1;

REN=1;

EA=1;

ES=1;

voiddisplay(ucharvalue)〃顯示子函數(shù)

(

ucharbai,shi,ge;

bai=value/100;〃分出百,十,和個位

shi=value%100/10;

ge=value%10;

dula=l;

PO=table[bai];〃送段選數(shù)據(jù)

dula=0;

P0=0xff;〃送位選數(shù)據(jù)前關閉所有顯示,防止打開位選鎖存時

wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂

P0=0x7e;〃送位選數(shù)據(jù)

wela=0;

delayms⑸;〃延時

dula=l;

PO=table[shi];

dula=0;

P0=0xff;

wela=l;

P0=0x7d;

wela=0;

delayms(5);

dula=l;

PO=table[ge];

dula=0;

P0=0xff;

wela=l;

P0=0x7b;

wela=0;

delayms(5);

)

ucharget_ad()

ucharadval;

adwr=l;

_nop_();

adwr=O;〃啟動AD轉換

_nop_();

adwr=l;

Pl=Oxff;〃讀取Pl□之前先給其寫全1

adrd=l;

_nop_();

adrd=O;//AD讀使能

_nop_();

adval=Pl;〃AD數(shù)據(jù)讀取

adrd=l;

returnadval;

)

voidmain()

(

init();

wela=l;

P0=0x7f;〃置CSAD為0,選通ADCS以后不必再管ADCS

wela=0;

while(l)

(

if(flag_uart==1)

(

flag_uart=O;

ES=0;

"1;

switch(flag_on)

(

case0:puts("Turnonad!\nu);

TR0=l;

break;

case1:printf(nTumoffad!\n");

TR0=0;

break;

case2:puts("Error!\nH);

break;

}

while(!TI);〃必須要加

TI=0;

ES=1;

)

if(flag_time==l)

flag_time=O;

ad_val=get_ad();

ad_vo=(float)ad_val*5.0/256.0;

ES=O;

TI=1;

printf(nThevoltageis%fV\n”,ad_vo);

while(!TI);

TI=0;

ES=1;

)

display(ad_val);

voidtimerO()interrupt1

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tO_num++;

if(t0_num==20)

(

t0_num=0;

flag_time=l;

)

)

voidser()interrupt4

(

Rl=0;

a=SBUF;

flag_uart=1;

if(a==l)

flag_on=0;

elseif(a==2)

flag_on=1;

else

flag_on=2;

例7.2.1實現(xiàn)1602液晶的第一行顯示」LOVEMCU!”,在第二行顯示WWW.TXMCU.COM。

(part2.5_l.cP152)

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]=nILOVEMCU!";

ucharcodetable1[]=nWWW.TXMCU.COM";

sbitlcden=P3A4;〃液晶使能端

sbitlcdrs=P3A5;〃液晶數(shù)據(jù)命令選擇端

sbitdula=P2A6;〃申明U1鎖存器的鎖存端

sbitwela=P2A7;〃申明U2鎖存器的鎖存端

ucharnum;

voiddelay(uintz)

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>O;y—);

)

voidwrite_com(ucharcom)

(

lcdrs=O;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=O;

)

voidwrite_data(uchardate)

(

lcdrs=1;

PO=date;

delay⑸;

lcden=l;

delay(5);

lcden=O;

)

voidinit()

(

dula=O;

wela=0;

lcden=O;

write_com(0x38);〃設置16X2顯示,5X7點陣,8位數(shù)據(jù)接口

write_com(0x0c);〃設置開顯示,不顯示光標

wrile_com(0x06);〃寫一個字符后地址指針加1

write_com(OxO1);〃顯示清零,數(shù)據(jù)指針清零

)

voidmain()

(

init();

write_com(0x80);

for(num=0;num<l1;num++)

(

write_data(table[num]);

delay(5);

}

write_com(0x80+0x40);

for(num=0;num<13;num++)

(

write_data(tablel[num]);

delay(5);

)

while(l);

}

例7.2.2實現(xiàn)1602第一行從左側移入uHelloeveryone!?,同時第二行從右側移入Welcometo

here!”,移入速度自定,然后停留在屏幕上。(part2.5_2.cP154)

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]="Helloeveryone!";

ucharcodetable1[]=nWelcometohere!,1;

sbitlcden=P3A4;〃液晶使能端

sbitlcdrs=P3A5;〃液晶數(shù)據(jù)命令選擇端

sbitdula=P2A6;〃申明UI鎖存器的鎖存端

sbitwela=P2A7;〃申明U2鎖存器的鎖存端

ucharnum;

voiddelay(uintz)

(

uintx,y;

for(x=z;x>0;x—)

for(y=l10;y>0;y—);

}

voidwrite_com(ucharcom)

(

lcdrs=0;

P0=com;

delay⑸;

lcden=l;

delay⑸;

lcden=O;

)

voidwrite_data(uchardate)

(

lcdrs=1;

P0=date;

delay(5);

lcden=l;

delay⑸;

lcden=0;

)

voidinit()

(

dula=0;

wela=0;

lcden=0;

write_com(Ox38);〃設置16X2顯示,5X7點陣,8位數(shù)據(jù)接口

write_com(0x0c);〃設置開顯示,不顯示光標

write_com(0x06);〃寫一個字符后地址指針加1

write_com(0x01);〃顯示清零,數(shù)據(jù)指針清零

}

voidmain()

(

init();

write_com(0x80+0x10);

for(num=0;num<15;num++)

(

write_data(tablelnum]);

delay(5);

}

write_com(0x80+0x50);

for(num=0;num<16;num++)

(

write_data(tablel[num]);

delay(5);

)

for(num=0;num<16;num++)

(

write_com(0xl8);

delay(200);

while(l);

例7.3.1實現(xiàn)12232液晶的第一行顯示“ILOVEMCU!”,第二行顯示“我愛單片機”。

(part2.5_3.cP160)

#include<REG52.h>

#defineuintunsignedint

#defineucharunsignedchar

sbitCS=P1A2;

sbitSID=PlAl;

sbitSCLK=P1AO;

ucharcodedisps[]={"ILOVEMCU!");

ucharcodedispx[]={"我愛單片機!”};

voiddelay_lms(uintx)

(

uinti,j;

for(j=0;j<x;j++)

for(i=0;i<l10;i++);

}

voidsend_command(ucharcommand_dala)

(

uchari;

uchari_data;

i_data=0xf8;

CS=1;

SCLK=0;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

i_data=command_data;

i_data&=0xf0;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?l;

i_data=command_data;

i_data?=4;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=O;

SCLK=1;

i_data=i_data?1;

)

cs=o;

delay_lms(10);

)

voidsend_data(ucharcommand_data)

(

uchari;

uchari_data;

i_data=Oxfa;

CS=1;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

i_data=command_data;

i_data&=0xf0;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?l;

)

i_data=command_data;

i_data?=4;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

CS=0;

delay_lms(10);

voidlcd_init()

(

delay_lms(100);

send_command(0x30);/*設置8位數(shù)據(jù)接口,基本指令模式。*/

send_command(0x02);/*清DDRAM*/

send_command(0x06);/*游標及顯示右移一位*/

send_command(OxOc);/*整體顯示開,游標關,反白關*/

send_command(OxO1);/*寫入空格清屏幕*/

send_command(Ox80);/*設定首次顯示位置*/

)

voiddisplay_s()

(

uchara;

send_command(0x80);

fbr(a=0;a<l1;a++)

(

send_data(disps[a]);

)

)

voiddisplay_x()

(

uchara;

send_command(0x92);

for(a=0;a<ll;a++)

(

send_data(dispx[a]);

)

}

main()

(

lcd_init();

display_s();

display_x();

while(l);

)

例7.3.2實現(xiàn)12232液晶第一行從右側移入“Helloeveryone!",同時第二行從右側移入“歡

迎大家來學習!”移入速度自定,最后停留在屏幕上。(part2.5_4.cP163)

include<REG52.h>

#defineuintunsignedint

#defineucharunsignedchar

sbitCS=P1A2;

sbitSID=PlAl;

sbitSCLK=P1AO;

ucharcodedisps[]={"Helloeveryone!"};

ucharcodedispx[J={"歡迎大家來學習!”};

voiddelay_lms(uintx)

(

uinti,j;

for(j=0;j<x;j++)

for(i=0;i<l10;i++);

)

voidsend_command(ucharcommand_data)

(

uchari;

uchari_data;

i_data=0xf8;

CS=1;

SCLK=0;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

i_data=command_data;

i_data&=0xf0;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

i_data=command_data;

i_data?=4;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?l;

)

cs=o;

delay_lms(l);

voidsend_data(ucharcommand_data)

(

uchari;

uchari_data;

i_data=Oxfa;

CS=1;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

i_data=command_data;

i_data&=OxfO;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?l;

)

i_data=command_data;

i_data?=4;

for(i=0;i<8;i++)

(

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data?1;

)

cs=o;

delay_lms(l);

)

voidIcd_init()

(

delay_lms(100);

send_command(0x30);/*設置8位數(shù)據(jù)接口,基本指令模式。*/

send_command(0x02);DDRAM*/

send_command(0x06);/*游標及顯示右移一位*/

send_command(OxOc);/*整體顯示開,游標關,反白關*/

send_command(0x01);/*寫入空格清屏幕刃

send_command(0x80);/*設定首次顯示位置*/

voiddisplay_s(ucharnum)

(

uchara;

send_command(0x88-num);

for(a=0;a<15;a++)

(

send_data(disps[a]);

)

)

voiddisplay_x(ucharnum)

(

uchara;

send_command(0x98-num);

for(a=0;a<15;a++)

(

send_data(dispx[a]);

)

)

main()

(

ucharaa;

lcd_init();

for(aa=0;aa<9;aa++)

(

display_s(aa);

display_x(aa);

delay_lms(300);

)

while(l);

)

例7.4.1實現(xiàn)在12864液晶上第一行顯示“0123456789”,并且讓每一位數(shù)字隨機變化,第二

行顯示“",第三行顯示“天祥電子”,第四行對應第三行顯示出下劃線。

(part2.5_5.cP173)

#include<reg5l.h>

#include<intrins.h>

#include<stdlib.h>

#defineucharunsignedchar

#defineuintunsignedint

/*端口定義*/

#defineLCD_dataPO〃數(shù)據(jù)口

sbitLCD_RS=P3八5;〃寄存器選擇輸入

sbitLCD_RW=P3八6;〃液晶讀/寫控制

sbitLCD_EN=P3A4;〃液晶使能控制

sbitLCD_PSB=P3A7;〃串/并方式控制

sbitwela=P2A6;

sbitdula=P2A7;

uchardisl[10];

ucharcodedis2[]={""};

ucharcodedis3[]={"天祥電子”};

ucharcodedis4[]={'*-

voiddelay_lms(uintx)

uinti,j;

for(j=0;j<x;j++)

for(i=0;i<110;i++);

/**/

/*寫指令數(shù)據(jù)到LCD*/

/*RS=L,RW=L,E=iW脈沖,口0477=指令碼。*/

/**/

voidwrite_cmd(ucharcmd)

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

P0=cmd;

delay_lms(5);

LCD_EN=1;

delay_lms(5);

LCD_EN=0;

)

/**/

/次寫顯示數(shù)據(jù)到LCD*/

/*RS=H,RW=L,&=高脈沖,D0-D7=數(shù)據(jù)。*/

/**/

voidwrite_dat(uchardat)

LCD_RS=1;

LCD_RW=0;

LCD.EN=0;

PO=dat;

del

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論