发布时间:2023-06-06 08:00
目录
一、实验题目
二、实验要求
三、实验过程及结果
四、实验流程图
五、实验源程序
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
#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++);
}
初学单片机,可能存在错误之处,还请各位不吝赐教。