要求:假設鍵盤上的8個按鍵,分別代表數字鍵“0” "1" “2” “3” "4" “5” “6” “7”則要求在連續按下不同數字按鍵時,從左往右以此顯示按下的數字鍵鍵值。附件里包含了Proteus仿真,keil源程序以及流程圖。
按下按鍵:
fdee2d69c7f003a59aecab2c672df3fe.png (57.03 KB, 下載次數: 40)
下載附件
2021-12-15 12:44 上傳
51hei.gif (100.19 KB, 下載次數: 51)
下載附件
2021-12-15 23:03 上傳
單片機源程序如下:
- #include <reg52.h>
- #include "key.h"
- unsigned char code smgd[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8};//段選
- unsigned char code smgw[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位選
- unsigned char smgdbuff[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//段選暫存
- unsigned char jh[]={0xff,0xff,0xff};//交換
- unsigned char b=0;
- unsigned char a=0;
- unsigned char t=0;
- unsigned char f=0;//記錄0的位置
- void dir();
- void Delay100us() //@12.000MHz
- {
- unsigned char i, j;
- i = 2;
- j = 39;
- do
- {
- while (--j);
- } while (--i);
- }
- void display(unsigned char key)
- {
- t=k;
- switch(key)//根據返回的鍵值給段選數組賦值
- {
- case 1:smgdbuff[k-1]=smgd[0];break;
- case 2:smgdbuff[k-1]=smgd[1];break;
- case 3:smgdbuff[k-1]=smgd[2];break;
- case 4:smgdbuff[k-1]=smgd[3];break;
- case 5:smgdbuff[k-1]=smgd[4];break;
- case 6:smgdbuff[k-1]=smgd[5];break;
- case 7:smgdbuff[k-1]=smgd[6];break;
- case 8:smgdbuff[k-1]=smgd[7];break;
- default:break;
- }
- if(k==1)
- {
- jh[0]=smgdbuff[0];//存放第一個按鍵按下的數字
- }
- jh[2]=smgdbuff[k-1];//把最高位的數字暫存
- if(z==1)
- {
- for(a=0;a<k;a++)
- {
- if(smgdbuff[a]==jh[0])//存放第一個按下的數字的位置
- f=a;
- }
- for(a=0;a<k;a++)//交換程序,把次高位及之后的位依次前移,這里t是最高位的位置,f是次高位的位置
- {
- t--;
- smgdbuff[t]=smgdbuff[f];
- f--;
- }
- smgdbuff[0]=jh[2];//把最高位的數字送到最低位
- z=0;
- }
- if(k==8)
- {
- while(1)
- {
- dir();
- }
- }
- dir();
- }
- /*顯示*/
- void dir()
- {
- for(b=0;b<k;b++)
- {
- P1=smgdbuff[b];
- P3=smgw[b];
- Delay100us();
- P3=0x00;
- P1=0xff; //消影
- Delay100us();
- Delay100us();
- }
- }
復制代碼
51hei.png (14.34 KB, 下載次數: 36)
下載附件
2021-12-15 23:06 上傳
所有資料51hei附件下載:
Proteus8.8與代碼.7z
(2.99 MB, 下載次數: 22)
2021-12-15 23:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|