要求:假设键盘上的8个按键,分别代表数字键“0” "1" “2” “3” "4" “5” “6” “7”则要求在连续按下不同数字按键时,从左往右以此显示按下的数字键键值。附件里包含了Proteus仿真,keil源程序以及流程图。
按下按键:
单片机源程序如下:
- #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附件下载:
Proteus8.8与代码.7z
(2.99 MB, 下载次数: 22)
|