找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1300|回复: 7
收起左侧

单片机电子时钟程序 显示函数部分看不懂

[复制链接]
ID:1082198 发表于 2023-6-5 17:52 | 显示全部楼层 |阅读模式
  1.     #include <reg51.h>
  2.     #define uchar unsigned char
  3.     #define uint unsigned int
  4.     uchar code Dsy_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  5.     sbit Key_Start = P2^2;
  6.     sbit Key_Power=P2^3;
  7.     sbit dp = P0^7;                                                                                                       //小数点
  8.     uchar num=0;  //定时器的计数
  9.     uchar count=0;//数码管的计数
  10.     uchar Key_Num=0;//按键次数的计数
  11.     uchar Power_Num=0;
  12.     bit Key_State=1,Power_State=1;
  13.     void DelayMS(uint x){
  14.             uchar i;
  15.             while(x--)
  16.                     for(i=0;i<120;i++);
  17.     }
  18.     void Dsy(){  //显示函数
  19.             P2=0xfd;
  20.             P0=Dsy_Code[num%10];
  21.             DelayMS(2);
  22.             P2=0xfe;
  23.             P0=Dsy_Code[num/10];
  24.             dp=1;
  25.             DelayMS(2);
  26.     }
  27.     void Timer()interrupt 1{  //定时器
  28.             TH0=(65536-50000)/256;  //50ms
  29.             TL0=(65536-50000)%256;
  30.             count++;
  31.             if(count==2){
  32.                     count=0;
  33.                     num++;
  34.                     if(num==100)
  35.                             num=0;
  36.             }
  37.     }
  38.     void Key_Handle(){//按键处理
  39.             if(Key_State==0){
  40.                     Key_Num=(Key_Num+1)%3;
  41.                     switch(Key_Num){
  42.                             case 1:IE=0x82;TR0=1;break;
  43.                             case 2:IE=0x00;TR0=0;break;
  44.                             case 0:IE=0x00;TR0=0;num=0;break;
  45.                     }
  46.             }
  47.     }
  48.     void main(){
  49.             TMOD=0x01;
  50.             TH0=(65536-50000)/256;  //10ms
  51.             TL0=(65536-50000)%256;
  52.             if(Power_State!=Key_Power){
  53.                     DelayMS(10);
  54.                     if(Power_State!=Key_Power){
  55.                             Power_Num++;
  56.                             if(Power_Num%2==1){
  57.                                     while(1){
  58.                                             if(Key_State!=Key_Start){
  59.                                             DelayMS(10);
  60.                                             Key_State=Key_Start;
  61.                                             Key_Handle();
  62.                                             }
  63.                                     Dsy();
  64.                                     }
  65.                             }
  66.                     }
  67.             }
  68.     }
复制代码

原帖:http://www.51hei.com/bbs/dpj-100200-1.html
回复

使用道具 举报

ID:59202 发表于 2023-6-5 18:39 | 显示全部楼层
void Dsy(){  //显示函数
            P2=0xfd;
            P0=Dsy_Code[num%10];
            DelayMS(2);
            P2=0xfe;
            P0=Dsy_Code[num/10];
            dp=1;
            DelayMS(2);
    }
是这部分吗
回复

使用道具 举报

ID:213173 发表于 2023-6-5 20:13 | 显示全部楼层
楼主在论坛找个靠谱的程序学习。这个程序写得太差,不值得研究。
回复

使用道具 举报

ID:1082198 发表于 2023-6-5 21:56 | 显示全部楼层
xxxevery 发表于 2023-6-5 18:39
void Dsy(){  //显示函数
            P2=0xfd;
            P0=Dsy_Code[num%10];

是的,这段看不懂
回复

使用道具 举报

ID:123289 发表于 2023-6-6 15:41 | 显示全部楼层
【P2=0xfd】要看硬件图,估计:是选择哪个LED导通,且是0通1止。
【P0=Dsy_Code[num%10]】也要看硬件图,估计:是选择LED上的段,决定哪些段亮。
回复

使用道具 举报

ID:584814 发表于 2023-6-6 18:29 | 显示全部楼层
void Dsy(){  //显示函数
            P2=0xfd; //选择个位显示,某教程中的位拉
            P0=Dsy_Code[num%10]; //输出个位数字,某教程中的段拉
            DelayMS(2);  //延时
            P2=0xfe;  //选择十位显示,某教程中的位拉
            P0=Dsy_Code[num/10];  //输出十位数字,某教程中的段拉
            dp=1;   //这个是毛不好猜,要看电路
            DelayMS(2);  //延时
    }
回复

使用道具 举报

ID:712097 发表于 2023-6-6 18:47 | 显示全部楼层
这是一个数码管显示程序,P0口对应8段数码管段码,P2口对应数码管位码。
回复

使用道具 举报

ID:59202 发表于 2023-6-6 22:46 | 显示全部楼层
   113558q07bh7mlzalhmmxy.png
dp = 1 是显示小数点。
段程序最难理解的应该是 P0=Dsy_Code[num%10]和P0=Dsy_Code[num/10]。
Dsy_Code[]是一个存储数字显示码的数组,Dsy_Code[0]对应存储的就是数字0的显示码,以此类推
num是要显示的数字,举个例子:num=25,那么25%10=5,就是个位上要显示的数字,那么显示码就是Dsy_Code[5],
25/10=2,就是十位上要显示的数字,那么显示码就是Dsy_Code[2]
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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