- /***********************************************************
- 實驗名稱:LED數碼管顯示與按鈕輸入
- 說 明:1.3.2(INT0)作為按鈕輸入口構成一個"0#~#7"的8個按鈕和8個LED的顯示按鈕電路,
- 系統復位時,顯示"HELLO--88",當按下任意鍵時,在最右邊LED上顯示該鍵號,原顯示內容自動左移;
- ***********************************************************/
- #include<reg51.h> //51單片機頭文件//
- #include <intrins.h>
- #define uchar unsigned char //無符號8位變量 //
- #define uint unsigned int //無符號16位變量 //
- sbit P2_6= P2^6; //段鎖存//
- sbit P2_7= P2^7; //位鎖存//
- sbit P3_2= P3^2; //外部中斷0
- uchar Disp_Tab[14] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x79,0x76,0x38,0x40}; //段碼控制 0 1 2 3 4 5 6 7 8 9 E H L -//
- // 0-9,E(0x79),H(0x76),L(0x38),-(0x40)
- uchar weixuan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位選控制,查表的方法控制//
- //數碼管位選通表
- uchar buffer[8]={11,10,12,12,0,13,8,8};//HELLO-88
- uchar newkey,keyON=0;
- void shiftkey();
- void display();
- void keyscan();
- void delay(unsigned int i);
- /***********************************************************
- 函數名稱:主函數
- ***********************************************************/
- void main()
- {
- while(1)
- {
- display(); //調用顯示函數//
- keyscan(); //按鍵檢測函數//
- shiftkey(); //按鍵移位函數//
- }
- }
- /**********************************************************
- 函數名稱:數碼管顯示函數
- **********************************************************/
- void display()
- {
- char i,num=0;
- for(i=0;i<8;i++)
- {
- P0=0xff; //位鎖存清除//
- P2_7=1;
- P2_7=0;
- num=buffer[i];
- P0=Disp_Tab[num]; //段選值//
- P2_6=1;
- P2_6=0; //段鎖存//
- P0=weixuan[i]; //位選值//
- P2_7=1;
- P2_7=0; //位鎖存//
-
- delay(1);
- }
- }
- /**********************************************************
- 函數名稱:按鍵檢測函數
- **********************************************************/
- void keyscan()
- {
- unsigned char i;
- P0=0x00; //清空段選//
- P2_6=1;
- delay(1);
- P2_6=0; //段鎖存//
-
- P0=0x00; //位選全為低電平零
- P2_7=1;
- delay(1);
- P2_7=0; //位鎖存//
-
- if(P3_2==0) //如果有鍵按下
- {
- for(i=0;i<8;i++) //8個鍵值依次掃描
- {
- delay(1);
- P0=weixuan[i]; //位選控制,依次給出低電平
- P2_7=1;
- delay(1);
- P2_7=0;
-
- if(P3_2==0) //是否有對應鍵按下
- {
- delay(10); //去抖//
- if(P3_2==0) //再次判斷是否有鍵按下
- {
- delay(3);
- newkey=i+1; //記錄相應鍵值//
- keyON=1; //設有鍵按下標志
-
- while(P3_2==0);//去抖,此處按鍵未彈起則數碼管不顯示//
- }
- }
- }
- }
- }
- /**********************************************************
- 函數名稱:按鍵移位函數
- **********************************************************/
- void shiftkey()
- {
- if(keyON==1) //進入按鍵//
- {
- buffer[0]=buffer[1]; //值的移位//
- buffer[1]=buffer[2];
- buffer[2]=buffer[3];
- buffer[3]=buffer[4];
- buffer[4]=buffer[5];
- buffer[5]=buffer[6];
- buffer[6]=buffer[7];
- buffer[7]=newkey;
- keyON=0;
- }
- }
- /***********************************************************
- 函數名稱:延時函數
- ***********************************************************/
- void Delay(uint t)
- {
- uint i,j;
- for(i=t;i>0;i--)
- for(j=1100;j>0;j--)
- ;
- }
復制代碼 |