找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1979|回復: 7
收起左側(cè)

單片機電子時鐘程序 顯示函數(shù)部分看不懂

[復制鏈接]
ID:1082198 發(fā)表于 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;                                                                                                       //小數(shù)點
  8.     uchar num=0;  //定時器的計數(shù)
  9.     uchar count=0;//數(shù)碼管的計數(shù)
  10.     uchar Key_Num=0;//按鍵次數(shù)的計數(shù)
  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(){  //顯示函數(shù)
  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.torrancerestoration.com/bbs/dpj-100200-1.html
回復

使用道具 舉報

ID:59202 發(fā)表于 2023-6-5 18:39 | 顯示全部樓層
void Dsy(){  //顯示函數(shù)
            P2=0xfd;
            P0=Dsy_Code[num%10];
            DelayMS(2);
            P2=0xfe;
            P0=Dsy_Code[num/10];
            dp=1;
            DelayMS(2);
    }
是這部分嗎
回復

使用道具 舉報

ID:213173 發(fā)表于 2023-6-5 20:13 | 顯示全部樓層
樓主在論壇找個靠譜的程序?qū)W習。這個程序?qū)懙锰,不值得研究?/td>
回復

使用道具 舉報

ID:1082198 發(fā)表于 2023-6-5 21:56 | 顯示全部樓層
xxxevery 發(fā)表于 2023-6-5 18:39
void Dsy(){  //顯示函數(shù)
            P2=0xfd;
            P0=Dsy_Code[num%10];

是的,這段看不懂
回復

使用道具 舉報

ID:123289 發(fā)表于 2023-6-6 15:41 | 顯示全部樓層
【P2=0xfd】要看硬件圖,估計:是選擇哪個LED導通,且是0通1止。
【P0=Dsy_Code[num%10]】也要看硬件圖,估計:是選擇LED上的段,決定哪些段亮。
回復

使用道具 舉報

ID:584814 發(fā)表于 2023-6-6 18:29 | 顯示全部樓層
void Dsy(){  //顯示函數(shù)
            P2=0xfd; //選擇個位顯示,某教程中的位拉
            P0=Dsy_Code[num%10]; //輸出個位數(shù)字,某教程中的段拉
            DelayMS(2);  //延時
            P2=0xfe;  //選擇十位顯示,某教程中的位拉
            P0=Dsy_Code[num/10];  //輸出十位數(shù)字,某教程中的段拉
            dp=1;   //這個是毛不好猜,要看電路
            DelayMS(2);  //延時
    }
回復

使用道具 舉報

ID:712097 發(fā)表于 2023-6-6 18:47 | 顯示全部樓層
這是一個數(shù)碼管顯示程序,P0口對應8段數(shù)碼管段碼,P2口對應數(shù)碼管位碼。
回復

使用道具 舉報

ID:59202 發(fā)表于 2023-6-6 22:46 | 顯示全部樓層
   113558q07bh7mlzalhmmxy.png
dp = 1 是顯示小數(shù)點。
段程序最難理解的應該是 P0=Dsy_Code[num%10]和P0=Dsy_Code[num/10]。
Dsy_Code[]是一個存儲數(shù)字顯示碼的數(shù)組,Dsy_Code[0]對應存儲的就是數(shù)字0的顯示碼,以此類推
num是要顯示的數(shù)字,舉個例子:num=25,那么25%10=5,就是個位上要顯示的數(shù)字,那么顯示碼就是Dsy_Code[5],
25/10=2,就是十位上要顯示的數(shù)字,那么顯示碼就是Dsy_Code[2]
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表