• 单片机C语言实例:5、数码管闪烁


    一、数码管闪烁

    程序实例1:

    1. #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
    3. sbit LATCH1 = P2^2;//定义锁存使能端口 段锁存
    4. sbit LATCH2 = P2^3;// 位锁存
    5. unsigned char code DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567
    6. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
    7. void Delay(unsigned int t); //函数声明
    8. /*------------------------------------------------
    9. 主函数
    10. ------------------------------------------------*/
    11. main()
    12. {
    13. unsigned char i=0,j;
    14. unsigned char Flag;
    15. while(1)
    16. {
    17. DataPort=WeiMa[i]; //取位码
    18. LATCH2=1; //位锁存
    19. LATCH2=0;
    20. if(Flag) //判断是否是闪烁标志?
    21. DataPort=DuanMa[i]; //取显示数据,
    22. //段码正常显示
    23. else
    24. DataPort=0; //不显示
    25. LATCH1=1; //段锁存
    26. LATCH1=0;
    27. Delay(200); //扫描间隙延时,时间太长会闪
    28. //烁,太短会造成重影
    29. i++;
    30. if(8==i) //检测8位扫描完全结束?如扫描
    31. //完成则从第一个开始再次扫描8位
    32. i=0;
    33. j++;
    34. if(200==j) //延时闪烁时间
    35. {
    36. j=0;
    37. Flag=!Flag;
    38. }
    39. }
    40. }
    41. /*------------------------------------------------
    42. 延时函数,含有输入参数 unsigned int t,无返回值
    43. unsigned int 是定义无符号整形变量,其值的范围是
    44. 0~65535
    45. ------------------------------------------------*/
    46. void Delay(unsigned int t)
    47. {
    48. while(--t);
    49. }

    二、数码管局部闪烁

    程序实例2:

    1. #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
    3. sbit LATCH1 = P2^2;//定义锁存使能端口 段锁存
    4. sbit LATCH2 = P2^3;// 位锁存
    5. unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
    6. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
    7. unsigned char TempData[8]; //存储显示值的全局变量
    8. void Delay(unsigned int t); //函数声明
    9. void Display(unsigned char FirstBit,unsigned char Num);
    10. /*------------------------------------------------
    11. 主函数
    12. ------------------------------------------------*/
    13. main()
    14. {
    15. unsigned int numA=999,numB=0;
    16. unsigned int j;
    17. bit FlashFlag;
    18. while(1)
    19. {
    20. j++;
    21. if(j==20) //检测当前数值显示了一小段时间后,
    22. //需要显示的数值,实现数据显示的变化
    23. {
    24. j=0;
    25. FlashFlag=!FlashFlag;
    26. numB++;
    27. if(numA>0)//用于显示0~999
    28. numA--;
    29. else
    30. numA=999;
    31. if(numB==1000)
    32. numB=0;
    33. }
    34. //递减的三位数码管,带消隐
    35. //分解显示信息,如要显示68,则68/10=6 68%10=8
    36. TempData[0]=DuanMa[numA/100];
    37. TempData[1]=DuanMa[(numA%100)/10];
    38. TempData[2]=DuanMa[(numA%100)%10];
    39. //中间2位数码管不显示,赋值0
    40. if(FlashFlag)
    41. {
    42. TempData[3]=0x40; //显示"-"
    43. TempData[4]=0x40;
    44. }
    45. else
    46. {
    47. TempData[3]=0;
    48. TempData[4]=0;
    49. }
    50. //递增的三位数码管,带消隐
    51. //分解显示信息,如要显示68,则68/10=6 68%10=8
    52. TempData[5]=dofly_DuanMa[numB/100];
    53. TempData[6]=dofly_DuanMa[(numB%100)/10];
    54. TempData[7]=dofly_DuanMa[(numB%100)%10];
    55. Display(0,8);//从第一位显示,共显示8位
    56. }
    57. }
    58. /*------------------------------------------------
    59. 延时函数,含有输入参数 unsigned int t,无返回值
    60. unsigned int 是定义无符号整形变量,其值的范围是
    61. 0~65535
    62. ------------------------------------------------*/
    63. void Delay(unsigned int t)
    64. {
    65. while(--t);
    66. }
    67. /*------------------------------------------------
    68. 显示函数,用于动态扫描数码管
    69. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
    70. 如输入0表示从第一个显示。
    71. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
    72. ------------------------------------------------*/
    73. void Display(unsigned char FirstBit,unsigned char Num)
    74. {
    75. unsigned char i;
    76. for(i=0;i
    77. {
    78. DataPort=0; //清空数据,防止有交替重影
    79. LATCH1=1; //段锁存
    80. LATCH1=0;
    81. DataPort=WeiMa[i+FirstBit]; //取位码
    82. LATCH2=1; //位锁存
    83. LATCH2=0;
    84. DataPort=TempData[i]; //取显示数据,段码
    85. LATCH1=1; //段锁存
    86. LATCH1=0;
    87. Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
    88. }
    89. }

  • 相关阅读:
    android 代码设置静态Ip地址的方法
    vue中的模板语法
    Openssl, Alert, Fatal, handshake failure 40
    Flume学习笔记
    【java】BigDecimal 正确声明方式
    51单片机演奏兰亭序
    前端项目开发流程
    十一、MySql的事务(上)
    【遍历二叉树的非递归算法,二叉树的层次遍历】
    mysql连接不上可能的原因:防火墙放行mysql的3306端口 全库复制:data目录替换即可 mysql查看版本
  • 原文地址:https://blog.csdn.net/m0_49968063/article/details/132789527