电路图:http://www.51hei.com/f/51hei-5.pdf
源代码:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define KeyPort P1
- sbit Dula=P2^2; //段选
- sbit Wela=P2^3; //位选
- sbit Led =P2^0;
- uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码
- uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码
- uchar password[8];
- uchar dis_smg[8];
- bit Flag=0;
- uchar KeyScan(void);
- uchar KeyPro(void);
- /**********************************************************************************
- ************************* 延 时 函 数 ******************************************
- ***********************************************************************************/
- void delayus(uchar t)
- {
- while(--t);
- }
- void delayms(uchar t)
- {
- while(t--)
- {
- delayus(245);
- delayus(245);
- }
- }
- /**********************************************************************************
- ************************* 显 示 函 数 ******************************************
- ***********************************************************************************/
- void Display(uchar Firstbit ,uchar Num)
- {
- static uchar i;
- P0=0x00;
- Dula=1;Dula=0;
- P0=smg_we[i+Firstbit];
- Wela=1;Wela=0;
- P0=dis_smg[i];
- Dula=1;Dula=0;
- i++;
- if(i==Num)
- i=0;
- }
- /**********************************************************************************
- *************************** 定时初始化 ******************************************
- ***********************************************************************************/
- void Timer0_Init(void)
- {
- TMOD|=0X01;
- TR0=1;
- ET0=1;
- EA=1;
- }
- /**********************************************************************************
- ************************* 设 置 密 码 ******************************************
- ***********************************************************************************/
- void SetPassword(uchar KeyNum)
- {
- static uchar i=0;
- uchar j,n;
- uchar tempcode[8];
- if((KeyNum>=0)&&(KeyNum<=9))
- {
- Led=1;
- if(i==0)
- {
- for(j=0;j<8;j++)
- tempcode[j]=0;
- }
- if(i<8)
- {
- tempcode[i]=smg_du[KeyNum];
- for(j=0;j<=i;j++)
- dis_smg[7-i+j]=tempcode[j];
- }
- i++;
- if(i==8)
- i=0;
- }
- if(KeyNum==15) //密码修改确认键
- {
- KeyNum=0xff;
- for(n=0;n<8;n++)
- {
- password[n]=tempcode[n];
- dis_smg[n]=0;
- }
- dis_smg[0]=0x3f;
- dis_smg[1]=0x76;
- Flag=0;
- i=0; //静态变量清零,下次进入时可以从新开始
- }
- }
- /**********************************************************************************
- ************************* 输 入 密 码 ******************************************
- ***********************************************************************************/
- void KeyControl(uchar Keynum)
- {
- static uchar i=0;
- uchar j;
- uchar temp[8];
- bit flag;
- if((Keynum>=0)&&(Keynum<=9)) //数字输入按键
- {
- Led=0;
- if(i==0)
- {
-
- for(j=0;j<8;j++)
- dis_smg[j]=0;
- }
- if(i<8)
- {
- temp[i]=smg_du[Keynum];
- for(j=0;j<=i;j++)
- dis_smg[7-i+j]=temp[j];
- }
- i++;
- if(i==8)
- i=0;
- }
- if(Keynum==15) //确认键
- {
- Keynum=0xff;
- flag=1;
- for(j=0;j<8;j++)
- {
- flag=flag&&(temp[j]==password[j]);//比较八位密码数字是否全正确
- dis_smg[j]=0;
- }
- if(flag)
- {
- dis_smg[0]=0x3f; // "o"
- dis_smg[1]=0x73; // "p"
- dis_smg[2]=0x79; // "E"
- dis_smg[3]=0x37; // "n"
- }
- else
- {
- dis_smg[0]=0x79; // "E"
- dis_smg[1]=0x50; // "r"
- dis_smg[2]=0x50; // "r"
- }
- i=0; //清零,准备下次输入密码
- }
- if(Keynum==14) //修改密码键
- {
- Flag=1;
- for(i=0;i<8;i++)
- {
- dis_smg[i]=0x40;
- }
- i=0; //静态变量清零,下次进入时可以从新开始
- }
- }
- /**********************************************************************************
- ************************* 控 制 函 数 ******************************************
- ***********************************************************************************/
- void Dominate(void)
- {
- uchar keynum;
- keynum=KeyPro();
- if(keynum!=0xff)
- {
- if(Flag==0)
- KeyControl(keynum);
- else
- SetPassword(keynum);
- }
- }
- /**********************************************************************************
- ************************* main 函 数 ******************************************
- ***********************************************************************************/
- void main()
- {
- Timer0_Init();
- while(1)
- {
- Dominate();
- }
- }
- /**********************************************************************************
- ************************* 中断服务函数 ******************************************
- ***********************************************************************************/
- void Timer0(void) interrupt 1
- {
- TH0=0XF8;
- TL0=0X30; //2ms
-
- Display(0,8);
- }
- /**********************************************************************************
- ************************* 按 键 扫 描(反复式扫描法) **************************
- ***********************************************************************************/
- uchar KeyScan(void)
- {
- uchar cord_h,cord_l;
- KeyPort=0x0f;
- cord_l=KeyPort&0x0f;
- if(cord_l!=0x0f)
- {
- delayms(10);
- if((KeyPort&0x0f)!=0x0f)
- {
- cord_l=KeyPort&0x0f;
- KeyPort=cord_l|0xf0;
- cord_h=KeyPort&0xf0;
- while((KeyPort&0xf0)!=0xf0);
- return (cord_h+cord_l);
- }
- }return (0xff);
- }
- uchar KeyPro(void)
- {
- switch(KeyScan())
- {
- case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
- case 0x7d:return 1;break;//1
- case 0x7b:return 2;break;//2
- case 0x77:return 3;break;//3
- case 0xbe:return 4;break;//4
- case 0xbd:return 5;break;//5
- case 0xbb:return 6;break;//6
- case 0xb7:return 7;break;//7
- case 0xde:return 8;break;//8
- case 0xdd:return 9;break;//9
- case 0xdb:return 10;break;//a
- case 0xd7:return 11;break;//b
- case 0xee:return 12;break;//c
- case 0xed:return 13;break;//d
- case 0xeb:return 14;break;//e
- case 0xe7:return 15;break;//f
- default:return 0xff;break;
- }
- }
复制代码
|