首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >山东大学单片机原理与应用实验 4.7 7279键盘扫描及动态LED显示实验

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

作者头像
timerring
发布2022-07-20 14:19:48
发布2022-07-20 14:19:48
9240
举报
文章被收录于专栏:TechBlogTechBlog

目录

一、实验题目

二、实验要求

三、实验过程及结果

四、实验流程图

五、实验源程序


一、实验题目

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:实验流程图

五、实验源程序

代码语言:javascript
复制
#include<reg51.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define reset 0xa4
#define rl 0xa1   //定义宏变量左移指令rl 
#define dcode1 0xc8   //定义宏变量译码方式1指令 dcode1 
#define read 0x15   //定义宏变量读输入指令read 
#define uchar unsigned char//自定义数据类型
#define uint unsigned int
void delay48ms();
void delay8ms();
void write7279(uchar,uchar);  
uchar read7279(uchar);
void sendbyte(uchar); 
uchar receivebyte();
uchar keyma[]={0x1b,0x13,0x0b,0x03,0x1a,0x12,0x0a,0x02,0x19,0x11,0x09,0x01,0x18,0x10,0x08,0x00}; //定义存放按键的键码数组keyma[]
sbit cs=P1^0; //分别定义控制端口
sbit clk=P1^1;
sbit dio=P1^2;
sbit key=P1^3; 

void main()
{ uchar button,i,num;
  sendbyte(0xa4); //定义复位
  while(1)
  {
    if(key==0)  
    { 
      sendbyte(0x15);    //读键盘的键值
      button =receivebyte();   //将收到的键码传给button
      for(i=0;i<16;i++)     //确认键值的具体位置
      {
        if(button==keyma[i]);
        {
          num=i;
          break;
        }
      }
      sendbyte(0xa1);     //数码管左移一位
      write7279(0xc8,num);    //方式1译码并显示 
      while(key==0);     //按键停止后,重新检测
    }
  }
}
void write7279(uchar cmd,uchar dta)
{  
  sendbyte(cmd);   //下载数据并按方式1译码
    sendbyte(dta);   //写入显示的数字
}

void sendbyte(uchar outbyte)
{
  uchar i;
  cs=0;  
  delay48ms();  //调用延时
  for(i=0;i<8;i++)  //利用循环,分别移入数据
  { 
    if(outbyte&0x80)  //取最高位
    dio=1;
    else  dio=0;
    clk=1;  //   时钟上升沿读入数据
    delay8ms();
    clk=0;
    delay8ms();
    outbyte=outbyte*2;  //数据左移一位以送次高位
  }
  dio=0;   //防止从p1口读入数据
}
uchar receivebyte()
{
  uchar i;
  uchar inbyte=0;
  dio=1;  //从P1.2读入数据
  delay48ms();   //延时
  for(i=0;i<8;i++)  //分8次读入数据,高位在前
  {
    cs=0;
    clk=1; 
    delay8ms(); 
    inbyte=inbyte*2;  //乘2,相当于左移一位
    if(dio)
    {inbyte=inbyte|0x01;}
clk=0;
    delay8ms();
  }
  dio=0;
  return(inbyte);
}
void delay8ms()//定义延迟子程序
{ 
  uchar i;
  for(i=0; i<8;i++);
}
void delay48ms()//定义延迟子程序
{
  uchar i;
  for(i=0;i<0x30;i++);
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实验题目
  • 二、实验要求
  • 三、实验过程及结果
  • 四、实验流程图
  • 五、实验源程序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档