|
本帖最后由 51黑電子會(huì)員 于 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標(biāo)志位變量
- uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數(shù)碼管位碼表
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
- uint num;
- uint count;
- uint qian,bai,shi,ge;//定義拆字變量
- ///**ms級(jí)延時(shí)子程序**/
- // void delay(uint x)
- //{
- // uint i,j;
- // for(i=0;i<x;i++)
- // for(j=0;j<110;j++);
- // }
- ///**定時(shí)器ms級(jí)延時(shí)子程序**/
- // void time0_delay(uchar time)//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)函數(shù)。
- //{
- // TR0=1;
- // count = 0;//需要定時(shí)器延時(shí)count,先清零,再循環(huán)檢測(cè)是否計(jì)到count,是則退出。
- // while(1)
- // {
- // if(count>=time)
- // {
- // break;
- // }
- // }
- // }
- // void display()
- //{
- // qian=num/1000;//取得千位
- // bai=num%1000/100;//取得百位
- // shi=num%100/10;//取得十位數(shù)字
- // ge=num%10;//取得個(gè)位數(shù)字
- //
- // P2=0xfe;//數(shù)碼管千位顯示位
- // P1=table[qian];//數(shù)碼管千位數(shù)值顯示
- // delay(2);//延時(shí)
- //
- // P2=0xfd;//數(shù)碼管百位顯示位
- // P1=table[bai];//數(shù)碼管百位數(shù)值顯示
- // delay(2);//延時(shí)
- //
- // P2=0xfb;//數(shù)碼管十位顯示位
- // P1=table[shi];//數(shù)碼管十位數(shù)值顯示
- // delay(2);//延時(shí)
- //
- // P2=0xf7;//數(shù)碼管個(gè)位顯示位
- // P1=table[ge];//數(shù)碼管個(gè)位數(shù)值顯示
- // delay(2);//延時(shí)
- // }
- 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)//增加鍵短按長(zhǎng)按。為什么只用while(!add)?while(!add)它又表示什么?解釋?zhuān)寒?dāng)你的按鍵一直沒(méi)有釋放,即add=0,那么while(!add)中的!add就為1,表示為真,可以執(zhí)行while(!add)語(yǔ)句所在花括號(hào)內(nèi)的程序。當(dāng)你松開(kāi)按鍵,即add=1,那么 while(!add)中的!add為0,表示為假,不可執(zhí)行while(!add)語(yǔ)句所在花括號(hào)內(nèi)的程序。
- {
- if(count>=100)
- {
- num++;
- count=0;
- lingweiflag=0;
- }
- }
- while(!dec)//減少鍵短按長(zhǎng)按。為什么只用while(!dec)?while(!dec)它又表示什么?解釋?zhuān)寒?dāng)你的按鍵一直沒(méi)有釋放,即dec=0,那么while(!dec)中的!dec就為1,表示為真,可以執(zhí)行while(!dec)語(yǔ)句所在花括號(hào)內(nèi)的程序。當(dāng)你松開(kāi)按鍵,即dec=1,那么 while(!dec)中的!dec為0,表示為假,不可執(zhí)行while(!dec)語(yǔ)句所在花括號(hào)內(nèi)的程序。
- {
- if(lingweiflag==0)
- {
- if(count>=100)
- {
- num--;
- count=0;
- if(num==0)
- {
- num=0;
- lingweiflag=1;
- }
- }
- }
- }
- // if(add==0)//增加長(zhǎng)按
- // {
- // TR0=1;
- // if(count==100)
- // {
- // num++;
- // count=0;
- // lingweiflag=0;
- // }
- // }
- // if(add==0)//增加短按
- // {
- // TR0=1;
- // time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
- // display();
- // if(add==0)
- // {
- // time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
- // while(!add)
- // display();
- // led=0;
- // while(!add);
- // led=1;
- // num++;
- // count=0;
- // lingweiflag=0;
- // }
- // }
- // else if(dec==0&&lingweiflag==0)//減少長(zhǎng)按
- // {
- // TR0=1;
- // if(count==100)
- // {
- // num--;
- // count=0;
- // }
- // }
- // if(dec==0&&lingweiflag==0)//減少短按
- // {
- // TR0=1;
- // time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
- // display();
- // if(dec==0)
- // {
- // time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
- // 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();
- }
- }
-
- //按鍵短按加或減,長(zhǎng)按連加或連減,四位一體數(shù)碼管顯示0~9999。
- //#include<reg52.h>
- //#define uchar unsigned char
- //#define uint unsigned int
- //#define key_short 10//宏定義短按20ms
- //#define key_long 50//宏定義長(zhǎng)按100ms
- //#define key_middle 40//宏定義長(zhǎng)按間隔80ms
- //sbit led=P1^4;//啟停指示燈
- //sbit addkey=P3^0;//位定義加鍵
- //sbit deckey=P3^2;//位定義減鍵
- //sbit qiting=P3^4;//位定義啟動(dòng)按鍵端口
- //sbit tingzhi=P3^6;//位定義停止按鍵端口
- ////uchar i;//數(shù)碼管位數(shù)變量
- //uchar flag;//顯示函數(shù)標(biāo)志位變量
- //uchar qitingnum;//聲明啟停次數(shù)變量
- //uint num;//數(shù)值變量
- //uint addcount,deccount;//計(jì)數(shù)變量
- //uint qian,bai,shi,ge;//定義拆字變量
- ////uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數(shù)碼管位碼表
- //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
- ///**ms級(jí)延時(shí)子程序**/
- // void delay(uint x)
- //{
- // uint i,j;
- // for(i=0;i<x;i++)
- // for(j=0;j<110;j++);
- // }
- // void display()
- //{
- // qian=num/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
- // bai=num%1000/100;//取得百位
- // shi=num%100/10;//取得十位數(shù)字
- // ge=num%10;//取得個(gè)位數(shù)字
- //
- // P2=0xfe;//數(shù)碼管千位顯示位
- // P0=table[qian];//數(shù)碼管千位數(shù)值顯示
- // delay(2);//延時(shí)
- //
- // P2=0xfd;//數(shù)碼管百位顯示位
- // P0=table[bai];//數(shù)碼管百位數(shù)值顯示
- // delay(2);//延時(shí)
- //
- // P2=0xfb;//數(shù)碼管十位顯示位
- // P0=table[shi];//數(shù)碼管十位數(shù)值顯示
- // delay(2);//延時(shí)
- //
- // P2=0xf7;//數(shù)碼管個(gè)位顯示位
- // P0=table[ge];//數(shù)碼管個(gè)位數(shù)值顯示
- // delay(2);//延時(shí)
- //}
- // void qidongkeyscan()//啟動(dòng)函數(shù)
- //{
- // if(qiting==0)
- // {
- // delay(15);
- // if(qiting==0)
- // {
- // qitingnum++;
- // TR0=1;
- // flag=0;
- // while(qiting==1);
- // }
- // }
- // }
- // void tingzhikeyscan()//關(guān)掉函數(shù)
- //{
- // 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()//設(shè)置函數(shù)
- //{
- // if(qitingnum==1)
- // {
- // led=0;
- // if(!addkey)
- // {
- // addcount++;
- //// delay(10);
- // if(addcount>=key_long)//增加長(zhǎng)按
- // {
- // if(num<9999)
- // num++;
- // addcount=key_middle;//為什么存在addcount=key_middle,由于一直按著按鍵,addcount計(jì)數(shù)會(huì)溢出,設(shè)定addcount=key_middle能讓addcount在這個(gè)addcount=key_middle基礎(chǔ)上反復(fù)累積計(jì)數(shù),從而不會(huì)出現(xiàn)計(jì)數(shù)溢出的情況。
- // }
- // }
- // else
- // {
- // if(key_short<addcount&&addcount<key_long)//增加短按,為什么不可以是key_short<addcount<key_long,假若是key_short<addcount<key_long,就相當(dāng)于按鍵還沒(méi)按下,條件已經(jīng)滿足,按鍵再按下去就沒(méi)意義啦。
- // {
- // if(num<9999)
- // num++;
- // }
- // addcount=0;
- // }
- // if(!deckey)
- // {
- // deccount++;
- //// delay(10);
- // if(deccount>=key_long)//減少長(zhǎng)按
- // {
- // if(num>0)
- // num--;
- // deccount=key_middle;//為什么存在deccount=key_middle,由于一直按著按鍵,deccount計(jì)數(shù)會(huì)溢出,設(shè)定deccount=key_middle能讓addcount在這個(gè)deccount=key_middle基礎(chǔ)上反復(fù)累積計(jì)數(shù),從而不會(huì)出現(xiàn)計(jì)數(shù)溢出的情況。
- // }
- // }
- // else
- // {
- // if(key_short<deccount&&deccount<key_long)//減少短按,為什么if條件不可以是key_short<deccount<key_long,假若是key_short<deccount<key_long,就相當(dāng)于按鍵還沒(méi)按下,條件已經(jīng)滿足,按鍵再按下去就沒(méi)意義啦。
- // {
- // 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;
- //// }
- // /**定時(shí)器0初始化子程序**/
- // void Time0_init()
- //{
- // TMOD=0X01;//模式選定時(shí)器0、計(jì)數(shù)器1,工作方式選定時(shí)器0定時(shí)模式1、計(jì)數(shù)器1計(jì)數(shù)模式1。
- // TH0=(65536-5000)/256;//定時(shí)器0高8位定時(shí)50毫秒
- // TL0=(65536-5000)%256;//定時(shí)器0低8位定時(shí)50毫秒
- // EA=1;//打開(kāi)總中斷
- // ET0=1;//打開(kāi)定時(shí)器0的中斷
- // TR0=0;//打開(kāi)定時(shí)器0
- // }
- // void Timer0() interrupt 1//定時(shí)器0中斷子程序
- //{
- // TH0=(65536-5000)/256;//重裝定時(shí)器0高8位定時(shí)50毫秒
- // TL0=(65536-5000)%256;//重裝定時(shí)器0低8位定時(shí)50毫秒
- // keyscan();//設(shè)置函數(shù)
- // if(flag==0)
- // display();//顯示函數(shù)
- // tingzhikeyscan();//關(guān)掉函數(shù)
- // }
- // void main()//主函數(shù)
- //{
- // Time0_init();//定時(shí)器0初始化子程序
- // while(1)
- // {
- // qidongkeyscan();//啟動(dòng)函數(shù)
- // }
- // }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|