一、实验目的 1.学习矩阵式键盘工作原理 2.学习矩阵式接口的电路设计和程序设计 二、实验内容与结果 1.USB 线 2.单片机最小系统实验教学模块 3.矩阵式键盘实验模块 4.动态扫描数码管显示模块 题目: 在矩阵式键盘中的某个键被按下时,8 位 LED 动态显示器上最低位显示该键对应的字符,以前的字符向高位推进 1 位(即类似于计算器)。 程序: (1)源代码 //头文件包含 #include <reg51.h> #include <intrins.h> //宏定义 #define uchar unsigned char #define uint unsigned int //共阴极数码管0-F的段码列表,表中最后一个0x00是显示为暗的断码表 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x53,0x79,0x71,0x00}; uchar Display_Buffer[]={16,16,16,16,16,16,16,16}; void DelayM(uint x) { uchar t; while(x--) { for(t=0;t<120;t++); } } uchar kscan() { uchari,temp,num=16; for(i=0;i<4;i++) { //逐行扫描 P1=_cror_(0x7f,i); //读取键值 temp=P1; //读取键值,屏蔽高四位行值 temp=temp&0x0f; //低四位列值 if(temp!=0x0f) { DelayM(5); temp=P1; temp=temp&0x0f; if(temp!=0x0f) { temp=P1; switch(temp) { case0x77:num=0;break; case0x7b:num=1;break; case0x7d:num=2;break; case0x7e:num=3;break; case0xb7:num=4;break; case0xbb:num=5;break; case0xbd:num=6;break; case0xbe:num=7;break; case0xd7:num=8;break; case0xdb:num=9;break; case0xdd:num=10;break; case0xde:num=11;break; case0xe7:num=12;break; case0xeb:num=13;break; case0xed:num=14;break; case0xee:num=15;break; default:break; } } //等待按键释放 while((temp&0x0f)!=0x0f) { temp=P1; temp=temp&0x0f; } } DelayM(5); } returnnum; } void main() { uchark,m=0x7f,num; //关闭数码管的段选 P0=0x00; //关闭数码管的位选 P2=0xff; while(1) { num=kscan(); if(num!=16) { for(k=1;k<8;k++) { //显示向前移动一位 Display_Buffer[k-1]=Display_Buffer[k]; } //最低位显示当前按键值 Display_Buffer[7]=num; num=16; } //循环显示8位 for(k=0;k<8;k++) { m=_crol_(m,1); P2=m; P0=table[Display_Buffer[k]]; DelayM(2); } }
} 附件包含protues原理图和代码
|