首页 > 其他分享 >51矩阵键盘数码管动态显示

51矩阵键盘数码管动态显示

时间:2023-06-08 23:36:53浏览次数:49  
标签:case 动态显示 return val tube 51 unsigned break 数码管


一、实验目的
1、了解矩阵键盘扫描方法。
2、了解数码管动态显示方法。

二、实验内容
1、完成读取矩阵键盘并静态显示。
2、完成完成读取矩阵键盘并动态显示。

三、实验原理

51矩阵键盘数码管动态显示_#include

四、实验电路与程序

1、软件实验一:完成读取矩阵键盘并静态显示。

1)实验要求:单片机完成读取矩阵键盘并通过八段数码管静态显示按下的键盘编号。

2)实验目的:了解单片机读取矩阵键盘的方法;了解八段数码管静态显示的方法。

3)实验说明:通过本实验,可以了解单片机读取矩阵键盘的方法;了解八段数码管静态显示的方法。

4)、程序框图

51矩阵键盘数码管动态显示_#include_02

5)、代码main.c
1. #include <reg52.h>
2. #include <tube.h>
3. #include <keyboard.h>
4. void main()
5. {

6. unsigned char tube_num;
7. while(1)
8. {

9. tube_num=keyboard_scan();
10. if(tube_num!=0xff)
11. {

12. tube_all(tube_num);
13. }
14. }
15. }
tube.h
1. #ifndef _TUBE_H
2. #define _TUBE_H
3. #include <reg52.h>
4. sbit WE = P2^7; //位定义数码管位选锁存器接口
5. sbit DU = P2^6; //位定义数码管段选锁存器接口
6. void delay1(unsigned int z);
7. void tube_all(unsigned char tube_num);
8. extern int timer_flag;
 keyboard.h9. #ifndef _KEYBOARD_H
10. #define _KEYBOARD_H
11. #include <reg52.h>
12. void delay_kb(unsigned int z);
13. unsigned char keyboard_scan(void);
14. #endif
keyboard.c
1. #include <keyboard.h>
2. void delay_kb(unsigned int z)
3. {

4. unsigned int x,y;
5. for(x = z; x > 0; x–)
6. for(y = 114; y > 0 ; y–);
7. }
8. 
9. unsigned char keyboard_scan(void)
10. {

11. unsigned char kb_val;
12. unsigned char return_val;
13. P3=0x0f;
14. 
15. if((P3 & 0x0f)!=0x0f)//若有按键按下
16. {

17. delay_kb(5);//延时消抖
18. if((P3 & 0x0f)!=0x0f)
19. {

20. kb_val=P3 & 0x0f;//存行
21. P3= kb_val | 0xf0;//准备读取列
22. kb_val+=P3 & 0xf0;//读列
23. while( (P3 & 0xf0) != 0xf0 );//松手检测
24. switch(kb_val)
25. {
case 0xee: return_val = 0;  break;
case 0xde: return_val = 1;  break;
case 0xbe: return_val = 2;  break;
case 0x7e: return_val = 3;  break;

//第二行键值码
case 0xed: return_val = 4;  break;
case 0xdd: return_val = 5;  break;
case 0xbd: return_val = 6;  break;
case 0x7d: return_val = 7;  break;

//第三行键值码
case 0xeb: return_val = 8;  break;
case 0xdb: return_val = 9;  break;
case 0xbb: return_val = 10;  break;
case 0x7b: return_val = 11;  break;

//第四行键值码
case 0xe7: return_val = 12;  break;
case 0xd7: return_val = 13;  break;
case 0xb7: return_val = 14;  break;
case 0x77: return_val = 15;  break;
  1. }
  2. return return_val;
  3. }
  4. }
  5. else
  6. {
  7. return 0xff;
  8. }

  9. }

1、软件实验二:完成读取矩阵键盘并动态显示。
1)实验要求:单片机完成读取矩阵键盘并通过八段数码管动态显示按下的键盘编号,一共显示最近按下的八次键盘的编号。
2)实验目的:了解单片机读取矩阵键盘的方法;了解八段数码管动态显示的方法。
3)实验说明:通过本实验,可以了解单片机读取矩阵键盘的方法;了解八段数码管动态显示的方法。

4)、程序框图

51矩阵键盘数码管动态显示_数码管_03

