版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
新概念
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- apg工藝生產管理制度
- 釀造車間生產管理制度
- 生產技術方面制度
- 安全生產法電工管理制度
- 班組安全生產制度范本
- 代加工生產規(guī)章制度
- 生產計劃管理規(guī)章制度
- 生產服務管理制度范本
- 2026山東泰安市屬事業(yè)單位初級綜合類崗位招聘參考考試試題附答案解析
- 2026甘肅白銀市平川區(qū)容通水務有限公司招聘9人參考考試題庫附答案解析
- 清真生產過程管控制度
- 2026年淺二度燒傷處理
- 北京通州產業(yè)服務有限公司招聘考試備考題庫及答案解析
- 河北省NT名校聯(lián)合體2025-2026學年高三上學期1月月考英語(含答案)
- 2025-2026學年滬科版八年級數(shù)學上冊期末測試卷(含答案)
- 途虎養(yǎng)車安全培訓課件
- 衛(wèi)生管理研究論文
- 2025-2026學年人教版(新教材)小學數(shù)學二年級下冊(全冊)教學設計(附教材目錄P161)
- 委托市場調研合同范本
- 畜牧安全培訓資料課件
- 2025年度黨支部書記述職報告
評論
0/150
提交評論