目录
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:实验流程图
- #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++);
- }
初学单片机,可能存在错误之处,还请各位不吝赐教。