如图所示,代码下载到51板子(AT89C52)后数码管只显示了左边一位。(我想显示学号后8位。)是哪里写错了呢?
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
sbit A=P2^2;
sbit B1=P2^3;
sbit C=P2^4;
sbit beep=P2^5;
unsigned char sno[]={0x3F,0x3F,0x4F,0x3F,0x3F,0x07,0x4F,0x3F};
void printsno(unsigned char location)
{
switch(location)
{
case 0:C=1;B1=1;A=1;break;
case 1:C=1;B1=1;A=0;break;
case 2:C=1;B1=0;A=1;break;
case 3:C=1;B1=0;A=0;break;
case 4:C=0;B1=1;A=1;break;
case 5:C=0;B1=1;A=0;break;
case 6:C=0;B1=0;A=1;break;
case 7:C=0;B1=0;A=0;break;
}
P0=sno[location];
Delay1ms();
}
void main()
{
unsigned char i;
beep=0;
for(i=0;i<8;i++)
{
printsno(i);
}
while(1)
{
}
}
动态数码管必须不停刷新,静态数码管送一次即可。
四位一体数码管:
数码管电路原理:
与之有关的元件——“138译码器”:
①想要点亮一个数码管并让其显示数字,我们需要操作两个端口,给两个端口不同的电平。我们的单片机数码管上端是共阴极的,所以发光的条件是上端赋予低电平,下端赋予高电平。
【通俗理解:上方LED端口选择要点亮哪一个数码管;下方abcdefg端口确定点亮什么数字。】
(1)数码管上方有8个接口LED1~8,分别对应接到“译码器”的右输出端。译码器的左端连接单片机的3个P2口。(具体如何用三个P2口控制8个LED输出口,后面会单独讲解)
(2)每一体数码管下方引出abcdefg和dp共八个接口,分别对应点亮一个LED长条(图中有标注)或是小数点,点亮几个就可以组合成一个数字。这八个接口接到74HC245缓冲器的右输出端,而74HC245的左端连接单片机的8个P0口。74HC245左右端一一对应(A0-B0,A1-B1……)。
(缓冲器是用来提高单片机驱动能力的一个元件,VCC可以增强信号强度)
比如我现在想让LED6数码管发出“3”的数字。那么,上方接口所赋予的电平情况应该是(从左往右)1101 1111;下方接口接通abcdg,应该是(从左往右)1111 0010。但是,
我们在缓冲器左端传入的二进制必须从高位往低位读取。
比如,现在从左往右端口是1111 0010,但是P0输入端输入的是0100 1111,也就是P0=0x4F。
为了方便,这里总结数码管段码表:
②数码管静态显示时,只能让其中一个数码管发光。也就是说,在同一时间,上端接口只能保证有一个输入0。(具体原因见“译码器”工作方法)
③译码器工作方法:
左端输入端输入的信号按CBA排序,组成一个三位的二进制数,再将这个二进制数转化为十进制数,这个十进制数对应右端输出端的下标,这个输出端将会输出低电平。
比如输入:A : 0 、B : 1 、C : 1,排序为110,转十进制为6,Y6口(对应LED7)将会输出低电平,其他端口均输出高电平。
根据参考资料中给出的代码,你的问题可能出在以下几个方面:
数码管控制部分的代码。你的代码只看到了主函数的部分代码,并没有看到数码管控制的具体实现。请提供数码管控制部分的代码,以便更全面地分析问题。
代码中可能存在的错误。根据你提供的代码,不一定能够确定具体的错误。需要更多的代码来分析。
要解决这个问题,可以尝试以下几个步骤:
确保数码管的控制部分代码正确无误。数码管的控制通常通过IO口来实现,需要使用正确的IO口进行控制。
确保你的代码能够正确地将学号后的八位数字传递给数码管控制部分。你可以在代码中添加输出语句,或使用调试工具来确认学号后的八位数字被正确传递。
检查可能存在的硬件问题。有时候,问题可能出在硬件连接或开发板上。
如果你能提供更多的代码和具体问题的描述,我可以给出更加详细的解决方案。