微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于“数码管左移”的问题,新手求助...

关于“数码管左移”的问题,新手求助...

时间:10-02 整理:3721RD 点击:

  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

  3. sbit LATCH1=P2^6;//定义锁存使能端口 段锁存

  4. sbit LATCH2=P2^7;//                 位锁存

  5. unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9

  6. unsigned char code WeiMa[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//分别对应相应数码管点亮即位码

  7. unsigned char TempData[9]; //存储显示值的全局变量

  8. void Delay(unsigned int t); //函数声明

  9. void Display(unsigned char FirstBit,unsigned char Num);
  10. /*------------------------------------------------                    主函数------------------------------------------------*/
  11. main()
  12. {
  13. unsigned char i,k,j;

  14. unsigned char s;

  15. while(1)     
  16. {
  17.            j++;

  18.            if(j==20)   
  19.             
  20.    {   
  21.   j=0;               

  22. if(0==k)            
  23. {            
  24. for(s=0;s<8;s++) //完全循环完成后清零所有缓冲区   
  25.                      
  26. TempData=0xff;  
  27.                
  28. }      
  29.    
  30. TempData=DuanMa[k]; //把需要显示的字符依次送缓冲区//   
  31.      
  32.   TempData[i-1]=0xff;  //不需要显示的区域清零   
  33.          
  34.    i++;                 
  35. if(i==(8-k))                  
  36. {                  
  37. i=0;     
  38.      
  39.   k++;

  40. if(k==8)      

  41. k=0;                       
  42. }   
  43.                            
  44.    }   
  45.      
  46.   Display(0,8);//从第一位显示,共显示8位

  47.      }
  48. }
  49. *------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535------------------------------------------------*/

  50. void Delay(unsigned int t)
  51. {
  52. while(--t);
  53. }
  54. /*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/

  55. void Display(unsigned char FirstBit,unsigned char Num)

  56. {      unsigned char i;

  57.                  for(i=0;i<Num;i++)
  58.            {

  59.         DataPort=0xff;   //清空数据,防止有交替重影

  60.        LATCH1=1;     //段锁存   

  61.        LATCH1=0;

  62.        DataPort=WeiMa[i+FirstBit]; //取位码

  63.        LATCH2=1;     //位锁存

  64.        LATCH2=0;

  65.        DataPort=TempData; //取显示数据,段码

  66.       LATCH1=1;     //段锁存

  67.        LATCH1=0;

  68.        Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影     
  69.   }
  70. }

复制代码



以上是标准代码         
TempData=DuanMa[k]; //把需要显示的字符依次送缓冲区//         
TempData[i-1]=0xff;  //不需要显示的区域清零
这两行看得不太明白,i的初始值是0这里TempData[i-1]=0xff;怎么能实现不需要显示的区域清零?

怎么是这种效果?

很凌乱 粘贴的格式不兼容 你修改下

不好意思, 种格式的看不了啊, 直接给你发个流水灯吧.

#include<reg51.h>
#include <intrins.h>
void delayms(unsigned char ms)
// 延时子程序
{      
       unsigned char i;
       while(ms--)
      {
            for(i = 0; i < 120; i++);
      }
}
main()
{
       unsigned char LED;
       LED = 0xfe;
       P0 = LED;

       while(1)
       {
             delayms(250);   
             LED = _crol_(LED,1);  //循环右移1位,点亮下一个LED
             P0 = LED;
        }
}

额   眼都花了

是的呵              嗯

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top