这是我上个月做的 阵列键盘输入和LED动态显示实验
里面有原理图和代码。- #include <reg51.h>
- #include <absacc.h> //定义绝对地址访问
- #define uchar unsigned char
- #define uint unsigned int
- void delay(uint); //声明延时函数
- void display(void); //声明显示函数
- uchar checkkey();
- uchar keyscan(void);
- uchar disbuffer[8]={0,1,2,3,4,5,6,7}; //定义显示缓冲区
- void main(void)
- {
- uchar key;
- XBYTE[0x7f03]=0x81; //8255A初始化,输入引脚被自动拉为高。
- while(1)
- {
- key=keyscan();
- if( key!=0xff)
- {disbuffer[0]=disbuffer[1];
- disbuffer[1]=disbuffer[2];
- disbuffer[2]=disbuffer[3];
- disbuffer[3]=disbuffer[4];
- disbuffer[4]=disbuffer[5];
- disbuffer[5]=disbuffer[6];
- disbuffer[6]=disbuffer[7];
- disbuffer[7]=key;
- }
- display(); //设显示函数
- }
- }
- //************延时函数************
- void delay(uint i) //延时函数
- {uint j;
- for (j=0;j<i;j++){}
- }
- //***********显示函数
- void display(void) //定义显示函数
- {uchar codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F的字段码表
- uchar chocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选码表
- uchar i,p,temp;
- for (i=0;i<8;i++)
- {
- XBYTE[0x7f01]=0xff;
- p=disbuffer[i]; //取当前显示的字符
- temp=codevalue[p]; //查得显示字符的字段码
- XBYTE[0x7f00]=temp; //送出字段码
- temp=chocode[i]; //取当前的位选码
- XBYTE[0x7f01]=temp; //送出位选码
- delay(20); //延时1ms
- }
- }
- //************检测有无键按下函数************
- uchar checkkey() //检测有无键按下函数,有返回0,无返回0xff
- {
- uchar i;
- XBYTE[0x7f00]=0x00;
- i=XBYTE[0x7f02];
- i=i&0x0f;
- if (i==0x0f) return(0xff);
- else return(0);
- }
- //************键盘扫描函数************
- uchar keyscan() //键盘扫描函数,如果有键按下,则返回该键的编码,如果无键按下,则返回0xff
- {uchar scancode; //定义列扫描码变量
- uchar codevalue; //定义返回的编码变量
- uchar m; //定义行首编码变量
- uchar k; //定义行检测码
- uchar i,j;
- if (checkkey()==0xff) return(0xff); //检测有无键按下,无返回0xff
- else
- {
- delay(20); //延时
- if(checkkey()==0xff) return(0xff); //检测有无键按下,无返回0xff
- else
- {
- scancode=0xfe; //列扫描码,行首码赋初值
- for (i=0;i<8;i++)
- {
- k=0x01;
- XBYTE[0x7f00]=scancode; //送列扫描码
- m=0x00;
- for (j=0;j<2;j++)
- {
- if ((XBYTE[0x7f02]&k)==0) //检测当前行是否有键按下
- {
- codevalue=m+i; //按下,求编码
- while (checkkey()!=0xff); //等待键位释放
- }
- else
- {k=k<<1;m=m+8;} //行检测码左移一位,计算下一行的行首编码
- }
- scancode=scancode<<1; //列扫描码左移一位,扫描下一列
- }
- }
- return(codevalue); //返回编码
- }
- }
复制代码
全部资料51hei下载地址:
实验五.rar
(127.13 KB, 下载次数: 17)
|