找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5036|回复: 4
收起左侧

单片机不同P口数码管显示仿真+源码

[复制链接]
ID:163705 发表于 2018-1-22 16:25 | 显示全部楼层 |阅读模式
此程序可使用不同P口的任意单片机引脚驱动数码管显示。包含程序和仿真,仿真已验证OK。

分享给各位学习参考。
图片1.jpg

单片机源程序如下:
  1. #include "reg51.h"

  2. #define uchar unsigned char                   //重命名关键字
  3. #define uint unsigned int                   //重命名关键字

  4. sbit K1=P3^0;                //开始/暂停
  5. sbit K2=P3^1;                //复位

  6. sbit GPIO_A=P1^0;        //数据端a
  7. sbit GPIO_B=P0^1;        //数据端b
  8. sbit GPIO_C=P1^1;        //数据端c
  9. sbit GPIO_D=P1^2;        //数据端d
  10. sbit GPIO_E=P0^2;        //数据端e
  11. sbit GPIO_F=P1^3;        //数据端f
  12. sbit GPIO_G=P0^3;        //数据端g
  13. sbit GPIO_H=P1^4;        //数据端dp
  14. sbit L1=P2^0;                //数码管1位选
  15. sbit L2=P2^1;                //数码管2位选
  16. sbit L3=P2^2;                //数码管3位选

  17. unsigned char code DIG_CODE[10] = {0,1,2,3,4,5,6,7,8,9};
  18. //0、1、2、3、4、5、6、7、8、9的显示码

  19. unsigned char DisplayData[3];
  20. //用来存放要显示的3位数的值

  21. uchar i,Key_Flag_Idx;           //定义变量
  22. uint Second_Counts;                   //定义变量
  23. bit Key_State;                           //定义变量

  24. void DelayMS(uint ms)           //延时子函数
  25. {
  26.         uchar t;                           //定义变量
  27.         while(ms--)
  28.         for(t=0;t<120;t++);
  29. }

  30. void DuanXuan(unsigned char dat)           //发送段码0~9
  31. {
  32.         if(dat==0)
  33.         {GPIO_H=0;GPIO_G=0;GPIO_F=1;GPIO_E=1;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'0'
  34.         if(dat==1)
  35.         {GPIO_H=0;GPIO_G=0;GPIO_F=0;GPIO_E=0;GPIO_D=0;GPIO_C=1;GPIO_B=1;GPIO_A=0;}        //'1'
  36.         if(dat==2)
  37.         {GPIO_H=0;GPIO_G=1;GPIO_F=0;GPIO_E=1;GPIO_D=1;GPIO_C=0;GPIO_B=1;GPIO_A=1;}        //'2'
  38.         if(dat==3)
  39.         {GPIO_H=0;GPIO_G=1;GPIO_F=0;GPIO_E=0;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'3'
  40.         if(dat==4)
  41.         {GPIO_H=0;GPIO_G=1;GPIO_F=1;GPIO_E=0;GPIO_D=0;GPIO_C=1;GPIO_B=1;GPIO_A=0;}        //'4'
  42.         if(dat==5)
  43.         {GPIO_H=0;GPIO_G=1;GPIO_F=1;GPIO_E=0;GPIO_D=1;GPIO_C=1;GPIO_B=0;GPIO_A=1;}        //'5'
  44.         if(dat==6)
  45.         {GPIO_H=0;GPIO_G=1;GPIO_F=1;GPIO_E=1;GPIO_D=1;GPIO_C=1;GPIO_B=0;GPIO_A=1;}        //'6'
  46.         if(dat==7)
  47.         {GPIO_H=0;GPIO_G=0;GPIO_F=0;GPIO_E=0;GPIO_D=0;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'7'
  48.         if(dat==8)
  49.         {GPIO_H=0;GPIO_G=1;GPIO_F=1;GPIO_E=1;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'8'
  50.         if(dat==9)
  51.         {GPIO_H=0;GPIO_G=1;GPIO_F=1;GPIO_E=0;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'9'
  52.         if(dat==10)
  53.         {GPIO_H=0;GPIO_G=0;GPIO_F=0;GPIO_E=0;GPIO_D=0;GPIO_C=0;GPIO_B=0;GPIO_A=0;}        //全灭
  54. }

  55. void DuanXuan2(unsigned char dat)           //发送段码0.~9.
  56. {
  57.         if(dat==0)
  58.         {GPIO_H=1;GPIO_G=0;GPIO_F=1;GPIO_E=1;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'0.'
  59.         if(dat==1)
  60.         {GPIO_H=1;GPIO_G=0;GPIO_F=0;GPIO_E=0;GPIO_D=0;GPIO_C=1;GPIO_B=1;GPIO_A=0;}        //'1.'
  61.         if(dat==2)
  62.         {GPIO_H=1;GPIO_G=1;GPIO_F=0;GPIO_E=1;GPIO_D=1;GPIO_C=0;GPIO_B=1;GPIO_A=1;}        //'2.'
  63.         if(dat==3)
  64.         {GPIO_H=1;GPIO_G=1;GPIO_F=0;GPIO_E=0;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'3.'
  65.         if(dat==4)
  66.         {GPIO_H=1;GPIO_G=1;GPIO_F=1;GPIO_E=0;GPIO_D=0;GPIO_C=1;GPIO_B=1;GPIO_A=0;}        //'4.'
  67.         if(dat==5)
  68.         {GPIO_H=1;GPIO_G=1;GPIO_F=1;GPIO_E=0;GPIO_D=1;GPIO_C=1;GPIO_B=0;GPIO_A=1;}        //'5.'
  69.         if(dat==6)
  70.         {GPIO_H=1;GPIO_G=1;GPIO_F=1;GPIO_E=1;GPIO_D=1;GPIO_C=1;GPIO_B=0;GPIO_A=1;}        //'6.'
  71.         if(dat==7)
  72.         {GPIO_H=1;GPIO_G=0;GPIO_F=0;GPIO_E=0;GPIO_D=0;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'7.'
  73.         if(dat==8)
  74.         {GPIO_H=1;GPIO_G=1;GPIO_F=1;GPIO_E=1;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'8.'
  75.         if(dat==9)
  76.         {GPIO_H=1;GPIO_G=1;GPIO_F=1;GPIO_E=0;GPIO_D=1;GPIO_C=1;GPIO_B=1;GPIO_A=1;}        //'9.'
  77. }

  78. void DigDisplay()                   //数码管显示子函数
  79. {
  80.         unsigned int j;                   //定义变量

  81.         L1=0;                          //位选
  82.         DuanXuan(DisplayData[0]);//发送段码
  83.         j = 100;                                                   //扫描间隔时间设定
  84.         while(j--);       
  85.         L1=1;                           //消隐

  86.         L2=0;                          //位选
  87.         DuanXuan2(DisplayData[1]);//发送段码
  88.         j = 100;                                                   //扫描间隔时间设定
  89.         while(j--);       
  90.         L2=1;

  91.         L3=0;                           //位选
  92.         DuanXuan(DisplayData[2]); //发送段码
  93.         j = 100;                                                   //扫描间隔时间设定
  94.         while(j--);       
  95.         L3=1;          
  96. }

  97. void Key_Event_Handle()                 //处理按键事件
  98. {
  99.         if(Key_State==0)
  100.         {
  101.                 Key_Flag_Idx=(Key_Flag_Idx+1)%2;           //让变量Key_Flag_Idx保持在小于2的值
  102.                 switch(Key_Flag_Idx)
  103.                 {
  104.                         case 1:                               
  105.                         ET0=1;
  106.                         TR0=1;                //开启定时器
  107.                         break;
  108.                         case 0:       
  109.                         ET0=0;
  110.                         TR0=0;                //关闭定时器
  111.                         break;
  112.                 }
  113.         }
  114. }

  115. void main()
  116. {
  117.         DuanXuan(10);
  118.    
  119.         TMOD=0x01;                                //定时器0方式1
  120.         TH0=(65536-50000)/256;                //定时器0:50ms
  121.         TL0=(65536-50000)%256;
  122.         EA=1;              
  123.     while (1)
  124.     {
  125.                 if(Key_State!=K1)                  //开始按键按下时
  126.                 {
  127.                         DelayMS(10);                  //按键去抖
  128.                         Key_State=K1;
  129.                         Key_Event_Handle();          //执行按键处理函数
  130.                 }
  131.                 if(K2==0)                                                 //复位按键按下时
  132.                 {
  133.                         ET0=0;
  134.                         TR0=0;                //关闭定时器
  135.                         i=0;                                                          //清零计数
  136.                         Second_Counts=0;                                  //清零秒
  137.                         Key_Flag_Idx=0;
  138.                 }
  139.                 DisplayData[0] = DIG_CODE[Second_Counts/100%10];          //显示百位
  140.                 DisplayData[1] = DIG_CODE[Second_Counts/10%10];          //显示十位
  141.                 DisplayData[2] = DIG_CODE[Second_Counts%10];          //显示个位
  142.                 DigDisplay();                 //执行数码管显示函数
  143.     }
  144. }


  145. //T0中断函数
  146. ……………………

  147. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
不同P口数码管显示.zip (87.99 KB, 下载次数: 38)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:87734 发表于 2018-1-23 21:34 | 显示全部楼层
不错哦,谢谢
回复

使用道具 举报

ID:346484 发表于 2019-6-12 21:41 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:475957 发表于 2019-10-16 16:31 | 显示全部楼层
学习中,非常感谢
回复

使用道具 举报

ID:605586 发表于 2020-3-9 17:10 | 显示全部楼层
特别感谢,纠结这个不同口的段接法很久了!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表