永发信息网

51单片机按键对数码管的控制

答案:3  悬赏:60  手机版
解决时间 2021-02-06 15:09
51单片机按键对数码管的控制89c52单片机,按键按下时一个数码管显示数字5,放开仍显示数字5,再次按时数码管显示数8,放开仍显示数字8,以此循环,写出程序。
最佳答案

#include<reg52.h> //包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
unsigned char code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,};
// 显示数值表0-9

void main (void)
{
while (1) //主循环
{
switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断
{
case 0xfe:P1=table[1];break;//0xfe = 1111 1110,
//说明连接在P1.0端口的按键被按下,显示对应的数字然后跳出循环
case 0xfd:P1=table[2];break;
case 0xfb:P1=table[3];break;
case 0xf7:P1=table[4];break;
case 0xef:P1=table[5];break;
case 0xdf:P1=table[6];break;
case 0xbf:P1=table[7];break;
case 0x7f:P1=table[8];break;
default:break; //如果都没按下,直接跳出
}
}
}
有问题回复我哦
全部回答
原发布者:春暖花开chun #include#defineuintunsignedint#defineucharunsignedcharucharc;sbitp10=P1^0;sbitp11=P1^1;sbitp12=P1^2;sbitp13=P1^3;sbitp14=P1^4;sbitp15=P1^5;sbitp16=P1^6;sbitp17=P1^7;voiddelay(uintz);intb[]={0,1,2,3,4,5,6,7};//设置每一位显示的数字unsignedcharcodeTab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳极数码管inta[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};voidmain(){EA=1;EX0=1;IT0=1;P1=0xff;while(1){for(c=0;c/数码管扫描显示{P2=a[c];P0=Tab[b[c]];delay(1);}}}voiddelay(uintz){uinta,b;for(a=z;a>0;a--)for(b=110;b>0;b--);}int_0()interrupt0{EA=0;if(p10==0)b[0]=(b[0]+1)%10;if(p11==0)b[1]=(b[1]+1)%10;if(p12==0)b[2]=(b[2]+1)%10;if(p13==0)b[3]=(b[3]+1)%10;if(p14==0)b[4]=(b[4]+1)%10;if(p15==0)b[5]=(b[5]+1)%10;if(p16==0)b[6]=(b[6]+1)%10;if(p17==0)b[7]=(b[7]+1)%10;EA=1;}
1. 接电源:vcc(pin40)、gnd(pin20)。加接退耦电容0.1uf 2. 接晶体:x1(pin18)、x2(pin19)。注意标出晶体频率(选用12mhz),还有辅助电容30pf 3. 接复位:res(pin9)。接上电复位电路,以及手动复位电路,分析复位工作原理 4. 接配置:ea(pin31)。说明原因。 发光二极的控制:单片机i/o输出 将一发光二极管led的正极(阳极)接p1.1,led的负极(阴极)接地gnd。只要p1.1输出高电平vcc,led就正向导通(导通时led上的压降大于1v),有电流流过led,至发led发亮。实际上由于p1.1高电平输出电阻为10k,起到输出限流的作用,所以流过led的电流小于(5v-1v)/10k = 0.4ma。只要p1.1输出低电平gnd,实际小于0.3v,led就不能导通,结果led不亮。 开关双键的输入:输入先输出高 一个按键key_on接在p1.6与gnd之间,另一个按键key_off接p1.7与gnd之间,按key_on后led亮,按key_off后led灭。同时按下led半亮,led保持后松开键的状态,即on亮off灭。 代码 1. #include 2. #define led p1^1 //用符号led代替p1_1 3. #define key_on p1^6 //用符号key_on代替p1_6 4. #define key_off p1^7 //用符号key_off代替p1_7 5. void main( void ) //单片机复位后的执行入口,void表示空,无输入参数,无返回值 6. { 7. key_on = 1; //作为输入,首先输出高,接下key_on,p1.6则接地为0,否则输入为1 8. key_off = 1; //作为输入,首先输出高,接下key_off,p1.7则接地为0,否则输入为1 9. while( 1 ) //永远为真,所以永远循环执行如下括号内所有语句 10. { 11. if( key_on==0 ) led=1; //是key_on接下,所示p1.1输出高,led亮 12. if( key_off==0 ) led=0; //是key_off接下,所示p1.1输出低,led灭 13. } //松开键后,都不给led赋值,所以led保持最后按键状态。 14. //同时按下时,led不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态 15. } 数码管的接法和驱动原理 一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。 我们通常又将各二极与一个字节的8位对应,a(d0),b(d1),c(d2),d(d3),e(d4),f(d5),g(d6),h(d7),相应8个发光二极管正好与单片机一个端口pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(pn.0),b(pn.1),c(pn.2),d(pn.3),e(pn.4),f(pn.5),g(pn.6),h(pn.7)。 如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。 以单支共阴数码管为例,可将段极接到某端口pn,共阴极接gnd,则可编写出对应十六进制码的七段码表字节数据如右图: 16键码显示的程序 我们在p1端口接一支共阴数码管sled,在p2、p3端口接16个按键,分别编号为key_0、key_1到key_f,操作时只能按一个键,按键后sled显示对应键编号。 代码 1. #include 2. #define sled p1 3. #define key_0 p2^0 4. #define key_1 p2^1 5. #define key_2 p2^2 6. #define key_3 p2^3 7. #define key_4 p2^4 8. #define key_5 p2^5 9. #define key_6 p2^6 10. #define key_7 p2^7 11. #define key_8 p3^0 12. #define key_9 p3^1 13. #define key_a p3^2 14. #define key_b p3^3 15. #define key_c p3^4 16. #define key_d p3^5 17. #define key_e p3^6 18. #define key_f p3^7 19. code unsigned char seg7code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节 20. // 0 1 2 3 4 5 6 7 8 9 a b c d e f 21. {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; 22. void main( void ) 23. { 24. unsigned char i=0; //作为数组下标 25. p2 = 0xff; //p2作为输入,初始化输出高 26. p3 = 0xff; //p3作为输入,初始化输出高 27. while( 1 ) 28. { 29. if( key_0 == 0 ) i=0; if( key_1 == 0 ) i=1; 30. if( key_2 == 0 ) i=2; if( key_3 == 0 ) i=3; 31. if( key_4 == 0 ) i=4; if( key_5 == 0 ) i=5; 32. if( key_6 == 0 ) i=6; if( key_7 == 0 ) i=7; 33. if( key_8 == 0 ) i=8; if( key_9 == 0 ) i=9; 34. if( key_a == 0 ) i=0xa; if( key_b == 0 ) i=0xb; 35. if( key_c == 0 ) i=0xc; if( key_d == 0 ) i=0xd; 36. if( key_e == 0 ) i=0xe; if( key_f == 0 ) i=0xf; 37. sled = seg7code[ i ]; //开始时显示0,根据i取应七段编码 38. } 39. }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
尚居装饰有限公司怎么去啊,我要去那办事
VISA版龙卡家庭挚爱信用卡不可享有哪种权益?
我是青岛理工大学08级机械制造专业的研究生,
乐仁堂华林药房地址在什么地方,想过去办事
为民毛线店地址好找么,我有些事要过去
380V电接入空开的接法
上海市住房置业担保有限公司地址在哪,我要去
下列能证明海陆变迁的自然现象是BA. 远处驶来
四合地板地址在哪,我要去那里办事
丽音钢琴乐器培训中心地址在哪,我要去那里办
魔域血魂号一套攻击装40点属性满其实多少攻击
取消手机标注
进入lol游戏页面屏幕抖
汉王科技在上海浦东的旗舰店或是门店地址?
投资什么金融产品好
推荐资讯
意迪兰斯在什么地方啊,我要过去处理事情
次坞打面馆在什么地方啊,我要过去处理事情
50万房子首付多少
如何快速记住节奏拍打
为何人性这么肮脏
桦运国际旅行社我想知道这个在什么地方
笑笑公主地址在哪,我要去那里办事
()地提防
中国邮电工会蓬安县邮政局委员会地址在哪,我
是不是上海宝钢要搬迁了
図书馆へ勉强に行きます 这个句型 に前面可以
有没有谁知道这是哪个动漫啊? 腾讯视频上的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?