- /***********************************************************
- 实验名称: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--)
- ;
- }
复制代码 |