单片机原理及应用实验六按键识别数码管显示实验.docx
《单片机原理及应用实验六按键识别数码管显示实验.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用实验六按键识别数码管显示实验.docx(8页珍藏版)》请在冰点文库上搜索。
单片机原理及应用实验六按键识别数码管显示实验
电子信息学院
实验报告书
课程名:
《单片机原理及应用实验》
题 目:
实验六按键识别数码管显示实验
软件+硬件实验
实验类别:
【设计】
班级:
电子1313
学 号:
26
姓 名:
吴限
1、实验内容或题目
1)题目:
按键识别数码管显示实验
2)实验内容:
数码管显示矩阵按键号。
2、实验目的与要求
1)实验目的:
掌握按键识别及数码管显示的实现方法。
2)实验要求:
通过XL2000的16位矩阵按键,在数码管上分别显示0~9,A,B,C,D,E,F。
用Keil编译、Proteus仿真,代码下载到单片机实验箱上验证。
3、实验仪器
(1)PC微机 1台
(2)实验箱ﻩﻩﻩﻩ1台
4、实验程序流程图
5、实验程序
(实验程序清单作为附件放在最后)
6、实验步骤
1)keil中C语言程序实现。
2)在proteus中完成电路图设计,并实现仿真。
3)硬件实验部分:
用一条8PIN数据排线,把矩阵按键部份的JP50,接到CPU 部份的P1口JP44;接8位数码管的数据线。
将数码管部份的数据口JP5接到CPU 部份的P0口JP51;接8位数码管的显示位线。
将数码管部份的显示位口JP8接到CPU部份的P2 口JP52.
7、实验数据及结果
8、思考题
采用P3口控制矩阵按键输入,程序应该如何修改?
答:
本实验的程序中可以不用蜂鸣器驱动线,把以下程序的sbitBEEP=P3^7;及函数void beep()等删掉后;需要把扫描键值的函数改一下:
unsignedcharkeyscan()
{
unsignedchar scan1, scan2, keycode,j;
P13= 0xf0;
scan1= P3;
if(scan1!
=0xf0) //判键是否按下
{
delayms(10);
ﻩ scan1 =P3;
if (scan1!
=0xf0) //二次判键是否按下
{
P1 = 0x0f;
scan2=P3;
keycode= scan1| scan2;//组合成键扫描编码
for(j=0;j<16; j++)
{
if(keycode==key_code[j]) //查表得键值
{
key=j;
return(key); //返回有效键值
}
}
}
}
else
P3 =0xff;
return(key= 16);//返回无效码
} 即P1口换成P3口,而键编码数组是固定的,可以不变;
此外主函数中的P1口也要改为P3口:
voidmain(void)
{
P0= 0xf7;//数码管初始显示"-"
P2=0xfd;//数码管显示在第二位
P3 =0xff;
while(1)
{
keyscan();
if (key<16)//有效键值
{
P0 =disp_code[key];//显示键值
}
}
}
<附件>实验程序清单
#include<reg52.h>
#include
sbitBEEP=P3 ^7; //蜂鸣器驱动线
unsignedcharkey;
unsigned charcode disp_code[]=
{
0xf9,0xa4,0xb0,0x99,
ﻩﻩﻩ0x92,0x82,0xf8,0x80,
ﻩ 0x90,0x88,0x83,0xc6,
ﻩﻩﻩﻩ 0xc0,0x86,0x8e,0xc0};ﻩ
unsignedcharcodekey_code[]=
{
0xee,0xed,0xeb,0xe7,0xde,0xdd, 0xdb,0xd7, 0xbe,0xbd,0xbb,
0xb7,0x7e,0x7d,0x7b,0x77//键编码数组
};
char codeSST516[3]_at_0x003b; //保留仿真器
/********************延时子函数***************/
voiddelayms(unsignedint ms)
{
unsigned char t;
while (ms--)
{
for(t=0;t<114;t++);
}
}
/*************x*0.14MS延时子函数****************/
voiddelayus(unsigned charx)
{
unsigned chari;
while (x--)
{
for(i=0;i<14;i++)
{;
}
}
}
/******************蜂鸣器驱动子函数*****************/
voidbeep()
{
unsignedchari;
for(i= 0;i<250;i++)
{
delayus(6);
BEEP=!
BEEP; //BEEP取反
}
BEEP= 1; //关闭蜂鸣器
delayms(150); //延时
}
/******************键盘扫描子函数*********************/
unsignedcharkeyscan()
{
unsigned charscan1, scan2,keycode,j;
P1=0xf0;
scan1 =P1;
if(scan1!
=0xf0) //判键是否按下
{
delayms(10); //延时10ms
scan1 =P1;
if(scan1!
=0xf0) //二次判键是否按下
{
P1= 0x0f;
scan2=P1;
keycode =scan1 |scan2;//组合成键扫描编码
for(j=0; j<16;j++)
{
if(keycode ==key_code[j]) //查表得键值
{
key =j;
return(key); //返回有效键值
}
}
}
}
else
P1 =0xff;
return (key=16);//返回无效码
}
/*************************主函数***********************/
voidmain(void)
{
P0= 0xf7;//数码管初始显示"-"
P2 = 0xfd;//数码管显示在第二位
P1=0xff;
while(1)
{
keyscan();
if(key<16)//有效键值
{
P0=disp_code[key];//显示键值
beep();//蜂鸣器响一声
}
}
}