标题: 怎么显示9-F,只知道0-7,在哪里修改啊大神 [打印本页]

作者: hzlsw1    时间: 2017-6-24 22:41
标题: 怎么显示9-F,只知道0-7,在哪里修改啊大神
/**************************************************************************************
*                动态数码管显示实验              *
实现现象:下载程序后数码管从右至左显示0-7。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                     
***************************************************************************************/
#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/*******************************************************************************
* 函 数 名         : delay
* 函数功能     : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能     : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
  switch(i)  //位选,选择点亮的数码管,
  {
   case(0):
    LSA=0;LSB=0;LSC=0; break;//显示第0位
   case(1):
    LSA=1;LSB=0;LSC=0; break;//显示第1位
   case(2):
    LSA=0;LSB=1;LSC=0; break;//显示第2位
   case(3):
    LSA=1;LSB=1;LSC=0; break;//显示第3位
   case(4):
    LSA=0;LSB=0;LSC=1; break;//显示第4位
   case(5):
    LSA=1;LSB=0;LSC=1; break;//显示第5位
   case(6):
    LSA=0;LSB=1;LSC=1; break;//显示第6位
   case(7):
    LSA=1;LSB=1;LSC=1; break;//显示第7位
  }
  P0=smgduan[i];//发送段码
  delay(100); //间隔一段时间扫描
  P0=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能   : 主函数
* 输    入       : 无
* 输    出      : 无
*******************************************************************************/
void main()
{
while(1)
{
  DigDisplay();  //数码管显示函数
}  
}


作者: 桂木桂马    时间: 2017-6-25 01:52
因为你的for语句中的i最大是7,而数组显示8到f需要i为8到15,所以你无法显示,把i<8改成i<16就好了,希望对你有帮助
作者: yzwzfyz    时间: 2017-6-25 02:07
"只知道0-7"???
你一定不知道显示“0-7”的原理,否则怎么会不知道“9-F”呢?
作者: 498517068    时间: 2017-6-25 03:03
smgduan(i+9)
作者: 51mcu    时间: 2017-6-25 06:59
把这句:for(i=0;i<8;i++)
{

改成:for(i=0;i<16;i++)
{
作者: w1179benp    时间: 2017-6-25 07:02
试试下面的,增加一位是吗?

  1. /**************************************************************************************
  2. *                动态数码管显示实验              *
  3. 实现现象:下载程序后数码管从右至左显示0-F。
  4. 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                     
  5. ***************************************************************************************/
  6. #include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
  7. typedef unsigned int u16;   //对数据类型进行声明定义
  8. typedef unsigned char u8;
  9. sbit LSA=P2^2;
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;

  12. sbit LSD=P2^5;

  13. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  14.       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
  15. /*******************************************************************************
  16. * 函 数 名         : delay
  17. * 函数功能     : 延时函数,i=1时,大约延时10us
  18. *******************************************************************************/
  19. void delay(u16 i)
  20. {
  21. while(i--);
  22. }
  23. /*******************************************************************************
  24. * 函 数 名         : DigDisplay
  25. * 函数功能     : 数码管动态扫描函数,循环扫描16个数码管显示
  26. *******************************************************************************/
  27. void DigDisplay()
  28. {
  29. u8 i;
  30. for(i=0;i<16;i++)
  31. {
  32.    switch(i)  //位选,选择点亮的数码管,
  33.   {
  34.     case(0):
  35.      LSA=0;LSB=0;LSC=0;LSD=0; break;//显示第0位
  36.    case(1):
  37.      LSA=1;LSB=0;LSC=0;LSD=0; break;//显示第1位
  38.    case(2):
  39.      LSA=0;LSB=1;LSC=0;LSD=0; break;//显示第2位
  40.    case(3):
  41.      LSA=1;LSB=1;LSC=0;LSD=0; break;//显示第3位
  42.    case(4):
  43.      LSA=0;LSB=0;LSC=1;LSD=0; break;//显示第4位
  44.    case(5):
  45.      LSA=1;LSB=0;LSC=1;LSD=0; break;//显示第5位
  46.    case(6):
  47.      LSA=0;LSB=1;LSC=1;LSD=0; break;//显示第6位
  48.    case(7):
  49.      LSA=1;LSB=1;LSC=1;LSD=0; break;//显示第7位

  50. case(8):
  51.      LSA=0;LSB=0;LSC=0;LSD=1; break;//显示第8位
  52.    case(9):
  53.      LSA=1;LSB=0;LSC=0;LSD=1; break;//显示第9位
  54.    case(10):
  55.      LSA=0;LSB=1;LSC=0;LSD=1; break;//显示第A位
  56.    case(11):
  57.      LSA=1;LSB=1;LSC=0;LSD=1; break;//显示第B位
  58.    case(12):
  59.      LSA=0;LSB=0;LSC=1;LSD=1; break;//显示第C位
  60.    case(13):
  61.      LSA=1;LSB=0;LSC=1;LSD=1; break;//显示第D位
  62.    case(14):
  63.      LSA=0;LSB=1;LSC=1;LSD=1; break;//显示第E位
  64.    case(15):
  65.      LSA=1;LSB=1;LSC=1;LSD=1; break;//显示第F位

  66.   }
  67.    P0=smgduan[i];//发送段码
  68.   delay(100); //间隔一段时间扫描
  69.   P0=0x00;//消隐
  70. }
  71. }
  72. /*******************************************************************************
  73. * 函 数 名       : main
  74. * 函数功能   : 主函数
  75. * 输    入       : 无
  76. * 输    出      : 无
  77. *******************************************************************************/
  78. void main()
  79. {
  80. while(1)
  81. {
  82.    DigDisplay();  //数码管显示函数
  83. }  
  84. }
复制代码


作者: hzlsw1    时间: 2017-6-25 08:11
桂木桂马 发表于 2017-6-25 01:52
因为你的for语句中的i最大是7,而数组显示8到f需要i为8到15,所以你无法显示,把i

这个试了一下没用显示12345678
作者: hzlsw1    时间: 2017-6-25 08:14
498517068 发表于 2017-6-25 03:03
smgduan(i+9)

大神你是对的,后面加数字加几就在0的基础上向后加几+9 就从9-F 加1就从1-8 ,51黑太厉害了小白都能便明白
作者: 小潘哥    时间: 2017-6-25 09:24
段码表里有0-F的段码了,在动态扫描函数的switch里面添加9-F先
作者: zw666888    时间: 2017-6-25 21:52
问问大神们,看看有懂得吗?
作者: chen076928    时间: 2017-6-26 16:50
码表里有0-F的段码了,在动态扫描函数的switch里面添加9-F先




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1