欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機四位一體數碼管顯示短按加或減數值及長按連加或連減數值的項目工程
[打印本頁]
作者:
51黑電子會員
時間:
2020-5-17 13:49
標題:
基于51單片機四位一體數碼管顯示短按加或減數值及長按連加或連減數值的項目工程
本帖最后由 51黑電子會員 于 2020-5-22 08:40 編輯
//按鍵短按加或減,長按連加或連減,四位一體數碼管顯示0~9999。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define key_short 10//宏定義短按20ms
#define key_long 50//宏定義長按100ms
#define key_middle 40//宏定義長按間隔80ms
sbit led=P1^4;//啟停指示燈
sbit addkey=P3^0;//位定義加鍵
sbit deckey=P3^2;//位定義減鍵
sbit qiting=P3^4;//位定義啟動按鍵端口
sbit tingzhi=P3^6;//位定義停止按鍵端口
//uchar i;//數碼管位數變量
uchar flag;//顯示函數標志位變量
uchar qitingnum;//聲明啟停次數變量
uint num;//數值變量
uint addcount,deccount;//計數變量
uint qian,bai,shi,ge;//定義拆字變量
//uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數碼管位碼表
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
/**ms級延時子程序**/
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void display()
{
qian=num/1000;//取得千位數字
bai=num%1000/100;//取得百位數字
shi=num%100/10;//取得十位數字
ge=num%10;//取得個位數字
P2=0xfe;//數碼管千位顯示位
P0=table[qian];//數碼管千位數值顯示
delay(2);//延時
P2=0xfd;//數碼管百位顯示位
P0=table[bai];//數碼管百位數值顯示
delay(2);//延時
P2=0xfb;//數碼管十位顯示位
P0=table[shi];//數碼管十位數值顯示
delay(2);//延時
P2=0xf7;//數碼管個位顯示位
P0=table[ge];//數碼管個位數值顯示
delay(2);//延時
}
void qidongkeyscan()//啟動函數
{
if(qiting==0)
{
delay(15);
if(qiting==0)
{
qitingnum++;
TR0=1;
flag=0;
while(qiting==1);
}
}
}
void tingzhikeyscan()//關掉函數
{
if(tingzhi==0)
{
delay(15);
if(tingzhi==0)
{
led=1;
flag=1;
TR0=0;
P2=0xff;
P0=0x00;
qitingnum=0;
while(tingzhi==1);
}
}
}
void keyscan()//設置函數
{
if(qitingnum==1)
{
led=0;
if(!addkey)
{
addcount++;
// delay(10);
if(addcount>=key_long)//增加長按
{
if(num<9999)
num++;
addcount=key_middle;//為什么存在addcount=key_middle,由于一直按著按鍵,addcount計數會溢出,設定addcount=key_middle能讓addcount在這個addcount=key_middle基礎上反復累積計數,從而不會出現計數溢出的情況。
}
}
else
{
if(key_short<addcount&&addcount<key_long)//增加短按,為什么不可以是key_short<addcount<key_long,假若是key_short<addcount<key_long,就相當于按鍵還沒按下,條件已經滿足,按鍵再按下去就沒意義啦。
{
if(num<9999)
num++;
}
addcount=0;
}
if(!deckey)
{
deccount++;
// delay(10);
if(deccount>=key_long)//減少長按
{
if(num>0)
num--;
deccount=key_middle;//為什么存在deccount=key_middle,由于一直按著按鍵,deccount計數會溢出,設定deccount=key_middle能讓addcount在這個deccount=key_middle基礎上反復累積計數,從而不會出現計數溢出的情況。
}
}
else
{
if(key_short<deccount&&deccount<key_long)//減少短按,為什么if條件不可以是key_short<deccount<key_long,假若是key_short<deccount<key_long,就相當于按鍵還沒按下,條件已經滿足,按鍵再按下去就沒意義啦。
{
if(num>0)
num--;
}
deccount=0;
}
}
}
// void display()//顯示程序
//{
//// static uchar i;
// P0=0x00;
// P2=weima[i];
// switch(i)
// {
// case 0:
// P0=table[num/1000];
// break;
// case 1:
// P0=table[num%1000/100];
// break;
// case 2:
// P0=table[num%100/10];
// break;
// case 3:
// P0=table[num%10];
// break;
// }
// i++;
// i%=4;
// }
/**定時器0初始化子程序**/
void Time0_init()
{
TMOD=0X01;//模式選定時器0、計數器1,工作方式選定時器0定時模式1、計數器1計數模式1。
TH0=(65536-5000)/256;//定時器0高8位定時50毫秒
TL0=(65536-5000)%256;//定時器0低8位定時50毫秒
EA=1;//打開總中斷
ET0=1;//打開定時器0的中斷
TR0=0;//打開定時器0
}
void Timer0() interrupt 1//定時器0中斷子程序
{
TH0=(65536-5000)/256;//重裝定時器0高8位定時50毫秒
TL0=(65536-5000)%256;//重裝定時器0低8位定時50毫秒
keyscan();//設置函數
if(flag==0)
display();//顯示函數
tingzhikeyscan();//關掉函數
}
void main()//主函數
{
Time0_init();//定時器0初始化子程序
while(1)
{
qidongkeyscan();//啟動函數
}
}
復制代碼
圖片110.png
(78.94 KB, 下載次數: 70)
下載附件
2020-5-17 13:49 上傳
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1