• 山东大学单片机原理与应用实验 4.7 7279键盘扫描及动态LED显示实验


    目录

    一、实验题目

    二、实验要求

    三、实验过程及结果

    四、实验流程图

    五、实验源程序


    一、实验题目

    7279键盘扫描及动态LED显示实验

    二、实验要求

    1、画出实验的流程图

    2、编写源程序并进行注释

    3、记录实验过程

    4、记录程序运行结果截图

    三、实验过程及结果

    本实验利用7279 进行键盘扫描及动态LED 数码管显示控制。实验原理图1如下:

    图1:实验原理图

    1. 关掉实验箱电源。将 MCU 板,KEY&LED 板插接在母板上。按照前面连接关系表将硬件连接好。

    2. 在仿真器断电情况下将仿真器的仿真头插在 MCU 板的 CPU 插座上。将仿真器与开发 PC 机的通信口连接好,打开实验箱及仿真器的电源。

    3. 运行 Keil uVision2 开发环境,按照建立工程 HD7279_c.uV2,CPU为AT89S51, 包含启动文件 STARTUP.A51。

    4. 按照实验功能要求创建源程序 HD7279.c 并加入到工程 HD7279_c.uV2,并设置工程 HD7279_c.uV2 属性,将其晶振频率设置为 11.0592MHz,选择输出可执行文件,DEBUG 方式选择硬件 DEBUG,并选择其中的“WAVE V series MCS51 Driver”仿真器。

    5. 构造(Build)工程 HD7279_c.uV2。如果编程有误进行修改,直至构造正确为止。

    6. 运行程序,观察结果否符合程序要求,若不符合,分析出错原因,继续重复第 4、5 步的步骤,直至结果正确。

    四、实验流程图

               图2:实验流程图

    五、实验源程序

    1. #include<reg51.h>
    2. #include<stdio.h>
    3. #define uchar unsigned char
    4. #define uint unsigned int
    5. #define reset 0xa4
    6. #define rl 0xa1 //定义宏变量左移指令rl
    7. #define dcode1 0xc8 //定义宏变量译码方式1指令 dcode1
    8. #define read 0x15 //定义宏变量读输入指令read
    9. #define uchar unsigned char//自定义数据类型
    10. #define uint unsigned int
    11. void delay48ms();
    12. void delay8ms();
    13. void write7279(uchar,uchar);
    14. uchar read7279(uchar);
    15. void sendbyte(uchar);
    16. uchar receivebyte();
    17. uchar keyma[]={0x1b,0x13,0x0b,0x03,0x1a,0x12,0x0a,0x02,0x19,0x11,0x09,0x01,0x18,0x10,0x08,0x00}; //定义存放按键的键码数组keyma[]
    18. sbit cs=P1^0; //分别定义控制端口
    19. sbit clk=P1^1;
    20. sbit dio=P1^2;
    21. sbit key=P1^3;
    22. void main()
    23. { uchar button,i,num;
    24. sendbyte(0xa4); //定义复位
    25. while(1)
    26. {
    27. if(key==0)
    28. {
    29. sendbyte(0x15); //读键盘的键值
    30. button =receivebyte(); //将收到的键码传给button
    31. for(i=0;i<16;i++) //确认键值的具体位置
    32. {
    33. if(button==keyma[i]);
    34. {
    35. num=i;
    36. break;
    37. }
    38. }
    39. sendbyte(0xa1); //数码管左移一位
    40. write7279(0xc8,num); //方式1译码并显示
    41. while(key==0); //按键停止后,重新检测
    42. }
    43. }
    44. }
    45. void write7279(uchar cmd,uchar dta)
    46. {
    47. sendbyte(cmd); //下载数据并按方式1译码
    48. sendbyte(dta); //写入显示的数字
    49. }
    50. void sendbyte(uchar outbyte)
    51. {
    52. uchar i;
    53. cs=0;
    54. delay48ms(); //调用延时
    55. for(i=0;i<8;i++) //利用循环,分别移入数据
    56. {
    57. if(outbyte&0x80) //取最高位
    58. dio=1;
    59. else dio=0;
    60. clk=1; // 时钟上升沿读入数据
    61. delay8ms();
    62. clk=0;
    63. delay8ms();
    64. outbyte=outbyte*2; //数据左移一位以送次高位
    65. }
    66. dio=0; //防止从p1口读入数据
    67. }
    68. uchar receivebyte()
    69. {
    70. uchar i;
    71. uchar inbyte=0;
    72. dio=1; //从P1.2读入数据
    73. delay48ms(); //延时
    74. for(i=0;i<8;i++) //分8次读入数据,高位在前
    75. {
    76. cs=0;
    77. clk=1;
    78. delay8ms();
    79. inbyte=inbyte*2; //乘2,相当于左移一位
    80. if(dio)
    81. {inbyte=inbyte|0x01;}
    82. clk=0;
    83. delay8ms();
    84. }
    85. dio=0;
    86. return(inbyte);
    87. }
    88. void delay8ms()//定义延迟子程序
    89. {
    90. uchar i;
    91. for(i=0; i<8;i++);
    92. }
    93. void delay48ms()//定义延迟子程序
    94. {
    95. uchar i;
    96. for(i=0;i<0x30;i++);
    97. }

    初学单片机,可能存在错误之处,还请各位不吝赐教。

  • 相关阅读:
    Java 读写锁 ReadWriteLock 原理与应用场景详解
    Java 图形用户界面设计——GUI编程
    01_从JDK源码级别剖析JVM类加载机制
    LeetCode 刷题系列 -- 200. 岛屿数量
    第十一章 JavaScript操作DOM对象
    智工教育:教编考试加分事项及报考条件
    【回溯算法】leetcode 17. 电话号码的字母组合
    图像处理:推导三种边缘检测算法(Sobel,FFT,FHT)
    Docker 安装部署 Gitlab 存储路径迁移
    如何正确使用手提电动打包机
  • 原文地址:https://blog.csdn.net/m0_52316372/article/details/125635850