《新概念51单片机C语言教程实例代码.pdf》由会员分享,可在线阅读,更多相关《新概念51单片机C语言教程实例代码.pdf(138页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、新概念51单片机C语言教程-一入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例 2.2.1编写程序,点亮第一个发光二极管(part2_l.c P27)#include /52系列单片机头文件sbit ledl=PlAO;声明单片机Pl 口的第一位void main()主函数(ledl=0;/*点亮第一个发光二极管*/例 2 2 2 编写程序,点亮P1 口的若干二极管(part2_2.c P39)#include /52系列单片机头文件void main()主函数(Pl=0 xaa;/while(l);)例 2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(p
2、art2_3.cP42)#include /52系列单片机头文件#define uint unsigned int 宏 定义sbit ledl=PlA0;声明单片机Pl 口的第一位uint i,j;void main()主函数while(l)大循环(ledl=0;for(i=l;i0;i)for(j=110;j0;j-);led 1=1;for(i=1000;i0;i-)for(j=110;j0;j-);/*点亮第一个发光二极管*/延时/*关闭第一个发光二极管刃延时例 2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。(part2_4.c P48)#include#define u
3、int unsigned intsbit ledl=PlA0;void delay ls();void main()(while(l)led 1=0;delayls();ledl=l;delay ls();)void delay ls()(uint i,j;for(i=500;i0;i-)for(j=110;j0;j-);/52系列单片机头文件宏定义声明单片机Pl 口的第一位声明子函数/主函数/大循环/*点亮第一个发光二极管*/调用延时子函数/*关闭第一个发光二极管*/调用延时子函数子函数体例 2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。(part2_5.c P49
4、)#include#define uint unsigned intsbit ledl=PlA0;void delayms(uint);void main()/52系列单片机头文件宏定义声明单片机Pl 口的第一位声明子函数主函数while(l)大循环ledl=0;delayms(200);ledl=l;delayms(800);/*点亮第一个发光二极管*/延时200毫秒/*关闭第一个发光二极管*/延时800毫秒void delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=H0;j0;j-);/i=xms即延时约xms毫秒例 2.8.3利用C 51自带
5、库_crol_(),以间隔500m s,实现流水灯程序(part2_6.c P53)#include#include#define uint unsigned int/52系列单片机头文件宏定义#define uchar unsigned charvoid delayms(uint);uchar aa;声明子函数void main()(aa=0 xfe;主函数赋初值11111110while(l)大循环Pl=aa;delayms(500);aa=_crol_(aa,l);延时500毫秒将aa循环左移1位后再赋给aavoid delayms(uint xms)uint i,j;for(i=xms
6、;i0;i)forG=110;j0;j-);/i=xms即延时约xms毫秒例 3.2.1编写程序使第一个数码管显示8(part2.1_.lc P59)#include sbit dula=P2A6;sbit wela=P2A7;void main()/52系列单片机头文件申明U1锁存器的锁存端申明U2锁存器的锁存端wela=l;P0=0 xFE;wela=0;打开U2锁存器送入位选信号关闭U2锁存器dula=l;P0=0 x7F;dula=0;while(l);/打开U I锁存器送入段选信号关闭U2锁存器程序停止到这里例 3 2 2 让实验板上6 个数码管同时点亮,依次显示0 到 F,时间间隔
7、为0.5m s,循环下去。(part2.1_2.c P61)#include#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;sbit wela=P2A7;uchar num;52系列单片机头文件申明U I锁存器的锁存端申明U 2锁存器的锁存端unchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);voi
8、d main()(wela=l;打开U2锁存端P0=0 xco;送入位选信号wela=0;关闭U2锁存端while(l)(for(num=0;num0;i)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);例 3.3.1第一个数码管显示1,时间为0.5 s,然后关闭它,立即让第二个数码管显示2,时间为 0.5s,在关闭它.直到最后一个数码管显示6,时间同样为0.5 s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.c P62)例 3.5.2用定时器0 的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。
9、(part2.1_5.c P75)例 4.1.1用数码管前两位显示一个十进制数,变化范围为005 9,开始时显示0 0,每按下S2键一次,数 值 加 h每按下S 3键一次,数 值 减 1;每按下S 4 键一次,数值归零;按 下 S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S 5键,数值停止加1,保持显示原数。(part2.2_l.c P82)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit keyl=P3A4;sbit key2=P3A5;sbit key3=P3A6;sbit
10、 key4=P3A7;sbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U2锁存器的锁存端uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);uchar numt0,num;void display(uchar numdis)显示子函数(uchar shi,ge;分离两个分别要显示的数shi=numdis/10;ge=numdis%10;dula=
11、l;P0=table shi;送十位段选数据dula=0;PO=Oxff;送位选数据前关闭所有显示,防止打开位选锁存时wela=1;原来段选数据通过位选锁存器造成混乱P0=0 xfe;送位选数据wela=0;delayms;延时dula=l;PO=tablege;送个位段选数据dula=0;P0=0 xff;wela=l;P0=0 xfd;wela=0;delayms(5);void delayms(uint xms)uint i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒forG=H0;j0;j-);)void init()初始化函数(TMOD=0 x01;设置定
12、时器0 为工作方式1(0000 0001)TH0=(6553845872)/256;装初值 50ms 一次中断TL0=(65536-45872)%256;EA=1;开总中断ET0=l;开定时器0 中断)void keyscan()if(keyl=0)(delayms(lO);if(keyl=O)(num+;if(num=60)当 至 lj 60时重新归0num=0;while(!keyl);等待按键释放)1if(key2=0)(delayms(lO);if(key2=0)(if(num=0)当 至 I 0 时重新归60num=60;num;while(!key2);)if(key3=0)del
13、ayms(lO);if(key3=0)num=0;清 0while(!key3);if(key4=0)(delayms(lO);if(key4=0)while(!key4);TRO=TRO;启动或停止定时器0)void main()(init();初始化函数while(l)(keyscan();display(num);)void T0_time()interrupt 1(TH0=(6553645872)/256;重装初值TL0=(65536-45872)%256;numtO+;if(numt0=20)如果到了 20次,说 明 1 秒时间到(numt0=0;/然后把num清 0 重新再计20次
14、num+;if(num=60)num=0;例 4 2 1 实验板上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0 F,六个数码管同时静态显示即可。(part2.2_2.c P87)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;申明U I 锁存器的锁存端sbit wela=P2A7;申明U 2 锁存器的锁存端uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f
15、,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)(uint i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒for(j=H0;j0;j-);)void display(uchar num)(P0=tablenum;显示函数只送段选数据dula=l;dula=0;)void matrixkeyscan()(uchar temp,key;P3=0 xfe;temp=P3;temp=temp&0 xf0;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;i
16、f(temp!=OxfO)(temp=P3;switch(temp)(case Oxee:key=O;break;case Oxde:key=l;break;case Oxbe:key=2;break;case 0 x7e:key=3;break;while(temp!=OxfO)(temp=P3;te mp=te mp&OxfO;)di splay(key);)P3=Oxfd;temp=P3;temp=temp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(
17、case Oxed:key=4;break;case Oxdd:key=5;break;case Oxbd:key=6;break;case 0 x7d:key=7;break;while(temp!=OxfO)(temp=P3;temp=temp&OxfO;display(key);P3=Oxfb;temp=P3;te m p=te mp&Ox fO;if(temp!=OxfO)delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case Oxeb:key=8;break;case Oxdb:key=9
18、;break;case Oxbb:key=10;break;case Ox7b:key=ll;break;)while(temp!=OxfO)(temp=P3;temp=te mp&OxfO;)display(key);)P3=0 xf7;temp=P3;te mp=te mp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)temp=P3;switch(temp)(case 0 xe7:key=12;break;case 0 xd7:key=13;break;case 0 xb7:key=14;brea
19、k;case 0 x77:key=15;break;)while(temp!=0 xf0)(temp=P3;temp=temp&0 xf0;)di splay(key);void main()(P0=0;关闭所有数码管段选dula=l;dula=0;P0=0 xc0;位选中所有数码管wela=l;wela=0;while(l)matrixkeyscan();不停调用键盘扫描程序例 5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8 位 A/D转换后数值在0255变优 o (part2.3_l.c P10
20、7)#include /52系列单片机头文件#include#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;sbit wela=P2A7;sbit adwr=P3A6;sbit adrd=P3A7;uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)uint i,j;fbr(i=xms;i0;i
21、)/申明U I锁存器的锁存端中明U2锁存器的锁存端定义AD 的 WR端口定义AD 的 RD端口/i=xms即延时约xms毫秒for(j=110;j0;j-);void display(uchar bai,uchar shi,uchar ge)显示子函数(dula=l;PO=tablebai;送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P0=0 x7e;送位选数据wela=0;delayms;延时dula=l;PO=tableshi;dula=0;P0=0 xff;wela=l;P0=0 x7d;wela=
22、0;delayms(5);dula=l;PO=table|ge|;dula=O;PO=Oxff;wela=l;P0=0 x7b;wela=O;deiayms(5);void main()/主程序(uchar a,Al,A2,A3,adval;wela=l;P0=0 x7f;置CSAD为 0,选 通 ADCS以后不必再管ADCSwela=0;while(l)(adwr=1;_nop_();adwr=0;启动AD转换_nop_();adwr=l;for(a=10;a0;a-)/fTX-lC实验板AD工作频率较低,所以启动转换后要多留点时间用来转换 这里把显示部分放这里的原因也是为了延长转换时间di
23、splay(A1,A2,A3);Pl=0 xff;/读取Pl 口之前先给其写全adrd=1;/选通ADCS_nop_();adrd=0;/AD读使能_nop_();adval=Pl;/AD数据读取赋给Pl 口adrd=1;Al=adval/100;/分出百,十,和个位A2=adval%100/10;A3=adval%10;例 5 5 1 用单片机控制DAC0832芯片输出电流,让发光二级管D 12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5S左右,循环变化。(part2.3_2.c P121)#include#define uchar un
24、signed char#define uint unsigned intsbit dula=P2A6;,sbit wela=P2A7;,sbit dawn=P3A6;,sbit dacs=P3A2;sbit beep=P2A3;void delayms(uint xms)申明U1锁存器的锁存端/申明U2锁存器的锁存端定义DA 的 WR端口定义D A 的 C S端口定义蜂鸣器端口uint i,j;for(i=xms;iO;i)forC=110;j0;j-);/i=xms即延时约xms毫秒void main()uchar val,flag;dula=0;wela=0;dacs=0;dawr=0;P
25、0=0;while(l)(if(flag=O)(val+=5;P0=val;通过PO 口给DA数据口赋值if(val=255)(flag=l;beep=0;delayms(lOO);beep=1;)delayms(50);)else(val-=5;P0=val;if(val=O)通过P0 口给DA数据口赋值flag=O;beep=O;delayms(lOO);beep=1;)delayms(50);例 6.5.1在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“I getX”,串 口波特率设为 9600bps。(part2.4.c P137)#include#define
26、uchar unsigned char#define uint unsigned intunsigned char flag,a,i;uchar code table=nI get n;/ucharcodevoid init()(TMOD=0 x20;THl=0 xfd;TLl=0 xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;void main()(init();while(l)(if(flag=l)(ES=0;for(i=0;i6;i+)(SBUF=tablei;while(!TI);TI=0;)SBUF=a;while(!TI);TI=0;ES=1;flag
27、=0;)void ser()interrupt 4RI=O;a=SBUF;flag=l;例 6.6.1单片机上电后等待从上位机串口发来的命令,同时在数码管的前三位以十进制方式显 示 A/D 采集的数值,在未收到上位机发送来的启动A/D 转换命令之前数码管始终显示000o当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turn on ad!”同时间隔 Is读取一次A/D的值,然后把A/D采集回来的8 位二进制转换成十进制表示的实际电压浮点数,并且从串口发送给上位机,形式如“The voltage is 3.398438V”,发送周期也是一秒一次,同时在数码管上也要每秒刷新现实的数值。当
28、收到上位机以十六进制发送过来的02后,向上位机发送字符串“Tum offad!”,然后停止发送电压值,数码管上显示上次结束时保持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。(part2.4_2.c P140)#include#include#include#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;sbit wela=P2A7;sbit adwr=P3A6;sbit adrd=P3A7;uchar flag,a;/申明U I锁存器的锁存端申明U2锁存器的锁存端定义AD 的 W
29、R端口定义AD 的 RD端口unsigned char flag_uart,flag_time,flag_on,a,i,tO_num,ad_val;float ad_vo;uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)uint i,j;for(i=xms;i0;i)for(j=110;j0;j-);/i=xms即延时约xms毫秒)void init()TMOD=Ox21;/
30、SCON=0 x50;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;void display(uchar value)显示子函数(uchar bai,shi,ge;bai=value/100;分出百,十,和个位shi=value%100/10;ge=value%10;dula=l;PO=tablebai;送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P
31、0=0 x7e;送位选数据wela=0;delayms;延时dula=l;PO=tableshi;dula=0;P0=0 xff;wela=l;P0=0 x7d;wela=0;delayms(5);dula=l;PO=tablege;dula=0;P0=0 xff;wela=l;P0=0 x7b;wela=0;delayms(5);uchar get_ad()uchar adval;adwr=1;_nop_();adwr=O;启动AD转换_nop_();adwr=l;Pl=Oxff;/读取Pl 口之前先给其写全1adrd=l;_nop_();adrd=O;/AD 读使能_nop_();adva
32、l=Pl;/AD 数据读取adrd=l;return adval;)void main()(init();wela=l;P0=0 x7f;置CSAD为 0,选 通 ADCS以后不必再管ADCSwela=0;while(l)(if(flag_uart=l)(flag_uart=O;ES=0;TI=1;switch(flag_on)(case 0:puts(*Turn on ad!n);TR0=l;break;case 1:printf(nTurn off ad!n);TR0=0;break;case 2:puts(Enor!n”);break;)while(!TI);必须要加TI=0;ES=1;
33、)if(flag_time=l)flag_time=O;ad_val=get_ad();ad_vo=(float)ad_val*5.0/256.0;ES=O;TI=1;printfCThe voltage is%fVnad_vo);while(!TI);TI=0;ES=1;)display(ad_val);void timerO()interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;tO_num+;if(t0_num=20)(t0_num=0;flag_time=l;)void ser()interrupt 4(RI=0;a=SBUF;
34、flag_uart=l;if(a=l)flag_on=0;else if(a=2)flag_on=l;elseflag_on=2;例 72.1实 现 1602液晶的第一行显示“1 LOVE MCU!”,在第二行显示WWW.TXMCU.COM。(part2.5_Lc P152)#include#define uchar unsigned char#define uint unsigned intuchar code table=nI LOVE MCU!H;uchar code table 1 =nWWW.TXMCU.COM0;sbit lcden=P3A4;液晶使能端sbit lcdrs=P3A
35、5;液晶数据命令选择端sbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U 2锁存器的锁存端uchar num;void delay(uint z)(uint x,y;fbr(x=z;xO;x-)for(y=l 10;y0;y);void write_com(uchar com)(lcdrs=O;P0=com;delay;lcden=l;delay(5);lcden=O;void write_data(uchar date)(lcdrs=1;PO=date;delay(5);lcden=l;delay(5);lcden=O;)void init()(dul
36、a=O;wela=0;lcden=O;write_com(0 x38);设 置 16X2显示,5X7点阵,8位数据接口write_com(0 x0c);设置开显示,不显示光标write_com(0 x06);写一个字符后地址指针加1write_com(0 x01);显示清零,数据指针清零void main()(init();write_com(0 x80);fbr(num=O;numl l;num+)(write_data(tablenum);delay(5);)write_com(0 x80+0 x40);fbr(num=O;num 13;num+)(write_data(tablel nu
37、m);delay(5);)while(l);例 7.2.2实 现 1602第一行从左侧移入“Hello everyone!”同时第二行从右侧移入“Welcome tohere!,移入速度自定,然后停留在屏幕上。(part2.5_2.c P154)#include#define uchar unsigned char#define uint unsigned intuchar code table=Hello everyone!1;uchar code table 1 =nWelcome to here!,;sbit lcden=P3A4;sbit lcdrs=P3A5;sbit dula=P2
38、A6;sbit wela=P2A7;液晶使能端液晶数据命令选择端申明U1锁存器的锁存端申明U2锁存器的锁存端uchar num;void delay(uint z)uint x,y;fbr(x=z;x0;x)for(y=l 10;y0;y);)void write_com(uchar com)(lcdrs=0;P0=com;delay(5);lcden=l;delay ;lcden=O;)void write_data(uchar date)(lcdrs=1;P0=date;delay(5);lcden=l;delay(5);lcden=0;)void init()(dula=0;wela=0
39、;lcden=0;write_com(0 x38);设 置 16X2显示,5X7点阵,8位数据接口write_com(0 x0c);设置开显示,不显示光标write_com(0 x06);写一个字符后地址指针加1write_com(0 x01);显示清零,数据指针清零)void main()(init();write_com(0 x80+0 x 10);for(num=0;num 15;num+)(write_data(tablenum);delay(5);)write_com(0 x80+0 x50);for(num=0;num 16;num+)write_data(tablel num);
40、delay(5);)fbr(num=0;num16;num+)write_com(0 xl8);delay(200);)while(l);例 7.3.1实 现 12232液晶的第一行显示“I LOVE MCU!”,第二行显示“我爱单片机”。(part2.5_3.c P160)#inciude#define uint unsigned int#define uchar unsigned charsbit CS=P1A2;sbitSID=PlAl;sbit SCLK=P1AO;uchar code disps=nI LOVE MCU!”;uchar code dispx=我爱单片机!”;void
41、delay_lms(uint x)uint i,j;fbr(j=O;jx;j+)for(i=0;il 10;i+);)void send_command(uchar command_data)(uchar i;uchar i_data;i_data=0 xf8;CS=1;SCLK=0;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;)i_data=command_data;i_data&=OxfO;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_
42、data=i_datal;)i_data=command_data;i_data=4;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=O;SCLK=1;i_data=i_datal;)cs=o;de!ay_lms(10);)void send_data(uchar command_data)(uchar i;uchar i_data;i_data=Oxfa;CS=1;fdr(i=O;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;)i_data=command_data;i_data
43、&=0 xf0;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;)i_data=command_data;i_data=4;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;)CS=0;delay_lms(10);void lcd_init()(delay_lms(100);send_command(0 x30);/*设置8 位数据接口,基本指令模式。*/send_command(0 x02);/*清 DDRAM*/sen
44、d_command(0 x06);/*游标及显示右移一位*/send_command(OxOc);/*整体显示开,游标关,反白关*/send_command(0 x01);/*写入空格清屏幕*/send_command(0 x80);/*设定首次显示位置*/void display_s()(uchar a;send_command(0 x80);for(a=0;all;a+)(send_data(dispsa);)void display_x()(uchar a;send_command(0 x92);for(a=0;al l;a+)(send_data(dispxa);)main()(lcd
45、_init();display_s();display_x();while(l);)例 7.3.2实 现 12232液晶第一行从右侧移入“Hell。everyone!,同时第二行从右侧移入“欢迎大家来学习!”移入速度自定,最后停留在屏幕上。(part2.5_4.c P163)include#define uint unsigned int#define uchar unsigned charsbit CS=P1A2;sbit SID=P1A1;sbit SCLK=P1AO;uchar code disps=Hello everyone!;uchar code dispx=欢迎大家来学习!”;v
46、oid delay_lms(uint x)(uint ij;for(j=0;jx;j+)for(i=0;il 10;i+);)void send_command(uchar command_data)(uchar i;uchar i_data;i_data=0 xf8;CS=1;SCLK=0;for(i=0;i8;i+)SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;i_data=command_data;i_data&=0 xf0;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1
47、;i_data=i_datal;)i_data=command_data;i_data=4;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=I;i_data=i_datal;CS=0;delay_lms(l);void send_data(uchar command_data)(uchar i;uchar i_data;i_data=Oxfa;CS=1;for(i=0;i8;i+)(SID=(bit)(i_data&Ox8O);SCLK=0;SCLK=1;i_data=i_datal;)i_data=command_data;i_data&
48、=OxfO;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;)i_data=command_data;i_data=4;for(i=0;i8;i+)(SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_datal;)CS=0;delay_lms(l);)void lcd_init()(delay_lms(100);send_command(0 x30);/*设置8 位数据接口,基本指令模式。*/send_command(0 x02);/*清 DDRAM*/send_
49、command(0 x06);/*游标及显示右移一位*/send_command(OxOc);/*整体显示开,游标关,反白关*/send_command(0 x01);/*写入空格清屏幕*/send_command(0 x80);/*设定首次显示位置*/void display_s(uchar num)uchar a;send_command(0 x88-num);fbr(a=0;a15;a+)(send_data(dispsa);)void display_x(uchar num)(uchar a;send_command(0 x98-num);for(a=0;a15;a+)(send_da
50、ta(dispxa);)main()(uchar aa;lcd_init();for(aa=0;aa9;aa+)(display_s(aa);display_x(aa);delay_lms(300);)while(l);)例 7 4 1 实现在12864液晶上第一行显示“0123456789”,并且让每一位数字随机变化,第二行 显 示“,第三行显 示“天祥电子”,第四行对应第三行显示出下划线。(part2.5_5.c P173)#inciude#include#include#define uchar unsigned char#define uint unsigned int/*端口定义*/