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

目录

一、实验题目

二、实验要求

三、实验过程及结果

四、实验流程图

五、实验源程序


一、实验题目

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

二、实验要求

1、画出实验的流程图

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

3、记录实验过程

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

三、实验过程及结果

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

山东大学单片机原理与应用实验 4.7 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 步的步骤,直至结果正确。

四、实验流程图

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

           图2:实验流程图

五、实验源程序

#include
#include
#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++);
}

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

你可能感兴趣的:(MCU-C51,51单片机,单片机,经验分享,proteus,mcu)