5)、代码
main.c

  1. #include <reg52.h>
  2. #include <tube.h>
  3. #include <keyboard.h>
  4. void main()
  5. {
  6. unsigned char key_num[8]={0};
  7. unsigned char tube_num;
  8. unsigned char i=0;
  9. while(1)
  10. {
  11. tube_num=keyboard_scan();
  12. if(tube_num!=0xff)
  13. {
  14. if(i>=8)
  15. {
i=0;
  1. }
  2. key_num[i]=tube_num;
  3. i++;
  4. }
  5. tube_light(key_num);
  6. }
  7. }

tube.h

  1. #ifndef _TUBE_H
  2. #define _TUBE_H
  3. #include <reg52.h>
  4. sbit WE = P2^7; //位定义数码管位选锁存器接口
  5. sbit DU = P2^6; //位定义数码管段选锁存器接口
  6. void delay1(unsigned int z);
  7. void tube_light(unsigned char tube_num);
  8. extern int timer_flag;
  9. #endif

tube.c

  1. #include <tube.h>
  2. //共阴极数码管码表
  3. unsigned char code leddata[]={

0x3F,  //"0"
0x06,  //"1"
0x5B,  //"2"
0x4F,  //"3"
0x66,  //"4"
0x6D,  //"5"
0x7D,  //"6"
0x07,  //"7"
0x7F,  //"8"
0x6F,  //"9"
0x77,  //"A"
0x7C,  //"B"
0x39,  //"C"
0x5E,  //"D"
0x79,  //"E"
0x71,  //"F"

};

  1. unsigned char code weidata[]={
  2. 0xFE,
  3. 0xFD,
  4. 0xFB,
  5. 0xF7,
  6. 0xEF,
  7. 0xDF,
  8. 0xBF,
  9. 0x7F



  10. };

  11. void delay1(unsigned int z)
  12. {
  13. unsigned int x,y;
  14. for(x = z; x > 0; x–)
  15. for(y = 114; y > 0 ; y–);
  16. }


  17. void tube_light(unsigned char *number)
  18. {
  19. int i=0;
  20. for(i=0;i<8;i++)
  21. {
  22. P0=0;
  23. DU=1;
  24. //delay1(1);
  25. DU=0;
  26. //delay1(1);
  27. //位选
  28. P0=weidata[i];
  29. WE=1;
  30. //delay1(1);
  31. WE=0;
  32. //delay1(1);

  33. //段选

  34. P0=leddata[number[i]];
  35. DU=1;
  36. //delay1(1);
  37. DU=0;
  38. //delay1(5);


  39. }
  40. //防止最后一个过亮
  41. P0=0;
  42. DU=1;
  43. //delay1(1);
  44. DU=0;
  45. //delay1(1);
  46. //位选
  47. P0=weidata[7];
  48. WE=1;
  49. //delay1(1);
  50. WE=0;
  51. //delay1(1);
  52. //段选

  53. P0=0x00;
  54. DU=1;
  55. //delay1(1);
  56. DU=0;
  57. //delay1(5);
  58. }

keyboard.h

  1. #ifndef _KEYBOARD_H
  2. #define _KEYBOARD_H
  3. #include <reg52.h>
  4. void delay_kb(unsigned int z);
  5. unsigned char keyboard_scan(void);
  6. #endif

