|
本帖最后由 玛德陛下 于 2021-1-5 22:32 编辑
做的例8.34
但是没有用8255, 按照上次做的数码管仿真改动了一下,
用 了51的P1,P2 口 和P0口的0,1。
编程语法之类的BUG 找了半个小时,最终还是通过了编译
加载 HEX 运行如图。
没有运行起来
硬件错误了,P0口得上拉电阻
但显示 如图了,任意按键就熄灭了。
但最终还是找到问题了,检测 按键 得屏蔽 P0的 2-7 口。
动态图
- #include<reg51.h>
- void delay(unsigned int);
- void display();
- unsigned char checkkey();
- unsigned char keyscan();
- unsigned char disbuffer[8]={0,0,0,0,0,0,0,0};
- void main()
- {
-
-
- unsigned char key;
-
-
-
-
-
-
- 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(unsigned int i)
- {
- unsigned int j;
- for (j=0;j<i;j++){}
- }
- //-----------显示函数---------------
-
-
- void display ()
- {
- unsigned char codevalue[16]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- unsigned char chocode[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
-
- unsigned char i,p,temp;
- for (i=0;i<8;i++)
- {
- temp=chocode[i];
- P2=temp;
- p=disbuffer[i];
- temp=codevalue[p];
- P1=temp;
- delay(20);
-
-
- }
- }
-
-
- //------------检测有没有键按下函数---------------
- unsigned char checkkey()
- {
- unsigned char i;
- P1=0x00;
- i=P0;
- i=i&0x03; //屏蔽P0.2-7
- if (i==0x03)return(0xff);
- else return (0);
- }
- //------------------键盘扫描函数--------------------
- unsigned char keyscan()
- {
- unsigned char scancode; //列扫描码
- unsigned char codevalue; //返回的编码
- unsigned char m; //行首编码
- unsigned char k; //行检测码
- unsigned char i,j;
- if(checkkey()==0xff)return(0xff); //检测有无键按下
- else
- {
- delay(20);
- if(checkkey()==0xff)
- return(0xff); //延时有无键按下
- else
- {
- scancode = 0xfe; //列扫描码初值11111110
- for(i=0;i<8;i++)
- {
- k=0x01;
- P1=scancode; //扫描 P1口
- m=0x00;
- for(j=0;j<2;j++)
- {
- if((P0&k)==0) //检测行
- {
- codevalue=m+i; //按下 ,计算编码
- while(checkkey()!=0xff); //等按键释放
- }
- else
- {
- k=k<<1; //行左移
- m=m+8; //下一行行首编码
- }
- }
- scancode=scancode<<1; //列扫描码左移,扫描下一列
- }
- }
- return(codevalue);
- }
- }
复制代码
代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|