欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機四位一體數碼管顯示定時器控制短按加或減數值及長按連加或連減數值的...
[打印本頁]
作者:
51黑電子會員
時間:
2020-5-20 14:55
標題:
基于51單片機四位一體數碼管顯示定時器控制短按加或減數值及長按連加或連減數值的...
本帖最后由 51黑電子會員 于 2020-5-26 22:08 編輯
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit add=P3^0;
sbit dec=P3^4;
uchar lingweiflag;//顯示0標志位變量
uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數碼管位碼表
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
uint num;
uint count;
uint qian,bai,shi,ge;//定義拆字變量
///**ms級延時子程序**/
// void delay(uint x)
//{
// uint i,j;
// for(i=0;i<x;i++)
// for(j=0;j<110;j++);
// }
///**定時器ms級延時子程序**/
// void time0_delay(uchar time)//注意這里不是普通延時,而是定時器延時函數。
//{
// TR0=1;
// count = 0;//需要定時器延時count,先清零,再循環檢測是否計到count,是則退出。
// while(1)
// {
// if(count>=time)
// {
// break;
// }
// }
// }
// void display()
//{
// qian=num/1000;//取得千位
// bai=num%1000/100;//取得百位
// shi=num%100/10;//取得十位數字
// ge=num%10;//取得個位數字
//
// P2=0xfe;//數碼管千位顯示位
// P1=table[qian];//數碼管千位數值顯示
// delay(2);//延時
//
// P2=0xfd;//數碼管百位顯示位
// P1=table[bai];//數碼管百位數值顯示
// delay(2);//延時
//
// P2=0xfb;//數碼管十位顯示位
// P1=table[shi];//數碼管十位數值顯示
// delay(2);//延時
//
// P2=0xf7;//數碼管個位顯示位
// P1=table[ge];//數碼管個位數值顯示
// delay(2);//延時
// }
void display()//顯示程序
{
static uchar i;
P1=0x00;
P2=0xff;
switch(i)
{
case 0:
P2=weima[i];
P1=table[num/1000];
i++;
break;
case 1:
P2=weima[i];
P1=table[num%1000/100];
i++;
break;
case 2:
P2=weima[i];
P1=table[num%100/10];
i++;
break;
case 3:
P2=weima[i];
P1=table[num%10];
i++;
break;
default : break;//自定義
}
if(i>3)
i=0;
}
void keyscan()
{
while(!add)//增加鍵短按長按。為什么只用while(!add)?while(!add)它又表示什么?解釋:當你的按鍵一直沒有釋放,即add=0,那么while(!add)中的!add就為1,表示為真,可以執行while(!add)語句所在花括號內的程序。當你松開按鍵,即add=1,那么 while(!add)中的!add為0,表示為假,不可執行while(!add)語句所在花括號內的程序。
{
if(count>=100)
{
num++;
count=0;
lingweiflag=0;
}
}
while(!dec)//減少鍵短按長按。為什么只用while(!dec)?while(!dec)它又表示什么?解釋:當你的按鍵一直沒有釋放,即dec=0,那么while(!dec)中的!dec就為1,表示為真,可以執行while(!dec)語句所在花括號內的程序。當你松開按鍵,即dec=1,那么 while(!dec)中的!dec為0,表示為假,不可執行while(!dec)語句所在花括號內的程序。
{
if(lingweiflag==0)
{
if(count>=100)
{
num--;
count=0;
if(num==0)
{
num=0;
lingweiflag=1;
}
}
}
}
// if(add==0)//增加長按
// {
// TR0=1;
// if(count==100)
// {
// num++;
// count=0;
// lingweiflag=0;
// }
// }
// if(add==0)//增加短按
// {
// TR0=1;
// time0_delay(20);//注意這里不是普通延時,而是定時器延時。
// display();
// if(add==0)
// {
// time0_delay(20);//注意這里不是普通延時,而是定時器延時。
// while(!add)
// display();
// led=0;
// while(!add);
// led=1;
// num++;
// count=0;
// lingweiflag=0;
// }
// }
// else if(dec==0&&lingweiflag==0)//減少長按
// {
// TR0=1;
// if(count==100)
// {
// num--;
// count=0;
// }
// }
// if(dec==0&&lingweiflag==0)//減少短按
// {
// TR0=1;
// time0_delay(20);//注意這里不是普通延時,而是定時器延時。
// display();
// if(dec==0)
// {
// time0_delay(20);//注意這里不是普通延時,而是定時器延時。
// while(!dec)
// display();
// num--;
// count=0;
// }
// }
if(num>9999)
{
num=0;
}
if(num==0)
{
num=0;
lingweiflag=1;
}
}
void Time0_init()
{
TMOD=0x01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0() interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
count++;
display();
}
void main()
{
Time0_init();
while(1)
{
keyscan();
}
}
//按鍵短按加或減,長按連加或連減,四位一體數碼管顯示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;//轉速/10000的余數/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();//啟動函數
// }
// }
復制代碼
圖片101.png
(79.34 KB, 下載次數: 38)
下載附件
2020-5-26 22:08 上傳
作者:
守候楓林紅葉時
時間:
2020-5-23 08:10
好好學習,感謝分享!
作者:
51黑電子會員
時間:
2020-5-23 12:22
本帖最后由 51黑電子會員 于 2020-5-26 22:10 編輯
守候楓林紅葉時 發表于 2020-5-23 08:10
好好學習,感謝分享!
謝謝 小伙伴
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1