当前位置:   article > 正文

用单片机的矩阵键盘选择显示什么图像

用单片机的矩阵键盘选择显示什么图像

注意行数据不能二进制

  1. #include "reg51.h"
  2. typedef unsigned int u16; //对系统默认数据类型进行重定义
  3. typedef unsigned char u8;
  4. //定义74HC595控制管脚
  5. sbit SRCLK=P3^6; //移位寄存器时钟输入
  6. sbit RCLK=P3^5; //存储寄存器时钟输入
  7. sbit SER=P3^4; //串行数据输入
  8. #define LEDDZ_COL_PORT P0 //点阵列控制端口
  9. #define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口
  10. u8 gled_row[8] = {0x00, 0x01, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00}; //行数据,不能二进制
  11. u8 gled_row1[8] = {0x00, 0x27, 0x65, 0x41, 0x49, 0x71, 0x71, 0x00};
  12. u8 gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED点阵显示图像的列数据
  13. void delay_10us(u16 ten_us)
  14. {
  15. while(ten_us--);
  16. }
  17. //监测矩阵键盘按下那个键
  18. u8 key_matrix_ranks_scan(void)
  19. {
  20. u8 key_value=0;
  21. KEY_MATRIX_PORT=0xf7;//给第一列赋值0,其余全为1
  22. if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下
  23. {
  24. delay_10us(1000);//消抖
  25. switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值
  26. {
  27. case 0x77: key_value=1;break;
  28. case 0xb7: key_value=5;break;
  29. case 0xd7: key_value=9;break;
  30. case 0xe7: key_value=13;break;
  31. }
  32. }
  33. while(KEY_MATRIX_PORT!=0xf7);//等待按键松开
  34. KEY_MATRIX_PORT=0xfb;//给第二列赋值0,其余全为1
  35. if(KEY_MATRIX_PORT!=0xfb)//判断第二列按键是否按下
  36. {
  37. delay_10us(1000);//消抖
  38. switch(KEY_MATRIX_PORT)//保存第二列按键按下后的键值
  39. {
  40. case 0x7b: key_value=2;break;
  41. case 0xbb: key_value=6;break;
  42. case 0xdb: key_value=10;break;
  43. case 0xeb: key_value=14;break;
  44. }
  45. }
  46. while(KEY_MATRIX_PORT!=0xfb);//等待按键松开
  47. KEY_MATRIX_PORT=0xfd;//给第三列赋值0,其余全为1
  48. if(KEY_MATRIX_PORT!=0xfd)//判断第三列按键是否按下
  49. {
  50. delay_10us(1000);//消抖
  51. switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值
  52. {
  53. case 0x7d: key_value=3;break;
  54. case 0xbd: key_value=7;break;
  55. case 0xdd: key_value=11;break;
  56. case 0xed: key_value=15;break;
  57. }
  58. }
  59. while(KEY_MATRIX_PORT!=0xfd);//等待按键松开
  60. KEY_MATRIX_PORT=0xfe;//给第四列赋值0,其余全为1
  61. if(KEY_MATRIX_PORT!=0xfe)//判断第四列按键是否按下
  62. {
  63. delay_10us(1000);//消抖
  64. switch(KEY_MATRIX_PORT)//保存第四列按键按下后的键值
  65. {
  66. case 0x7e: key_value=4;break;
  67. case 0xbe: key_value=8;break;
  68. case 0xde: key_value=12;break;
  69. case 0xee: key_value=16;break;
  70. }
  71. }
  72. while(KEY_MATRIX_PORT!=0xfe);//等待按键松开
  73. return key_value;
  74. }
  75. void hc595_write_data(u8 dat)
  76. {
  77. u8 i=0;
  78. for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
  79. {
  80. SER=dat>>7;//优先传输一个字节中的高位
  81. dat<<=1;//将低位移动到高位
  82. SRCLK=0;
  83. delay_10us(1);
  84. SRCLK=1;
  85. delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
  86. }
  87. RCLK=0;
  88. delay_10us(1);
  89. RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
  90. }
  91. //在8*8的LED点阵显示图片
  92. void display_scan(u16 t, u8 gled_col[], u8 gled_row1[]) {
  93. u8 i;
  94. while (t--) {
  95. for (i = 0; i < 8; i++) { // 循环8次扫描8行、列
  96. LEDDZ_COL_PORT = gled_col[i]; // 传送列选数据
  97. hc595_write_data(gled_row1[i]); // 传送行选数据
  98. delay_10us(100); // 延时一段时间,等待显示稳定
  99. hc595_write_data(0x00); // 消影
  100. }
  101. }
  102. }
  103. void main()
  104. {
  105. u8 key=0;
  106. u16 n=100;//每张图片显示的时间
  107. while(1)
  108. {
  109. key=key_matrix_ranks_scan();//key的值就是矩阵键盘的编号
  110. if(key==1){
  111. display_scan(n,gled_col,gled_row);
  112. }
  113. else if(key==2){
  114. display_scan(n,gled_col,gled_row1);
  115. }
  116. }
  117. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/493114
推荐阅读
相关标签
  

闽ICP备14008679号