实验四 矩阵键盘扫描实验 自我完成实验
1、实验要求
D1~D8 八个发光二极管构成彩色旋转灯,D9~D13 为档位指示灯,一档旋转速度最慢(周期 1s,D13 亮),二档较快(周期 0.8s,D12 亮),三档更快(周期 0.6s,D11 亮),四档再快(周期 0.4s,D10 亮),五档最快(周期 0.2s,D10 亮)。四个按键 KEY0-KEY1于设定旋转方向为顺时针旋转或者逆时针旋转,KEY2-KEY3 用于增快或则减慢旋转速度。
2、编程思路
按键扫描的方式可以采用前面示例程序中的方法:线反转法或行扫描法。可以用汇编语言 实现,也可以用 C 语言实现。建议如前面示例所示,汇编采用行扫描法,C 语言用线反法。 程序控制流程是:首先初始化设置默认运行参数,然后读取按键,识别键码,并根据键码 的不同执行运行参数调整,最后根据当前的运行参数执行发光二极管 D1-D8 的轮流旋转。
速度的控制通过控制调用延时程序的次数来决定,假设延时程序的延时长度为 5ms。延时 程序可以按如下方式实现(假设晶振频率为 12MHz): void delays() {
uchar t,ms;
ms=5; //延时 5ms
while(ms--) for(t=0;t<120;t++); }
或者采用内嵌汇编来实现: void delays() {
#pragma asm
MOV R2,#50 //;5ms 延时程序 DL1:MOV R1,#48
DL2:DJNZ R1,DL2 // ;内循环 100us NOP
DJNZ R2,DL1 //;中循环 10ms #pragma endasm }
旋转彩灯线反转法 C 语言程序控制流程图
(1)主控流程图 (2)键盘扫描子程序 Keyscan 流程图
旋转彩灯行扫描法汇编控制流程图
3、实验步骤
① 根据上述实验内容,参考 1.2.2,在 Proteus 环境下建立图 3.11 所示原理图,并将其 保存为 keyscan_self.DSN 文件。
② 根据(2)和(3)编写控制源程序,将其保存为 keyscan_self.asm 或 keyscan_self.c。 ③ 将源程序添加到 U1 中,并构造(build)该程序。 ④ 执行仿真过程观察秒表程序功能是否正确。
4、源程序
#include\#include\
#define uchar unsigned char #define uint unsigned int sbit g0=P0^4;
uchar code T_TABLE[]={200,160,120,80,40};//周期值表 uchar code key_code[]={0x22,0x12,0x21,0x11};
void delay()//延时5ms { uchar t,ms; ms=5; while(ms--) for(t=0;t<120;t++); }
void main() { int aa=0xfe; uint dir=1; uint speed=0; int temp,temp2,keycode; int j,key; g0=0; while(1) { P3=0x30; temp=P3; if((temp&0x30)!=0x30)//按键检测 { delay(); delay();