• 独立键盘接口设计(Keil+Proteus)


    前言

    软件的操作参考这篇博客。

    LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501实验:用4个独立按键控制8个LED指示灯。

    按下k1键,P3口8个LED正向(由上至下)流水点亮;

    按下k2键,P3口8个LED反向(由下而上)流水点亮;

    按下k3键,高、低4个LED交替点亮;

    按下k4键,P3口8个LED闪烁点亮。

    Keil

    这个程序就很好理解了,通过检查P1口的引脚来判断是否有按键被按下(每次只允许一个键被按下),然后调用相对应的函数即可。

    由于采用的是共阳极,所以端口为0的时候表示LED亮,所以LED流水灯、交替这种就是通过控制端口是1还是0来实现的。

    1. #include
    2. sbit S1=P1^0;//将S1位定义为P1.0引脚
    3. sbit S2=P1^1;//将S2位定义为P1.1引脚
    4. sbit S3=P1^2;//将S3位定义为P1.2引脚
    5. sbit S4=P1^3;//将S4位定义为P1.3引脚
    6. unsigned char keyval;//定义键值储存变量单元
    7. void key_scan(void);//扫描键盘
    8. void forward(void);//正向流水点亮
    9. void backward(void);//反向流水点亮
    10. void alter(void);//高、低位交替点亮
    11. void blink(void);//闪烁点亮
    12. void led_delay(void);//LED显示延时
    13. void delay10ms(void);//软件消除抖动,延时
    14. void main(void){
    15. keyval=0;//键值初始化为0
    16. while(1){
    17. key_scan();//键盘扫描
    18. switch(keyval){
    19. case 1:forward();break;//键值为1,调用正向流水点亮函数
    20. case 2:backward();break;//键值为2,调用反向流水点亮函数
    21. case 3:alter();break;//键值为3,调用高、低位交替点亮函数
    22. case 4:blink();break;//键值为4,调用闪烁点亮函数
    23. }
    24. }
    25. }
    26. //键盘扫描
    27. void key_scan(void){
    28. P1=0xFF;
    29. if((P1&0x0F)!=0x0F){
    30. delay10ms();
    31. if(S1==0)keyval=1;//按键K1被按下
    32. if(S2==0)keyval=2;//按键K1被按下
    33. if(S3==0)keyval=3;//按键K1被按下
    34. if(S4==0)keyval=4;//按键K1被按下
    35. }
    36. }
    37. //正向流水点亮LED
    38. void forward(void){
    39. P3=0xFE;//LED0亮1111 1110
    40. led_delay();
    41. P3=0xFD;//LED1亮1111 1101
    42. led_delay();
    43. P3=0xFB;//LED2亮1111 1011
    44. led_delay();
    45. P3=0xF7;//LED3亮1111 0111
    46. led_delay();
    47. P3=0xEF;//LED4亮1110 1111
    48. led_delay();
    49. P3=0xDF;//LED5亮1101 1111
    50. led_delay();
    51. P3=0xBF;//LED6亮1011 1111
    52. led_delay();
    53. P3=0x7F;//LED7亮0111 1111
    54. led_delay();
    55. }
    56. //反向流水点亮LED
    57. void backward(void){
    58. P3=0x7F;//LED7亮0111 1111
    59. led_delay();
    60. P3=0xBF;//LED6亮1011 1111
    61. led_delay();
    62. P3=0xDF;//LED5亮1101 1111
    63. led_delay();
    64. P3=0xEF;//LED4亮1110 1111
    65. led_delay();
    66. P3=0xF7;//LED3亮1111 0111
    67. led_delay();
    68. P3=0xFB;//LED2亮1111 1011
    69. led_delay();
    70. P3=0xFD;//LED1亮1111 1101
    71. led_delay();
    72. P3=0xFE;//LED0亮1111 1110
    73. led_delay();
    74. }
    75. //交替点亮高4位与低4位LED
    76. void alter(void){
    77. P3=0x0F;//高4位亮0000 1111
    78. led_delay();
    79. P3=0xF0;//低4位亮1111 0000
    80. led_delay();
    81. }
    82. //闪烁点亮LED
    83. void blink(void){
    84. P3=0xFF;//全灭1111 1111
    85. led_delay();
    86. P3=0x00;//全亮0000 0000
    87. led_delay();
    88. }
    89. //LED显示延时
    90. void led_delay(void){
    91. unsigned char i,j;
    92. for(i=0;i<220;i++){
    93. for(j=0;j<220;j++);
    94. }
    95. }
    96. //软件消除抖动,延时
    97. void delay10ms(void){
    98. unsigned char i,j;
    99. for(i=0;i<100;i++){
    100. for(j=0;j<100;j++);
    101. }
    102. }

    Proteus

    这里需要用到的器件前面基本上都出现过了。

    元件名称Proteus关键字
    51单片机AT89C51
    复位按钮BUTTON
    电阻RES
    LED灯LED
    LED-BIBY
    LED-BIGY
    LED-BIRG
    LED-BIRY
    LED-BLUE
    LED-GREEN
    LED-RED
    LED-YELLOW

     这种LED灯蓝色表示灯亮,红色表示灯灭,所以不是很明显。

    可以换成这种LED灯(如果这里还是没有亮的话需要调整右边一列电阻的阻值,调至220

    K1被按下

    K2被按下

    K3被按下

    K4被按下

    总结

    继续努力。

  • 相关阅读:
    基于WebRTC构建的程序因虚拟内存不足导致闪退问题的排查以及解决办法的探究
    再战:软件项目导论
    UMLChina建模竞赛第3赛季第11轮:啪啪啪啪运指如飞
    ingenic carrier-server fgets is err问题
    ThreadLocal 原理
    Node学习四 —— 函数执行规划
    var、let、const声明变量和不用var声明变量的区别
    批量生产redis测试数据&SQL语句修改varchar类型的字段为json报错
    【JUC的三个⼯具类】CountDownLatch 、CyclicBarrier 、Semaphore_JUC17
    龙迅LT8912B 单通道MIPIDSI桥接LVDS+HDMI(1.4)同显点屏LVDS,加环出一路HDMI
  • 原文地址:https://blog.csdn.net/weixin_64066303/article/details/134253686