微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第34节:在数码管中实现iphone4S开机密码锁的程序

第34节:在数码管中实现iphone4S开机密码锁的程序

时间:11-22 来源:互联网 点击:
开场白:
这一节要教会大家四个知识点:
第一个:类似手机上10秒钟内无按键操作将自动进入锁屏的程序。
第二个:如何用一个数组来接收按键的一串数字输入。
第三个:矩阵键盘中,数字按键的输入,由于这部分按键的代码相似度非常高,因此把它封装在一个函数里可以非常简洁方便。
第四个:继续加深熟悉鸿哥首次提出的“一二级菜单显示理论”:凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用ucWd变量表示。局部就是二级菜单,用ucPart来表示。不同的窗口,会有不同的更新显示变量ucWdXUpdate来对应,表示整屏全部更新显示。不同的局部,也会有不同的更新显示变量ucWdXPartYUpdate来对应,表示局部更新显示。

具体内容,请看源代码讲解。

(1)硬件平台:基于朱兆祺51单片机学习板。数字1键对应S1键,数字2键对应S2键,数字3键对应S3键…. 数字9键对应S9键, 数字0键对应S10键。其他的按键不用。

(2)实现功能:
本程序有3个窗口。
开机显示第1个密码登录框窗口“----”,在这个窗口下输入密码,如果密码等于”9922”表示密码正确,将会切换到第2个显示按键值的窗口。在窗口2下,按不同的按键会显示不同的按键值,如果10秒内没有按键操作,将会自动切换到第1个密码登录窗口,类似手机上的自动锁屏操作。在密码登录窗口1下,如果密码不正确,会自动清除密码的数字,继续在窗口1下显示”----”。
窗口3是用来停留0.5秒显示全部密码的信息,然后根据密码的正确与否自动切换到对应的窗口。

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. #define const_no_key_push 4400 //大概10秒内无按键按下的时间
  3. #define const_0_1s220 //大概0.5秒的时间
  4. #define const_voice_short40 //蜂鸣器短叫的持续时间
  5. #define const_key_time20 //按键去抖动延时的时间
  6. void initial_myself();
  7. void initial_peripheral();
  8. void delay_short(unsigned int uiDelayShort);
  9. void delay_long(unsigned int uiDelaylong);
  10. //驱动数码管的74HC595
  11. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
  12. void display_drive(); //显示数码管字模的驱动函数
  13. void display_service(); //显示的窗口菜单服务程序
  14. //驱动LED的74HC595
  15. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
  16. void T0_time();//定时中断函数
  17. void number_key_input(unsigned char ucWhichKey);//由于数字按键的代码相似度高,因此封装在这个函数里
  18. void key_service(); //按键服务的应用程序
  19. void key_scan();//按键扫描函数 放在定时中断里
  20. sbit key_sr1=P0^0; //第一行输入
  21. sbit key_sr2=P0^1; //第二行输入
  22. sbit key_sr3=P0^2; //第三行输入
  23. sbit key_sr4=P0^3; //第四行输入
  24. sbit key_dr1=P0^4; //第一列输出
  25. sbit key_dr2=P0^5; //第二列输出
  26. sbit key_dr3=P0^6; //第三列输出
  27. sbit key_dr4=P0^7; //第四列输出
  28. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  29. sbit led_dr=P3^5;//作为中途暂停指示灯 亮的时候表示中途暂停
  30. sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序
  31. sbit dig_hc595_st_dr=P2^1;
  32. sbit dig_hc595_ds_dr=P2^2;
  33. sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
  34. sbit hc595_st_dr=P2^4;
  35. sbit hc595_ds_dr=P2^5;
  36. unsigned char ucKeyStep=1;//按键扫描步骤变量
  37. unsigned intuiKeyTimeCnt=0; //按键去抖动延时计数器
  38. unsigned char ucKeyLock=0; //按键触发后自锁的变量标志
  39. unsigned char ucRowRecord=1; //记录当前扫描到第几列了
  40. unsigned char ucKeySec=0; //被触发的按键编号
  41. unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
  42. unsigned char ucDigShow8;//第8位数码管要显示的内容
  43. unsigned char ucDigShow7;//第7位数码管要显示的内容
  44. unsigned char ucDigShow6;//第6位数码管要显示的内容
  45. unsigned char ucDigShow5;//第5位数码管要显示的内容
  46. unsigned char ucDigShow4;//第4位数码管要显示的内容
  47. unsigned char ucDigShow3;//第3位数码管要显示的内容
  48. unsigned char ucDigShow2;//第2位数码管要显示的内容
  49. unsigned char ucDigShow1;//第1位数码管要显示的内容
  50. unsigned char ucDigDot8;//数码管8的小数点是否显示的标志
  51. unsigned char ucDigDot7;//数码管7的小数点是否显示的标志
  52. unsigned char ucDigDo

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top