仿真圖如下,單片機要求電子時鐘設計12小時制,顯示資訊為:-HHMM空SS.s空,其中-代表上午還是下午,上午不亮,下午亮-,HH代表小時,MM代表分鐘,SS代表整數秒,s代表小數秒,空表示不顯示。我是根據8位工程仿真來改的,要求需要10位,現在程式不知道怎么弄,求大佬指點。

uj5u.com熱心網友回復:
#include<reg52.h>
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit fmq=P3^0; //·??ù?÷????
char table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff, 0xc6, 0xc7, 0x88,}; //12????êy??1ü±à?? ?°0-9?±
// 0 1 2 3 4 5 6 7 8 9 2???ê? C L A
uchar val[8]={0,0,0,0,0,0,11,12}; //êy??1ü??ê??o3???
uint count=0; //
char shi=0,fen=0,miao=0; //ê±·???±?á?
char nzshi=0,nzfen=0,nzmiao=0; //???óê±·???±?á?
uchar wei=0x01,duan=0; // ????êy??1ü?? oí????ê?μ?±?á?
void led() //êy??1üé¨?èoˉêy
{
P0=0Xff;
P2=wei;
if((duan==1)||(duan==3)) //?aà?ê??óD?êyμ?ó?μ?
{
P0=(table[val[duan]]&0x7f);
}
else
{
P0=table[val[duan]];
}
duan++;
if(duan>7)
duan=0;
wei=_crol_(wei,1);
}
void time0init() //?¨ê±?÷03?ê??ˉ
{
TMOD=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
ET0=1;
TR0=1;
EA=1;
}
uchar keytime=0; //°′?ü
uint bjtime=0; //±¨?ˉ??ê±±?á?
bit sjbs=0; //°′?üA ????ê±??×?í£μ?±?á?
void time0() interrupt 1 // ?¨ê±?÷0?D??·t??oˉêy
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
if(sjbs)
{
count++;
}
bjtime++;
keytime++;
led(); //2msé¨?èò?′?êy??1ü??ê?
}
uchar key() //°′?üé¨?è3ìDò
{
static uchar kzt=0;
uchar sb=25;
switch(kzt)
{
case 0:
P1=0xff;
if(P1!=0xff)
{
kzt=1;
return 25;
}
break;
case 1:
P1=0xff;
if(P1!=0xff)
{
switch(P1)
{
case 0xfe:
sb=1;
break;
case 0xfd:
sb=2;
break;
case 0xfb:
sb=3;
break;
case 0xf7:
sb=4;
break;
case 0xef:
sb=5;
break;
case 0xdf:
sb=6;
break;
case 0xbf:
sb=7;
break;
case 0x7f:
sb=8;
break;
}
kzt=2;
return sb;
}
else
{
kzt=0;
return 25;
}
break;
case 2:
P1=0xff;
if(P1==0xff)
{
kzt=0;
return 25;
}
break;
}
return 25;
}
void sj() //ê±·???ê±???üD?
{
if(count>499)
{
count=0;
miao++;
if(miao>59)
{
miao=0;
fen++;
if(fen>59)
{
fen=0;
shi++;
if(shi>23)
{
shi=0;
}
}
}
}
}
void main()
{
uchar keycode=25,zt=1;
bit bjbs=0;
fmq=1;
time0init(); //3?ê??ˉ?¨ê±?÷0
while(1)
{
if(keytime>9) //20ms é¨?èò?′?°′?ü
{
keytime=0;
keycode=key();
}
if(((fen==0)&&(miao==0))||((shi==nzshi)&&(fen==nzfen)&&(miao==nzmiao)))
{ // ?D????μ? ?D??ê?·?μ????óê±??
bjbs=1;
fmq=0;
bjtime=0;
}
if(bjbs) //±¨?ˉ′|àí
{
if(bjtime>30000)
{
fmq=1;
bjbs=0;
}
if((keycode>1)&&(keycode<5)) //??òa?ú?ù?Dê±μ÷?ú?íí£?1?ù?D
{
bjbs=0;
fmq=1;
}
}
switch(zt)
{
case 1: // ê±?ó??ê?
val[0]=shi/10; //??ê?êy?Y?üD?
val[1]=shi%10;
val[2]=fen/10;
val[3]=fen%10;
val[4]=miao/10;
val[5]=miao%10;
val[6]=11;
val[7]=12;
if(keycode==1) //A ê±????DDó??Yí£
{
sjbs=!sjbs;
keycode=25;
}
sj();
if(keycode==2) //B ???ó1
{
miao++;
if(miao>59)
{
miao=0;
}
keycode=25;
}
if(keycode==3)//C·? ?ó1
{
fen++;
if(fen>59)
{
fen=0;
}
keycode=25;
}
if(keycode==4)//D ê±?ó1
{
shi++;
if(shi>23)
{
shi=0;
}
keycode=25;
}
if(keycode==5) //E ??è????óéè??×′ì?
{
zt=2;
keycode=25;
}
break;
case 2: //???ó??ê?ó?μ÷?ú
sj(); //ê±???üD?
val[0]=nzshi/10; //??ê?êy?Y?üD?
val[1]=nzshi%10;
val[2]=nzfen/10;
val[3]=nzfen%10;
val[4]=nzmiao/10;
val[5]=nzmiao%10;
val[6]=13;
val[7]=12;
if(keycode==2) //B ???ó???ó1
{
nzmiao++;
if(nzmiao>59)
{
nzmiao=0;
}
keycode=25;
}
if(keycode==3) //C ???ó·??ó1
{
nzfen++;
if(nzfen>59)
{
nzfen=0;
}
keycode=25;
}
if(keycode==4) //D ???óê±?ó1
{
nzshi++;
if(nzshi>23)
{
nzshi=0;
}
keycode=25;
}
if(keycode==5) //E ??è?ê±?ó??ê?×′ì?
{
zt=1;
keycode=25;
}
break;
}
}
}
uj5u.com熱心網友回復:
怎么去修改,用兩片74hc138轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/39182.html
標籤:單片機/工控
上一篇:ESP32板子連接wifi以后土壤濕度傳感器采集不了資料了
下一篇:按鍵中斷的問題,大佬們請進
