按你的意思不用接74HC573,数码管可直接接P2与P3口,代码如下: #include<reg51.h> #define uchar unsigned char #define uint unsigned int //段码表 注意:是共阳数码管 uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //位码表 uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //延时 void delay_mS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } void main() { uchar i,j; while(1) { for(j=0;j<8;j++) { P2=0x00; P2=duan[j]; //发送段码 P3=wei[j]; //发送位码 delay_mS(100); //将动态时间延长就是你要的效果 } } } |
jinsheng7533967 发表于 2018-12-7 16:04 不需要加段锁存和位锁存么 |
wulin 发表于 2018-12-16 20:24 非常完美,谢谢 大哥,想和你交个朋友,做我师傅吧,嘿嘿 |
1628990936 发表于 2018-12-16 18:06 ![]() #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P3^0; //HL-1 sbit wela=P3^1; //HL-1 sbit key =P3^2; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar code table1[]={0x00,0x76,0x79,0x38,0x38,0x6e,0x00,0x00};//HELLY uchar data dis_buf[8]; uint num=0; void keyscan()//按键程序 { static uchar count; //计数消抖变量 static bit key_sign=0; //按键自锁标志 uchar a; if(key==0) //检测输入如果为0 { if((++count>=100)&&(key_sign==0)) { key_sign=1; //按键自锁标志置1,防止重复响应 num++; dis_buf[0]=num; for(a=8;a>0;a--) dis_buf[a]=dis_buf[a-1]; if(num>9) num=0; } } else { count=0; //计数变量清0 key_sign=0; //按键自锁标志清0 } } void display()//显示程序 { static uchar i=0,j; //计数变量 if(++j>100)//调整数码管刷新频率 { j=0; P2=0x00; dula=1; dula=0; switch(i) { case 0: P2=0xfe; wela=1; wela=0; if(num>7) { if(num==9) P2=table1[0]; else P2=table[dis_buf[8]]; } else P2=0x00; dula=1; dula=0; i++; break; case 1: P2=0xfd; wela=1; wela=0; if(num>6) { if(num==9) P2=table1[1]; else P2=table[dis_buf[7]]; } else P2=0x00; dula=1; dula=0; i++; break; case 2: P2=0xfb; wela=1; wela=0; if(num>5) { if(num==9) P2=table1[2]; else P2=table[dis_buf[6]]; } else P2=0x00; dula=1; dula=0; i++; break; case 3: P2=0xf7; wela=1; wela=0; if(num>4) { if(num==9) P2=table1[3]; else P2=table[dis_buf[5]]; } else P2=0x00; dula=1; dula=0; i++; break; case 4: P2=0xef; wela=1; wela=0; if(num>3) { if(num==9) P2=table1[4]; else P2=table[dis_buf[4]]; } else P2=0x00; dula=1; dula=0; i++; break; case 5: P2=0xdf; wela=1; wela=0; if(num>2) { if(num==9) P2=table1[5]; else P2=table[dis_buf[3]]; } else P2=0x00; dula=1; dula=0; i++; break; case 6: P2=0xbf; wela=1; wela=0; if(num>1) { if(num==9) P2=table1[6]; else P2=table[dis_buf[2]]; } else P2=0x00; dula=1; dula=0; i++; break; case 7: P2=0x7f; wela=1; wela=0; if(num>0) { if(num==9) P2=table1[7]; else P2=table[dis_buf[1]]; } else P2=0x00; dula=1; dula=0; i=0; break; } } } void main() { while(1) { keyscan(); display(); } } |
wulin 发表于 2018-12-14 22:36 唔,就是 这个 电路图, 只有一个按键,按一下 显示1,按第二下,显示1,2.......。按第八下,显示12345678,按第九下,八位数码管只显示helly,就可以了,整个过程只有一个按键这个八位的数码管。 |
1628990936 发表于 2018-12-14 11:24 你是想用数码管显示字符“helly”吗?不太明白你的意思。 |
wulin 发表于 2018-12-9 12:46 大哥,如果我想把按键显示结束后,再按一下,然后显示helly,同时显示,该怎么修改这个程序呢,请大哥务必帮我,事后必有重谢。 |
jinsheng7533967 发表于 2018-12-9 16:28 谢谢 大哥,留个vx 我给你发个红包 |
wulin 发表于 2018-12-9 12:46 谢谢 大佬 非常感谢 留个微信吧 我给你发个红包 |
1628990936 发表于 2018-12-8 18:28 给你一个独立按键代码,你可以自己加进去试试,另外你空间里提到的用74HC573按按键保存密码的事不现实,74HC573是锁存器(当使能位低电平时,锁存你刚从P/I口送去的数据,P/I口再来的数据据之门外;当使能位高电平时,输出随P/I口变化),不是记忆芯片,不可能保存你说的所谓密码,只能用动态扫描扫出你要的数字。另外网上有很多独立按键的与数码管的视频教程,多看几次,多敲几次就明白了。 void PORT_key(void) { if(key == 0) //将你的按键位定意为key { delay(10); //消抖 if(key == 0) { while(key == 0);//松手 i++; //不知你的变量是不是i } } } 再将此代码放入while(1)中.去掉for的8次循环,i 放入数组中 |
这个建议你慢慢学,自己编程才有乐趣,没有基础的话,别人的不容易看懂。 |
本帖最后由 wulin 于 2018-12-9 16:23 编辑 给你写一个适合做密码锁的显示电路。完全符合你想要的功能。 ![]() #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P3^0; //HL-1 sbit wela=P3^1; //HL-1 sbit key =P3^2; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar data dis_buf[9]; uint num=0; void keyscan()//按键程序 { static uchar count; //计数消抖变量 static bit key_sign=0; //按键自锁标志 uchar a; if(key==0) //检测输入如果为0 { if((++count>=100)&&(key_sign==0)) { key_sign=1; //按键自锁标志置1,防止重复响应 num++; if(num>=9) num=0; dis_buf[0]=num; for(a=8;a>0;a--) dis_buf[a]=dis_buf[a-1]; } } else { count=0; //计数变量清0 key_sign=0; //按键自锁标志清0 } } void display()//显示程序 { static uchar i=0,j; //计数变量 if(++j>100)//调整数码管刷新频率 { j=0; P2=0x00; dula=1; dula=0; switch(i) { case 0: P2=0xfe; wela=1; wela=0; if(num>7) P2=table[dis_buf[8]]; else P2=0x00; dula=1; dula=0; i++; break; case 1: P2=0xfd; wela=1; wela=0; if(num>6) P2=table[dis_buf[7]]; else P2=0x00; dula=1; dula=0; i++; break; case 2: P2=0xfb; wela=1; wela=0; if(num>5) P2=table[dis_buf[6]]; else P2=0x00; dula=1; dula=0; i++; break; case 3: P2=0xf7; wela=1; wela=0; if(num>4) P2=table[dis_buf[5]]; else P2=0x00; dula=1; dula=0; i++; break; case 4: P2=0xef; wela=1; wela=0; if(num>3) P2=table[dis_buf[4]]; else P2=0x00; dula=1; dula=0; i++; break; case 5: P2=0xdf; wela=1; wela=0; if(num>2) P2=table[dis_buf[3]]; else P2=0x00; dula=1; dula=0; i++; break; case 6: P2=0xbf; wela=1; wela=0; if(num>1) P2=table[dis_buf[2]]; else P2=0x00; dula=1; dula=0; i++; break; case 7: P2=0x7f; wela=1; wela=0; if(num>0) P2=table[dis_buf[1]]; else P2=0x00; dula=1; dula=0; i=0; break; } } } void main() { while(1) { keyscan(); display(); } } |
yingchun 发表于 2018-12-8 20:48 兄弟 你会编写程序吗 |
jinsheng7533967 发表于 2018-12-7 16:04 大哥 我需要 一个按键控制呀 |
jinsheng7533967 发表于 2018-12-7 16:04 大哥 谢谢 你的程序 但是 你编的 没有按键呀 |
有什么福利 |