51單片機(jī)100例實(shí)例之14例
//項(xiàng)目名稱:按鍵控制數(shù)碼管移位顯示
//項(xiàng)目再創(chuàng)作者:科技小宅神
//完成時(shí)間:2021/01/21

#include <reg52.h>//c51頭文件
#define uchar unsigned char
#define uint unsigned int
//段碼,共陽極數(shù)碼管0-9的數(shù)字
uchar code ?duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//位碼
uchar code ?wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//待顯示到個(gè)數(shù)碼管緩沖(開始僅在0位顯示0,其他黑屏,10為黑屏)
uchar Display_Buffer[]={0,10,10,10,10,10,10,10};
//1毫秒延時(shí)子程序
void DelayMS(uint x)
{
? uchar t;
?while(x--)
?{
? ?for(t=0;t<120;t++);
?}
}
//刷新顯示程序
void Show()
{
? uchar i;//定義一個(gè)局部變量i
?for(i=0;i<8;i++)
?{? ?
? P0=0xff;//消除對P0口的影響
? P0 = duan[Display_Buffer[i]];//發(fā)送段碼
? ?P2 = wei[i];//發(fā)送位碼
? DelayMS(2);//延時(shí)
?}
}
//主程序
void main()
{
? uchar i;
?uchar Key1,Keycount=0;//定義局部變量i,key1,keycount(按鍵計(jì)數(shù)值)
?P0 = 0xff;//初始值?
?P1 = 0xff;//初始值?
?P2 = 0x00;//初始值?
?while(1)
?{
? ?Show();
? P1=0xff;//初始值
? Key1=P1;//將P1的狀態(tài)保存到Key1中
? switch(Key1)//通過P1的狀態(tài)來決定做什么操作
? {
? ? case 0xfe: Keycount++; //可以加到按鍵計(jì)數(shù)值為8,按下k1時(shí)加1計(jì)數(shù)并增加顯示位?
? ? ? //當(dāng)P1=0xfe時(shí),即P1.0=0,即k1按下
? ? ? if(Keycount>8) ?Keycount=8;?
? ? ?//如果按鍵計(jì)數(shù)值大于8,那么按鍵計(jì)數(shù)值為8,第七位數(shù)碼管亮
? ? ? Display_Buffer[Keycount-1]=Keycount;
? ? ? break;
? ?case 0xfd: //當(dāng)P1=0xfd時(shí),即P1.1=0,即k2按下
? ?? ? if(Keycount>0) ?//如果按鍵計(jì)數(shù)值大于0?
? ? ? Display_Buffer[--Keycount]=10; ? ? //按下k2時(shí)減1計(jì)數(shù)并減少顯示位
? ? ? break; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//如按鍵計(jì)數(shù)值為1,時(shí),大括號里自減減1為Display_Buffer[7]=10,數(shù)碼管第七位黑屏
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?case 0xfb: ?//當(dāng)P1=0xfb時(shí),即P1.2=0,即k3按下
? ? ? Display_Buffer[0]=0;//0位顯示0
? ? ? for(i=1;i<8;i++)
? ? Display_Buffer[i]=10;//無論之前計(jì)數(shù)是多少,只有0位顯示0,其他黑屏
? ? ? Keycount=0;//按下k3時(shí)清零
? }
? ?while(P1 != 0xff) ?Show();
? ?//查詢是否有按鍵按下,若沒有繼續(xù)判斷,若有則繼續(xù)顯示出來相應(yīng)的結(jié)果
?}
}