delay(); } } }}
void delay() //延时子程序 {
uint x,y;
for(x=2;x>0;x--)
for(y=110;y>0;y--); }
六、实验结果分析:
这次试验的重点是段选和位选,由于51芯片的引脚资源有限,而通过锁存器来扩充引脚资源又是一个比较好的办法,所以采用这种做法来控制数码管。
实验四 按键实验
一、实验目的
1、掌握单片机键盘与单片机接口
2、掌握单片机键盘(独立键盘和矩阵键盘)程序设计方法
二、实验内容
设计一4×4矩阵键盘,定义键盘数字为0~F;编制一位数码管显示按下键盘值程序。
三、实验原理
键盘是计算机系统中不可缺少的输入设备,当按键少时可接成线性键盘(或称独立键盘),即一个键盘占用一个I/O口中一位,当按键较多时,这样的接法占用口线较多。在按键较多时,常将按键接成矩阵的形式,可以节省口线,例如一个I/O口可按4×4的形式接16个按键。
矩阵键盘通常由列线和行线构成,按键设在行线,列线交点处,行、列线分别连接到按键开关的两端。列线(按键一端)通过电阻接VCC,行线(按键另一端)的接地是通过程序对某I/O口输出数字“0”实现。矩阵键盘的每一个键都有自己的行值和列值,行值和列值的组合是识别这个按键的编码,称为键码。 图示出了单片机实验仪4×4矩阵键盘模块,它有P-14、P-15、P-16、P-17四行和P-10、P-11、P-12、P-13四列构成(当列线连接到某I/O时,可通过相应口经一电阻与VCC连接,见图1-1),共构成S1~S16个按键。四行行线和四列列线分别连接到JP4 接线排座的引脚,可通过它们连接到某个I/O口,实现键盘键盘闭合判断,获得键盘的键值。
四、硬件电路设计
利用单片机P2口低4位作为矩阵键盘的行线,高4为作为矩阵键盘的列线;利用8PIN 排线将最小系统模块的接线排座J8和矩阵按键模块的接线排座JP4连接(注意引脚号的对应关系)。利用P0口作为数码管的字形码输出口,利用8PIN排线将最小系统模块的接线排座J10和单位数码管模块的接线排座JP3连接(注意引脚号的对应关系)。
根据硬件电路设计,其键盘键码示于表5-1。设键盘对应数字如表5-2所示。
(S1)EE (S2)DE (S3)BE (S4)7E (S5)ED (S6)DD (S7)BD (S8)7D (S9)EB (S10)DB (S11)BB (S12)7B (S13)E7 (S14)D7 (S15)B7 (S16)77 表5-1 矩阵键盘键码表
(S1)1 (S5)5 (S2)2 (S6)6 (S3)3 (S4)4 (S7)7 (S8)8 (S9)9 (S10)0 (S11)A (S12)B (S13) (S14)D (S15)E (S16)F 表5-2 矩阵键盘对应数字
五、软件设计 1、程序流程图
开始
检测是否有按键按下 消陡
数码管显示 检测是否有按键按下
2、程序代码 #include
#define uchar unsigned char #define uint unsigned int
code char tab[16]={0xc0,0xf9, 0xa4,0xb0,0x99, 0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1, 0x86,0x8e};
//共阳极数码管显示码表 void delayms (); uchar kbscan();
void display(uchar keydisp); //函数调用声明 void main () {
uchar key; P0=0xc0; while (1) {
key=kbscan(); //是否有键按下 display(key); } }
void delayms () {
uchar i; //延时子程序 for (i=200;i>0;i--){} }
uchar kbscan () {
uchar sccode, recode; //定义矩阵键盘行,列
结束 P2=0xf0;
if((P2 & 0xf0)!=0xf0) { delayms ( );
if ((P2 & 0xf0)!=0xf0) //P2的高四位不全为1时说明有按键按下 {sccode=0xfe; //第一行为1 while((sccode&0x10)!=0) //不断扫描,确定按下的按键 { P2=sccode;
if ((P2 & 0xf0)!=0xf0) { recode = P2 & 0xf0; sccode= sccode & 0x0f; return (sccode+recode); } else
sccode=(sccode <<1)| 0x01; } } }
return(0); }
void display (uchar keydisp )
{ uchar keytab[16]={ 0xdb,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,
0x7d,0xeb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77} ; //矩阵键码对应的数字 uchar m ;
for (m=0;m<16;m++) {
if (keytab[m]==keydisp) P0=tab[m] ; } }
六、实验结果分析:
这次的实验感觉也是比较容易的,主要针对的是将矩阵键盘对应数字进行改变,另外就是要求我们对代码要有很深的理解,这样做起来才会效率很高。。
实验五 中断实验