




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 基于串行同步接口的数码管显示电路目标通过本章的学习,应掌握以下知识 同步串行接口的工作过程 数字电路器件功能表的使用 数字电路时序图的使用 时序电路的触发方式 利用移位寄存器将串行格式数据转换为并行格式数据 位操作运算符 多位数码管的显示电路 具有多个数位的数据分离为多个1位数据引言计算机的数据传输方式分为并行数据传输和串行数据传输两种方式。并行数据接口具有理解工作过程简单、数据传输速率快等优点,但是这种方式对芯片的管脚资源占用较多。上一章使用并行数据接口驱动数码管,每一个数码管的发光段需要占用一个微控制器管脚,每一个数码管需要占用一个8位并行数据接口。串行数据接口虽然数据传输速率慢,但是对芯片的管脚资源占用较少,例如使用同步串行接口只需要占用2个管脚即可。这2个管脚一个被用来传输数据,另一个被用来传输同步时钟。如果MSP430微控制器芯片采用同步串行接口输出数码管的显示代码,这样虽然减少了对管脚资源的消耗,但是必须设法完成将数据的串行格式转换为并行格式以满足数码管的要求。8位移位寄存器(串行输入,并行输出)74164是一种能够实现同步串行数据格式到8位并行数据格式转换的器件。使用MSP430微控制器芯片的2个管脚实现同步串行接口,使用多个8位移位寄存器74164能够支持多个数码管的显示驱动。1个数码管只能显示1位数据,对于一个具有多个数位的数据可以将它分解为多个1位数据,再使用多个数码管完成这个数据的显示。MSP430微控制器芯片内部包含实现同步串行接口的外围模块,本章不使用这个外围模块。这里采用软件的方法实现同步串行接口,这样即能更好地理解接口的工作过程,又能练习应用程序的设计。5.1 8位移位寄存器(串行输入,并行输出)74164串行接口的输出数据不能直接送入数码管,一个明显的原因就是串行数据通过一条线输出,而数码管的工作则同时需要8个输入信号。使用8位移位寄存器(串行输入,并行输出)74164芯片,同步串行信号能够转换成数码管所需要的并行信号以满足数码管的需要。8位移位寄存器74164芯片的管脚排列图如图5.1所示。图5.1 8位移位寄存器74164芯片管脚排列图8位移位寄存器(串行输入,并行输出)74164芯片的管脚A和B(管脚1和2)为串行数据输入管脚,管脚CLK(管脚8)为串行时钟输入管脚。管脚Q0Q7(管脚36和管脚1013)为并行数据输出管脚。管脚MR(管脚9)能够强制8个并行数据输出管脚都输出0,即它们都为低电平。芯片的功能表用来描述它的功能以及工作过程。74164芯片的功能表如表5.1所示。表5.1 74164芯片的功能表输 入输 出MR CLK A B Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q70 0 0 0 0 0 0 0 01 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60 Q701 1 1 1 Q00 Q10 Q20 Q30 Q40 Q50 Q601 0 0 Q00 Q10 Q20 Q30 Q40 Q50 Q601 0 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60由表5.1所示的74164芯片功能表,当74164管脚MR为低电平时,即写入数据“0”,并行输出管脚全部清零。这时芯片的输出与它的输入管脚状态无关。在功能表中,其它输入管脚的输入状态无影响用符号“”来表示。正常工作时,管脚MR应为高电平,即写入数据“1”。当时钟输入管脚为低电平时,即写入数据“0”,8个并行输出管脚将保持它们的输出状态。当时钟上跳边沿到来时,用符号“”表示,如果管脚A和B都处于高电平状态,即它们同时都被送数据“1”,这时这个数据“1”将被送到并行输出管脚Q0对应的触发器,使得并行输出管脚Q0呈现高电平,即输出数据“1”。时钟的前沿还将触发以下工作,将并行输出管脚Q0对应的触发器原有的数据移到并行输出管脚Q1对应的触发器;将并行输出管脚Q1对应的触发器原有的数据移到并行输出管脚Q2对应的触发器; ;将并行输出管脚Q6对应的触发器原有的数据移到并行输出管脚Q7对应的触发器。当时钟上跳边沿到来时,用符号“”表示,如果管脚A和B任意一个处于低电平状态,即它们任意一个被送数据“0”,这时这个数据“0”将被送到并行输出管脚Q0对应的触发器,使得并行输出管脚Q0呈现低电平,即输出数据“0”。时钟的前沿还触发以下工作,将并行输出管脚Q0对应的触发器原有的数据移到并行输出管脚Q1对应的触发器;将并行输出管脚Q1对应的触发器原有的数据移到并行输出管脚Q2对应的触发器; ;将并行输出管脚Q6对应的触发器原有的数据移到并行输出管脚Q7对应的触发器。利用74164芯片驱动1位数码管的应用电路连线图如图5.2所示。该图按照使用面包板组装电路来进行设计。74164芯片需要的输入信号,串行同步时钟信号CLK和数据信号DATA,都将由MSP430微控制器芯片产生。图 5.2 基于串行输出口的数码管显示电路图5.2中,管脚MR直接与电源连接,满足电路正常工作的要求。电路中将管脚A和B连接在一起,这样当时钟上跳边沿,“”,到来时,无论数据为0,或者为1,它都能送到并行输出管脚Q0。图中实现串行数据格式到并行数据格式转换器件的名称在这里写为74HC164。名称中的HC表示这种芯片采用CMOS制造工艺,强调它的原因是采用这种制造工艺制作芯片的工作电压为26V,与MSP430微控制器芯片的工作电压,1.83.6V,基本兼容。将1个字节的8个数据位,在8个时钟信号的作用下,逐个送入移位寄存器74HC164,就能够将同步串行传输方式的数据格式转换为并行数据格式。在这个逐个送入的过程中,移位寄存器74HC164的8个并行输出管脚的状态处于不断地变化中,但是如果这个传送过程很快,眼睛实际是分辨不出数码管对应的变化。如果在完成1个字节的8个数据位传送以后,不再有时钟信号到来,移位寄存器74HC164的并行输出管脚的状态将保持不变,数码管就处于稳定地显示状态。微控制器芯片与数码管之间采用串行同步数据传送方式节省了输入/输出管脚资源,采用74HC164锁存数据将实现数码管的静态显示,不再需要微控制器对其进行进一步的管理,这时能够使用微控制器完成其它任务。8位移位寄存器74HC164的上边沿具有4个输出管脚,下边沿具有4个输出管脚。数码管也是的上边沿具有4个输入管脚,下边沿具有4个输入管脚。如图5.1所示的电路连线图,分别将74HC164的上边沿的4个输出管脚分别与数码管的上边沿的4个输入管脚连接在一起,分别将74HC164的下边沿的4个输出管脚分别与数码管的下边沿的4个输入管脚连接在一起,这样将使得电路连接变得简单和整齐。按照图5.1所示的电路连线图,数码管的各个管脚与8位移位寄存器74HC164管脚的连接关系如表5.2所示。表5.2 数码管管脚与8位移位寄存器74HC164管脚的连接关系74HC164Q7Q6Q5Q4Q3Q2Q1Q0数码管bafgedcdp以显示数据“0”为例,现在数码管需要除过发光段g和dp之外的其它发光段都被点亮,即需要8位移位寄存器74HC164的并行输出管脚除过Q4和Q0以外都输出高电平。这样可以获得按照图5.1所示的电路连线图,数据“0”的显示代码,它写成2进制数据格式为0b11101110,写成16进制数据格式为0xee。采用这种方法,可以非常方便地写出其它数据的显示代码。硬件是软件的基础。数码管接收的显示代码就是它的控制器件数字输出端口的输出数据,两者不同的连接关系将会具有不同的显示代码。建议采用方便的连接关系来组装电路,因为编写显示代码比在电路板上连线方便。5.2 同步串行接口的1位数码管驱动函数5.2.1 1位数码管驱动函数对于8位移位寄存器74HC164,在时钟信号上升沿的作用下,1个串行数据位首先被移入并行输出管脚Q0对应的触发器。当有新的串行数据位再被移入并行输出管脚Q0对应的触发器,原有的数据将被移入并行输出管脚Q1对应的触发器。Q1原有的数据将被移入并行输出管脚Q2对应的触发器。将1个显示代码的8位数据位全部移入8位移位寄存器74HC164,需要在8个时钟信号的作用下,这8位数据逐个送入移位寄存器74HC164。这个数据位的传输过程可以使用一种称作为时序图的图形描述的方法进行叙述。时序图能够直观地给出所需要信号的变化情况以及信号之间的时间关系。按照74HC164的工作过程,当需要输出1位数码管的显示代码,MSP430微控制器需要产生如图5.3所示的控制时序。这里需要强调的是,首先应该送出显示代码字节的最高位(Most Significant Bit,MSB),最后输出最低位(Least Significant Bit,LSB)。图5.3 同步串行数据时序图输出1位数码管的显示代码,MSP430微控制器需要分8次将显示代码的各位逐个送出。对于输出显示代码的每一位,首先需要使输出串行时钟的管脚输出低电平,预备产生串行时钟的上升沿;接着使用串行数据管脚输出显示代码的一位;最后使输出串行时钟的管脚输出高电平,产生串行时钟的上升沿。串行数据时序图的每1位被画成菱形形状。菱形的上和下两边表示数据的2种可能取值,0和1。菱形的左右两边表示数据无论从0变成1,还是从1变成0,不能立即完成状态转换。这个原因是管脚电容的存在,使得它的电压不能突变。图5.3所示的同步串行数据时序图显示出数据必须在时钟上升边沿之后才能改变,这是必须的。按照74164芯片的功能表,接着是先改变串行数据,还是先将串行时钟变为低电平,这个关系不大。编写1位数码管显示代码的驱动函数的目的就是要在MSP430微控制器芯片扮演串行数据管脚和串行时钟管脚上产生图5.3所示的波形。这里给出采用同步串行接口方式输出1位数码管显示代码的驱动函数。该函数使用P1.7管脚输出串行数据,使用P1.6管脚输出串行同步时钟。/ 驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数/ P1.7 数据管脚,P1.6 同步时钟管脚void seg7_1ms(unsigned char seg7_data) unsigned char code_seg7; / 声明显示代码变量code_seg7= decoder_seg7 seg7_data;/ 数据译码/ 同步串行接口初始化P1OUT&=BIT6; / P1.6 输出低电平P1OUT&=BIT7; / P1.7 输出低电平/ 逐位输出1个字节的8个数据位/ 输出第1位数据(MSB) / 产生数据信号if(code_seg7&0x80) P1OUT|=BIT7; / P1.7 输出高电平else P1OUT&=BIT7; / P1.7 输出低电平/ 产生同步时钟信号P1OUT|=BIT6; / P1.6 输出高电平P1OUT&=BIT6; / P1.6 输出低电平/ 输出第2位数据if(code_seg7&0x40) / 输出第8位数据(LSB) / 产生数据信号if(code_seg7&0x01) P1OUT|=BIT7; / P1.7 输出高电平else P1OUT&=BIT7; / P1.7 输出低电平/ 产生同步时钟信号P1OUT|=BIT6; / P1.6 输出高电平P1OUT&=BIT6; / P1.6 输出低电平该驱动函数具有1个参量,参量的数据类型为unsigned char数据类型。这个参量为数码管将要显示的数据。驱动函数接收将要显示的1位数据,显示数据在函数内部完成译码。接着的2条语句把输出串行同步时钟的管脚P1.6 和输出串行数据的管脚P1.7都配置为低电平,准备开始传送串行数据。 由于MSP430系列微控制器不支持位寻址,因此需要利于逻辑运算的方法来分离出来将要传送的串行数据位的状态,再利用条件语句确定输出串行数据的管脚状态。首先应该输出显示代码的最高位。对于显示代码的最高位,在条件语句的条件表达式将显示代码和数据0x80相与,使得条件是否成立仅决定于显示代码最高位的状态。if(code_seg7&0x80) / 输出第一位数据 P1OUT|=BIT7; / P1.7 输出高电平 else P1OUT&=BIT7; / P1.7 输出低电平 如果显示代码的最高位为1,则条件成立,串行数据输出管脚置位;如果显示代码的最高位为0,则条件不成立,串行数据输出管脚清零。由于在此之前已经使串行同步时钟的管脚P1.6为低电平,这样利用以下2条语句P1OUT|=BIT6; / P1.6 输出高电平 P1OUT&=BIT6; / P1.6 输出低电平就产生串行同步时钟的前沿,并再次对串行同步时钟输出管脚进行了清零,为产生下一个时钟前沿做好准备。这样就完成1位数据的同步串行方式输出。采用同样的方法即可完成其余7位数据的同步串行方式输出。按照同步串行方式输出的显示代码送到8位移位寄存器74HC164,由它将其转换为并行数据格式输出到数码管。5.2.2 利用循环语句简化1位数码管驱动函数/ 驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数/ P1.7 数据管脚,P1.6 同步时钟管脚void seg7_1ms(unsigned char seg7_data) unsigned char code_seg7; / 声明显示代码变量 unsigned char serial_number; / 声明循环变量 unsigned char serial_shift; / 声明串行数据位存储变量 code_seg7=decoder_seg7seg7_data; / 显示数据译码/ 同步串行接口初始化P1OUT&=BIT6; / P1.6 输出低电平P1OUT&=BIT7; / P1.7 输出低电平serial_shift=0x80; / 串行数据位指向 8 位数据的最高位 for(serial_number=0; serial_number1; / 串行数据位指向数据位右移 1 位 该函数利用循环语句,通过8次循环完成1个显示代码中的8个数据位按照同步串行的方式逐位送出。这里循环变量serial_number用来控制一个循环完成输出数据位的个数。前面小节中,在能够确定显示代码具体数位的情况下,通过显示代码和一个常量数据,这个常量对应数据位为“1”,其它数据位都为“0”,相与的方法获得条件语句是否成立。现在需要利用变量,下面表达式code_seg7&serial_shift可以获得条件语句是否成立。串行数据位存储变量serial_shift的初始值为0x80,指向显示代码的最高位。在输出显示代码的最高位以后,语句serial_shift=serial_shift1;使得串行数据位存储变量serial_shift中的内容右移1位,最高位补0。当变量serial_shift的原来内容为0x80,本条语句执行后,变量serial_shift的内容将变为0x40,指向到显示代码的次高位。在变量serial_shift的内容变为0x40,在第二个循环中,条件语句就能够根据显示代码次高位的状态来确定输出串行数据管脚的状态。依次类推,循环语句每完成一次循环,使得串行数据位存储变量serial_shift中的内容右移1位,最高位补0,为条件语句下一次的判断做好准备。小节5.2.1中给出的1位数码管驱动函数虽然较长,但是直观地描述了同步串行格式的一个字节数据的传输过程。本小节给出的1位数码管驱动函数结构简练,同时也能够节省程序存储器的资源。5.2.3 同步串行接口的1位数码管演示程序程序示例5.1/ 程序名称:seg1_1ms/ 程序功能:通过模拟同步串口控制 1 个 7 段共阴极数码管/ P1.7 数据管脚,P1.6 同步时钟管脚#include / 包含名称定义和对应地址或数据的头函数void delay_1s(void); / 声明 1s 延迟函数void seg7_1ms(unsigned char seg7_data);/ 声明驱动 1 位数码管的驱动函数const unsigned char decoder_seg718= 0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6,0xde,0x3e,0x6c,0x9e,0x7c,0x78,0x00,0xff;/ 按表 5.2 所示连接关系共阴极数码管显示代码int main(void) / 主函数 unsigned char data_seg7; / 声明显示数据变量 WDTCTL=WDTPW+WDTHOLD; / 关闭看门狗 P1SEL&=BIT7; / 设置 P1.7 端口为并行数字输入 / 输出口 P1DIR|=BIT7; / 设置 P1.7 端口为输出口 P1SEL&=BIT6; / 设置 P1.6 端口为并行数字输入 / 输出口 P1DIR|=BIT6; / 设置 P1.6 端口为输出口 while(1) / 重复执行 for(data_seg7=0x00; data_seg70x10; data_seg7+)/ 利用循环语句产生显示数据 seg7_1ms(data_seg7);/ 调用驱动 1 位数码管的驱动函数 delay_1s( ); / 调用 1s 延迟函数 void seg7_1ms(unsigned char seg7_data)/ 驱动 1 位数码管的同步串行数据接口驱动函数void delay_1s(void) / 1s 延迟函数比较程序示例5.1和程序示例4.2,这里增加了驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数。鉴于篇幅原因,程序中的所有函数的内容没有写出,读者在进行程序编辑时必须将其内容完整地输入。数码管的同步串行数据接口驱动函数可以使用前面给出2种的任意一种。5.3 位运算操作符位运算操作符包括与、或、异或、非、位左移以及位右移。参与位运算数据的数据类型可以是char、int和long。注意,float数据类型的数据不支持位运算。 位与位与的运算操作符号为“&”。运算规则如下0 & 0 = 00 & 1 = 01 & 0 = 01 & 1 = 1运算规则可以总结为参加运算的两位都为1,结果为1;只要有一位为0,结果为0。例如2个unsigned char数据类型数据,x=0b01010101,y=0b00001111,它们位与的结果为x:01010101y:&0000111100000101 位或位或的运算操作符号为“|”。运算规则如下0 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1运算规则可以总结为参加运算的两位都为0,结果为0;只要有一位为1,结果为1。例如2个unsigned char数据类型数据,x=0b01010101,y=0b00001111,它们位与的结果为x:01010101y:|0000111101011111 位异或位异或的运算操作符号为“”。运算规则如下0 0 = 00 1 = 01 0 = 11 1 = 0运算规则可以总结为参加运算的两位的值相同,结果为0;两位的值不同,结果为1。例如2个unsigned char数据类型数据,x=0b01010101,y=0b00001111,它们位与的结果为x:01010101y:0000111101011010 位取非位取非是一个单目运算符,用来对一个二进制数据按位进行取反。它的运算操作符号为“”。运算规则如下0 = 01 = 0运算规则可以总结数据值为1,结果为0;数据值为0,结果为1。例如unsigned char数据类型数据,x=0b0101010,它按位取非的结果为x:0101010110101010 位左移位左移用来将一个数的每一位二进制位全部左移若干位,移位以后,空白位补0,移出的位舍弃。位左移的运算操作符号为“ n”,这里n为自然数,表示进行左移的位数。例如unsigned char数据类型数据,y=0b00001111,它左移2位, 2,的结果为y:00001111 n”,这里n为自然数,表示进行右移的位数。例如unsigned char数据类型数据,y=0b00001111,它右移2位, 2,的结果为y:000011112:000000111100000011对一个数据中的某一位进行操作是经常需要的。例如程序示例5.1中对驱动74HC164器件的MSP430微控制器芯片管脚P1.7(输出串行数据)和P1.6(输出串行同步时钟)的配置语句,它们只影响了想要配置的管脚,对其它管脚的配置情况并没有任何影响。在驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数中,输出串行数据和串行时钟也是只改变一个管脚的输出状态,同时保持同一端口其它管脚的输出状态不变。在利用循环语句简化的1位数码管驱动函数中,利用位运算表达式code_seg7&serial_shift产生条件语句的判断条件。利用位运算语句serial_shift=serial_shift1;调整判断的具体位。MSP430微控制器芯片不支持位寻址。在需要对一个数据中某一个具体位进行处理的情况下,位运算操作提供了一种替代的方法。这里事实上采用的是字节寻址,一次处理的是一个字(16位),但是只影响了一位,其它位保持不变。5.4 多位数据的显示5.4.1 采用同步串行接口的多个数码管显示电路对于8位移位寄存器74HC164,在时钟信号上升沿的作用下,1个串行数据位首先被移入并行输出管脚Q0对应的触发器。并行输出管脚Q0对应的触发器的原有的数据将被移入并行输出管脚Q1对应的触发器。Q1原有的数据将被移入并行输出管脚Q2对应的触发器。调用一次驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数,在产生的8个串行时钟信号的作用下,显示代码所包含的8位数据被全部送到移位寄存器74HC164的8个输出管脚。最先移入的数据位将被移进输出管脚Q7对应的触发器。如果需要同时显示多位数据,可以使用多个8位移位寄存器74HC164,每一个移位寄存器的并行输出管脚驱动一个数码管。图5.4给出了一个基于同步串行接口的2位数码管显示电路。注意这里74HC164的输出管脚与数码管输入管脚的连接关系与图5.2不同,这是希望电路图的绘制整齐一些。建议读者仍采用图5.2所示的连接关系,方便连线。图5.4 采用同步串行接口的2位数码管显示电路在图5.4所示的电路中,串行时钟同时加到2个移位寄存器74HC164的时钟输入管脚,因此在时钟信号的作用下,2个移位寄存器同时进行数据的移位工作。执行一次驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数,一个显示代码完整地出现在第一个移位寄存器的并行输出管脚。并行输出管脚Q7的信号加到数码管输入管脚,同时这个信号也送到第二个移位寄存器的串行数据输入管脚A和B。接着再执行驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数,当将第2个显示代码的第一位移入第一个移位寄存器的Q0,同时在第二个移位寄存器的串行数据输入管脚A和B,即第1个显示代码的第一位,将移入第二个移位寄存器的Q0。在第2个显示代码的被全部移入第一个移位寄存器的同时,第1个显示代码的被全部移入第二个移位寄存器。程序示例5.1给出的同步串行接口的1位数码管演示程序可以被用于图5.4所示的电路。如果第1个数码管显示某个数值,则第2个数码管将显示第1个数码管上一次显示的数值。例如,当前第1个数码管显示“6”,则第2个数码管将显示“5”。注意,在图5.4所示的电路中,8位移位寄存器74HC164的并行输出管脚与数码管输入管脚之间的连接关系与图5.2所示的电路不同,这将影响显示代码。建议读者采用图5.2所示电路的8位移位寄存器74HC164的并行输出管脚与数码管输入管脚之间的连接关系,只要保证串行时钟同时加到2个移位寄存器的时钟输入管脚,第1个移位寄存器的并行输出管脚Q7与第2个移位寄存器的串行数据输入管脚相连接即可。图5.4所示的电路能够扩展为包含更多数码管的电路。这里串行时钟信号将同时加到所有8位移位寄存器74HC164的时钟输入管脚,前一级移位寄存器74HC164的并行输出管脚Q7与后一级移位寄存器74HC164的串行数据输入管脚相连接。程序示例5.1给出的同步串行接口的1位数码管演示程序仍然可以用来检查电路的工作情况。5.4.2 数据分离使用具有图5.4所示的电路形式能够显示具有多个数位的数据,但是这个数据需要先被分解为多个1位数字。例如把数据123分解为百位数字“1”、十位数字“2”以及个位数字“3”。完成一个具有多个数位数据的分解,获得的每一位数字就能够调用数码管的同步串行数据接口驱动函数来完成数码管的驱动。下面的程序段完成将一个值域为0999的整型数据变量data_seg7_temp分解为10进制数据格式的百位、十位和个位。data_seg7_2=data_seg7_temp/100; / 产生百位显示数据 data_seg7_temp=data_seg7_temp%100; / 分离出低 2 位数据 data_seg7_1=data_seg7_temp/10; / 产生十位显示数据data_seg7_0=data_seg7_temp%10; / 产生个位显示数据这里变量data_seg7_2、data_seg7_1和data_seg7_0的数据类型都为unsigned char,与驱动 1 位 7 段共阴极数码管的同步串行数据接口驱动函数中参量的数据类型相同。由于这3个变量属于整型变量,因此上述语句右边计算结果的小数部分将自动丢弃。下面的程序段完成将一个值域为0x000xFF的整型数据变量data_seg7_temp分解为16进制数据格式的高、低两位。data_seg7_1=(data_seg7&0xf0)4; / 产生高位显示数据 data_seg7_0=data_seg7&0x0f; / 产生低位显示数据分解为16进制数据格式的语句中使用了位运算操作。两句都使用了位与运算来除掉不需要的数据部分。对于16进制格式数据高位,即对应的2进制数据格式的高4位,通过右移4位操作产生它的显示数据。5.4.3 采用同步串行接口的3个数码管驱动函数以显示3位数据为例,这时需要3个数码管和3个移位寄存器74HC164。每个数码管和移位寄存器74HC164之间的连线应该采用同样的方式,如表5.2所示,这样就能够使用同样的从显示数据到显示代码的译码表。3个数码管和移位寄存器74HC164组合从左到右排列。从MSP430微控制器芯片输出的串行数据信号加到最左边移位寄存器74HC164的串行数据输入管脚。左边移位寄存器74HC164的输出管脚Q7与右边移位寄存器74HC164的串行数据输入管脚相连接。从MSP430微控制器芯片输出的串行时钟信号同时加到每个移位寄存器74HC164的串行时钟输入管脚。驱动同步串行接口的3个数码管驱动函数如下。/ 驱动 3位数码管的同步串行数据接口驱动函数void seg7_3ms(unsigned char seg7_data2, unsigned char seg7_data1, unsigned char seg7_data0) seg7_1ms(seg7_data0); / 调用 1 位数码管的同步串行数据接口驱动函数 seg7_1ms(seg7_data1); / 调用 1 位数码管的同步串行数据接口驱动函数 seg7_1ms(seg7_data2); / 调用 1 位数码管的同步串行数据接口驱动函数这个函数具有3个参量,分别为已经完成数据分离的3位准备显示的数据。Embedded Workbench for MSP430开发软件要求对函数中的每一个参量必须进行数据类型说明,函数的参量可以是不同的数据类型。驱动3位数码管的同步串行数据接口驱动函数内部将1位数码管的同步串行数据接口驱动函数调用了3遍,分别输出3位准备显示数据的显示代码。最先输出的显示数据,seg7_data0,将被送到最右边的数码管进行显示,最后输出的显示数据,seg7_data2,将会在最左边的数码管进行显示。5.4.4 同步串行接口的3位数码管演示程序程序示例5.2/ 程序名称:seg1_3ms/ 程序功能:通过模拟同步串口控制 3 个 7 段共阴极数码管/ P1.7 数据管脚,P1.6 同步时钟管脚#include / 包含名称定义和对应地址或数据的头函数void delay_1s(void); / 声明 1s 延迟函数void seg7_1ms(unsigned char seg7_data);/ 声明驱动 1 位数码管的驱动函数void seg7_3ms(unsigned char seg7_data2, unsigned char seg7_data1, unsigned char seg7_data0);/ 声明驱动 3 位数码管的驱动函数const unsigned char decoder_seg718= 0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6,0xde,0x3e,0x6c,0x9e,0x7c,0x78,0x00,0xff;/ 按表 5.2 所示连接关系共阴极数码管显示代码int main(void) / 主函数 unsigned char data_seg7, data_seg7_temp; / 声明显示数据变量unsigned char data_seg7_2, data_seg7_1, data_seg7_0; / 声明每一位数据显示变量 WDTCTL=WDTPW+WDTHOLD; / 关闭看门狗 P1SEL&=BIT7; / 设置 P1.7 端口为并行数字输入 / 输出口 P1DIR|=BIT7; / 设置 P1.7 端口为输出口 P1SEL&=BIT6; / 设置 P1.6 端口为并行数字输入 / 输出口 P1DIR|=BIT6; / 设置 P1.6 端口为输出口 while(1) / 重复执行 / 10 进制数据显示 for(data_seg7=0; data_seg70xff; data_seg7+) / 利用循环语句产生显示数据 data_seg7_temp=data_seg7; / 不影响原始数据 data_seg7_2=data_seg7_temp/100; / 产生百位显示数据 data_seg7_temp=data_seg7_temp%100;/ 产生低 2 位数据 data_seg7_1=data_seg7_temp/10;/ 产生十位显示数据 data_seg7_0=data_seg7_temp%10;/ 产生个位显示数据 seg7_3ms(data_seg7_2, data_seg7_1, data_seg7_0); / 调用驱动 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 2423.66-2025环境试验第2部分:试验方法试验:温度/湿度/静负载综合
- GB/T 34880.3-2025五轴联动加工中心检验条件第3部分:技术条件
- 2025年文化馆戏剧辅导员招聘笔试模拟题及答案
- 2025届黑龙江省绥化市庆安县中考冲刺卷数学试题含解析
- 2025年通-用电气校招面试高频题解析
- 2025年汽车维修技术员等级考试试题及答案解析
- 2025年品牌策划专家职业知识考核试题及答案解析
- 2025年火灾安全知识测试题含答案
- 2025年建筑制图员职业资格考试试题及答案解析
- 2025年建筑经济师执业资格考试试题及答案解析
- 2025年高一上学期英语开学第一课课件
- 新老物业交接流程
- 校园网络安全知识培训课件
- 2025年卫生招聘考试之卫生招聘(财务)练习题及答案
- 新教材2025人教版七年级上册全部单词默写版
- (2025年标准)家庭寄宿协议书
- 住房保障知识业务培训课件
- 2025年秋季开学第一次全体中层班子会议上校长精彩讲话:把小事做细、把细事做实、把实事做好
- 小学五年级上册生命.生态.安全全册教案
- 顾客财产清单验证确认记录表、产品发放登记表
- 国家保安员资格考试培训教材
评论
0/150
提交评论