陳慶逸、林柏辰編著---文魁資訊ARM嵌入式系统项目三数码管显示工作模块6数码管循环显示0~9利用AT89S51单片机的 P1端口的P1.0-P1.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字。 数码管显示程序(C程序)#includeunsignedcharcodetable[]={0 x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchar dispcount;voiddelay(void){unsignedchari,j,k;for(i =40;i>0;i--)for(j=40;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){for(dispcount=0;dispco unt<10;dispcount++){P1=table[dispcount]; delay();}}}思考如何在数码管上循环显示 9-0数字?认识数码管(P132)数码管结构图数码管电路图共阴数码管共阳数码管74LS24574LS245是 8路同相三态双向数据总线驱动芯片,具有双向三态功能,既可以输出,也可以输入数据。/G为低电平有效;DIR=“1”,信号由A 向B传输。引出端符号:A总线端B总线端/G三态允许端(低电平 有效)DIR方向控制端关系运算符和关系表达式(P77)所谓“关系运算”实际上是两个值作一个比较,判断其 比较的结果是否符合给定的条件。关系运算的结果只有2种可能,即“真”和“假”。例如:3>2的结果为真,而3<2的结 果为假。关系运算符C语言一共提供了6种关系运算符:小于:“<”;小于等于:“<=”;大于: “>”;大于等于:“>=”;等于:“==”;不等于:“!=”。关系表达式用关系运算符将两个 表达式连接起来的式子,称为关系表达式。例如:a>b,a+b>b+c,(a=3)>=(b=5)在C语言中,没有专门的逻辑型变 量,如果运算的结果是“真”,用数值“1”表示,而运算的结果是“假”则用数值“0”表示。例如:x1=3>2的结果是x1等于1 原因是3>2的结果是“真”,即其结果为1,该结果被“=”号赋给了x1。又如:x2=3<=2的结果是x2=0,请自行分析。 逻辑运算符C语言提供了三种逻辑运算符:“&&”(逻辑与);“||”(逻辑或);“!”(逻辑非)。逻辑表达式用逻辑运 算符将关系表达式或逻辑量连接起来的式子,称为逻辑表达式。C语言编译系统在给出逻辑运算的结果时:用“1”表示真,而用“0”表示假 。在判断一个量是否是“真”时,以0代表“假”,而以非0代表“真”,这一点务必要注意。若a=10,则!a的值为0,因为10被作为 真处理;如果a=-2,结果与上完全相同,初学时常会误以为负值为假,所以这里特别提醒注意;若a=10,b=20,则a&&b的值为 1,a||b的结果也为1。if语句(P54)用if语句构成分支结构。分支结构又称选择结构,它体现了程序的判断能力。这种结 构根据程序的判断结果,来确定某些操作是做还是不做,或者从多个操作中选择一个操作来执行。单分支if语句单分支if语句的基本形式 为:if(表达式)语句如果表达式的结果为真,则执行语句,否则不执行。 单分支if语句双分支if语句双分支if语句语句的基本形式为:if(表达式)语句1else语句2 如果表达式的结果为真,则执行语句1,否则执行语句2双分支if语句多分支if语句多分支if语句的基本形式为: if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3… elseif(表达式m)语句melse语句nif语句的嵌套当if语句中的语句体又包含一个或多个if语句,称为i f语句的嵌套。其一般形式如下:if(表达式)if(表达式1)语句11else语句12else if(表达式2)语句21else语句22应当注意if与else的配对关系,C语言规定:else总是与它上面的最 近的if配对swich语句Switch的一般形式如下:switch(表达式){case常量表达式1:语句 1case常量表达式2:语句2……case常量表达式n:语句ndefault:语句n+1} 当表达式的值与某一个case后面的常量表达式相等时,就执行此case后面的语句;若所有的case中的常量表达式的值都没有与表达 式值匹配的,就执行default后面的语句;每一个case的常量表达式的值必须不相同;各个case和default的出现次序不 影响执行结果。swich语句特别说明执行完一个case后面的语句后,并不会自动跳出switch,转而去执行其后面的语句; 通常在每一段case的结束加入“break;”语句,使程序退出switch结构,即终止switch语句的执行。如:switc h(x){case1:y=1;case2:y=2;case3:y=0;}假如 x的值是1,y=?循环结构控制语句在一个实用的程序中,循环结构是必不可少的。循环是反复执行某一部分程序行的操作。通过下面 C语言程序,来看如何利用这些循环语句编写循环程序。voidDelay() voidmain(){ {unsignedchari,j; while(1)for(i=0;i<255;i++){;} {……}} }这段程序中有两处用到了循环语句,首先是主程序使用了:while(1){……}这样的循环语句写法,在{}中的所有程 序将会不断地循环执行,直到断电为止;其次是延时程序,使用了for循环语句的形式。while语句当型循环,即当给定的条件成立时 ,执行循环体部分,执行完毕回来再次判断条件,如果条件成立继续循环,否则退出循环。其一般形式如下:while(表达式) 循环体语句当表达式为非0值(真)时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。do-while 语句直到型循环,即先执行循环体,然后判断给定的条件,只要条件成立就继续循环,直到判断出给定的条件不成立时退出循环。其一般形式如下 :do循环体语句while(表达式)do-while语句特点是先执行循环体,然后判断循环条件是否成立。对同 一个问题,既可以用while语句处理,也可以用do-while语句处理,但是这两个语句是有区别的。for语句C语言中的for 语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。for语句的一般形式为 :for(表达式1;表达式2;表达式3)循环体语句执行步骤如下:(1)先求解表达式1;(2)求解表达式2,其值为 真,则执行for语句中指定的内嵌语句(循环体),然后执行第(3)步,如果为假,则结束循环;(3)求解表达式3;(4)转回第2步 继续执行。break语句break语句强行结束循环,转向执行循环语句的下一条语句。在一个循环程序中,可以通过循环语句中 的表达式来控制循环程序是否结束。除此之外,还可以通过break语句从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。 一般形式:break;注意:break语句不能用于循环语句和switch语句之外的任何其他语句中;break语句是结束 整个循环过程,不再判断执行循环的条件是否成立。continue语句continue语句作用为结束本次循环,即跳过循环体中下面 尚未执行的语句,接着进行下一次是否执行循环的判定。对于for循环,跳过循环体其余语句,转向循环变量增值表达式的计算;对于whil e和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。一般形式:continue;注意:conti nue只能用于循环语句中;continue语句只结束本次循环,而不是终止整个循环的执行。工作模块7LED动态扫描显示动态显 示,也称扫描显示;显示器由6个共阴极LED数码管构成;P0口输出显示段码,经由一片74LS245驱动输出给LED管;P1口输 出位码(片选),经由74LS05输出给LED管。LED动态扫描显示电路(P135)动态显示特点在多位LED显示时,为了降低 成本和功耗,将所有位的段选控制端并联起来,由一个8位端口控制(本任务中用P0口);各位数码管的公共端(com端),用作“位选端”, 由另一个端口进行显示位的控制(本任务中用P1口)。由于段选端是公用的,要让各位数码管显示不同的字符,就必须采用扫描方式,即动态扫 描显示方式。动态扫描是采用分时的方法轮流点亮各位数码管的显示方式,它在某一时间段,只让其中一位数码管的“位选端”(com端)有效, 并送出相应的字型编码。动态扫描过程首先从段选线上送出字型编码,再控制位选端,字符就显示在指定数码管上,其他位选端无效的数码管 都处于熄灭状态,持续1.5ms时间,然后关闭所有显示;接下来又送出新的字型编码,按照上述过程又显示在另外一位数码管上,直到每一 位数码管都扫描完为止,这一过程即为动态扫描显示。数码管其实是轮流依次点亮的,但由于人的视觉驻留效应,因此当每个数码管点亮的时间 小到一定程度时,人就感觉不出字符的移动或闪烁,觉得每位数码管都一直在显示,达到一种稳定的视觉效果。思考题如何修改程序,实现 六位LED数码管只显示其中的两位?定义段码表#includeunsignedcharcodeT ab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C };unsignedcharcodeCol[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};void Delay(){unsignedchari;for(i=0;i<250;i++);}主函数voidm ain()//同时显示123456{unsignedcharj;while(1) {for(j=1;j<7;j++) {P0=Tab[j];P1=Col[j-1]; //开第一个(共阴)数码管Delay();P1= 0xff;//关数码管 Delay();}}}一维数组(P86)在C语 言中数组必须要先定义,后使用。一维数组的定义方式为:类型说明符数组名[整型表达式];类型说明符是任一种标准数据类型或构造数 据类型,是数组中各个元素的数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。 例如:inta[9];//定义整型数组a,有9个元素,下标从0到8。floatb[5];//定义实型数 组b,有5个元素,下标从0到4。charch[10];//定义字符数组ch,有10个元素,下标从0到9。注意事项数 组的类型是指构成数组的元素的类型。对于同一个数组,其所有元素的数据类型都是相同的。数组名的书写规则应符合标识符的命名规则,并且不 能与其它变量同名。常量表达式可以是符号常量或常量表达式,但是不能包含变量,即不能对数组的大小作动态定义。工作模块80- 99计数器利用AT89S52单片机来制作一个0~99计数器。要求使用一个手动计数按钮,实现0~99的计数,并且通过两个共阴数码管 显示计数结果,数码管显示采用静态显示方式。静态显示;显示器由2个共阴极数码管组成;0-99计数器电路设计静态显示的概念 静态显示是指显示驱动电路具有输出锁存功能,待显示的字符编码被CPU送出后,数码管会一直显示该字符不变,CPU不需要再控制数码管, 如果要显示新的字符,CPU只要再次送出即可。采用静态显示方式,较小的电流就可以获得较高的亮度,且占用CPU时间较少,编程简单, 显示便于检测和控制,但其占用的I/O口线较多,硬件电路复杂,成本高,只适合显示位数较少的场合。0-99计数显示c语言程序# include//包含AT89X52.H头文件/定义0~9十个数字的字型码表/ unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsignedcharCount;//定义变量放置计数数值voiddelay10ms(void) //定义10ms延时函数{unsignedchari,j;for(i=20;i> 0;i--)for(j=248;j>0;j--);}0-99计数显示c语言程序voidmain(void) {Count=0;//计数变量初始为0P0=table[Count/10];//十位管 显示P2=table[Count%10];//个位显示while(1)//计数 显示处理{if(P1_0==0)//键按下?{delay10ms( );//延时去抖动if(P1_0==0)//确定键按下{Count++; //计数加1if(Count==100)//计数到100?{ Count=0;//到100回0}P0=tab le[Count/10];//显示十位数P2=table[Count%10];//显示个位数 while(P1_0==0);//等键释放}}}C语言函数函数的分类和定义函数 分类无参函数有参函数函数定义函数类型说明符函数名([形式参数表]){函数体}函数的调用函 数调用的一般形式如下:函数名(实参列表);例如voidmDelay(unsignedintDelay){…… for(;Delay>0;Delay--)……}函数中Delay就是一个形式参数,而在主函数中调用时写 的:mDelay(1000);函数的返回值在C中,一般使用return语句由被调函数向主调函数返回值,该语句有下列用途 :它能立即从所在的函数中退出,返回到调用它的程序中去;返回一个值给调用它的函数。返回语句一般有如下的形式:ret urn;或return表达式;或return(表达式);技能拓展七段字形译码器74LS4774LS47是由 与非门、输入缓冲器和7个与或非门组成的BCD-7段数码管译码器/驱动器,是输出低电平有效的七段字形译码器。能将4位二进制编码— 十进制数(BCD码)转化成七段字形码,然后去驱动一个七段显示器。也就是说74LS47可以直接把数字转换为数码管的显示数字,从而可 以简化程序,节约单片机的IO开销。使用74LS47实现0-99计数显示显示电路采用硬件译码输出字型码控制显示内容,数码管 是共阳极数码管。0-99计数显示c语言程序voidmain(void){Count=0;//计数变量初始为0P2=0x0;//十位、个位数码管显示0while(1)//按键扫描,计数显示处理{……/十位数BCD码(Count/10<<4)和个位数BCD码(Count%10)相或/P2=(Count/10<<4)|(Count%10);while(P1_0==0);//等键释放……}}单片机应用技术项目教程(C语言版)计算机科学系项目三数码管显示教学目的掌握数字、字符转换成显示段码的软件译码方法;掌握静态显示的原理;掌握动态显示的原理;掌握数码管程序设计的方法。P130工作模块6ABCDEFGDP片选片选 |
|