keyboard.c

  1. #include <keyboard.h>
  2. void delay_kb(unsigned int z)
  3. {
  4. unsigned int x,y;
  5. for(x = z; x > 0; x–)
  6. for(y = 114; y > 0 ; y–);
  7. }

  8. unsigned char keyboard_scan(void)
  9. {
  10. unsigned char kb_val;
  11. unsigned char return_val;
  12. P3=0x0f;

  13. if((P3 & 0x0f)!=0x0f)//若有按键按下
  14. {
  15. delay_kb(5);//延时消抖
  16. if((P3 & 0x0f)!=0x0f)
  17. {
  18. kb_val=P3 & 0x0f;//存行
  19. P3= kb_val | 0xf0;//准备读取列
  20. kb_val+=P3 & 0xf0;//读列
  21. while( (P3 & 0xf0) != 0xf0 );//松手检测
  22. switch(kb_val)
  23. {
case 0xee: return_val = 0;  break;
case 0xde: return_val = 1;  break;
case 0xbe: return_val = 2;  break;
case 0x7e: return_val = 3;  break;

//第二行键值码
case 0xed: return_val = 4;  break;
case 0xdd: return_val = 5;  break;
case 0xbd: return_val = 6;  break;
case 0x7d: return_val = 7;  break;

//第三行键值码
case 0xeb: return_val = 8;  break;
case 0xdb: return_val = 9;  break;
case 0xbb: return_val = 10;  break;
case 0x7b: return_val = 11;  break;

//第四行键值码
case 0xe7: return_val = 12;  break;
case 0xd7: return_val = 13;  break;
case 0xb7: return_val = 14;  break;
case 0x77: return_val = 15;  break;
    1. }
    2. return return_val;
    3. }
    4. }
    5. else
    6. {
    
    7. return 0xff;
    8. }
    9. 
    10. }
    五、实

    验总结

    1. 动态数码管在位选之前,应该将段选清零,否则会有鬼影。
      2.点亮第八个数码管之后应该熄灭它,否则在读取键盘时它还是亮的,会导致它的亮度和前七个数码管不一样。


    标签:case,动态显示,return,val,tube,51,unsigned,break,数码管
    From: https://blog.51cto.com/u_16131692/6444185

    相关文章

    • 51串口proteus仿真实验
      一、实验目的1、了解单片机串口接收与发送方法。2、了解串口助手使用方法。3、了解数码管动态显示方法。4、了解单片机串口中断服务函数用法。二、实验内容1、完成单片机串口往电脑发送数据实验。2、完成电脑串口助手往单片机发送学号,并通过单片机串口完成学号回传,并利用数......
    • 51静态数码管实验
      一、实验目的1、了解数码管共阴极和共阳极接法。2、了解数码管的段选和位选方式。3、了解定时器初始化设置的方法。二、实验内容1、完成数码管显示数字每秒加一,八个数码管全亮;完成数码管八段全亮,八个数码管全亮。1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是......
    • 51按键外部中断控制流水灯
      实验二外部按键输入一、实验目的1、了解单片机检测口方法2、了解单片机外部中断原理3、了解按键输入原理二、实验内容1、完成按键扫描控制流水灯2、完成按键外部中断控制流水灯三、实验原理四、实验电路与程序1、软件实验一:按键扫描控制流水灯1)实验要求:读取四个按键的输......
    • 51定时器中断控制流水灯
      一、实验目的1、了解读取和清零定时器标志位的方法。2、了解定时器中断的方法。3、了解定时器初始化设置的方法。二、实验内容1、完成读取定时器溢出标志位来控制流水灯2、完成定时器中断服务函数控制流水灯三、实验原理只用一个定时器:定时器级联:四、实验电路与程序1、软......
    • Codeforces 1514 C
      1514C题意给出一个数n,求[1,2,3...n-1]的某个最长子序列,这个子序列的元素乘积模n余1。思路这是个思维题,一个数学公式\[x\equiv1(modn)\rightarrowkx\equivk(mod kn)\]所以子序列中的元素与\(n\)互质,累乘结果模\(n\)后如果不是1,那么将序列中等于结果的元素去......
    • Codeforces 1515 B
      1515B题意有n只袜子(n为偶数),但左袜子有L只,右袜子有R只,每只袜子的颜色为\(C_i\),可以进行以下操作:换袜子的方向、或者将袜子变色,问进行多少次操作后变成(n/2)对袜子思路很曲折,想了很久后终于想清楚,排除配对的袜子后,对于某类袜子\(i\),剩下\(c\geq2\)(假设剩下的是右边)只,它的配对......
    • ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析
      编辑-Z本文将对TDK5100F射频模块进行详细的介绍与分析,包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述,希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点TDK5100F射频模块是一款高性能的无线通信模块,具有以下几个显著的......
    • ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析
      编辑-Z本文将对TDK5100F射频模块进行详细的介绍与分析,包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述,希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点TDK5100F射频模块是一款高性能的无线通信模块,具有以下几个显......
    • [LeetCode] 1351. Count Negative Numbers in a Sorted Matrix
      Givena mxn matrix grid whichissortedinnon-increasingorderbothrow-wiseandcolumn-wise,return thenumberof negative numbersin grid.Example1:Input:grid=[[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]Output:8Explanation:Thereare......
    • P1751 贪吃虫 题解
      题意:题目传送门在一棵n个结点的树上,有k个贪吃虫去吃食物。每个贪吃虫都走到达食物的唯一路径。当一条贪吃虫通向食物的道路上有另一条贪吃虫,则较远的那只停止移动。多条贪吃虫要进入同一节点时,编号最小的才能进入,其他的停止移动。贪吃虫的移动速度皆为1。一只贪吃虫吃......