单片机IO口复用

单片机IO口复用

ID:43844279

大小:205.86 KB

页数:5页

时间:2019-10-15

单片机IO口复用_第1页
单片机IO口复用_第2页
单片机IO口复用_第3页
单片机IO口复用_第4页
单片机IO口复用_第5页
资源描述:

《单片机IO口复用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、IO口复用用于按键和数码管显示1.在一些情况下单片机的IO口不够用,遇到IO口不够用的时候我们该怎么做呢,大家都能想到用芯片来扩展IO,或者用74HC595等来驱动数码管减少IO口的使用。今天,我告诉大家不用其他芯片就能实现按键和数码管显示公用IO口。2.废话不多说,先说原理图(其实电路也不是自己想到的,也是看到别人的),该电路只需用到普通PNP三极管(因为我用的是共阳极数码管)和二极管1N4148,原理图如下:3.其中,数码管阳极接的下拉电阻正常情况是不需要的,可以不知道为什么Protues中不接就不能正常显示。电路中有四个按键(也可添加更多的按键

2、,理论上总的可以接8个),分别是S1、S2、S3和S4。测试程序中,仿真开始显示数字”0”,按下S1则显示1,按下S2则显示2,以此类推。4.下面是程序,其中按键检测原理是借用吴鸿坚按键检测的思想。数码管显示就是普通的动态扫描,程序代码如下:#includetypedefunsignedcharuint8;typedefunsignedshortintuint16;sbitSEG_A=P2^0;sbitSEG_B=P2^1;sbitSEG_C=P2^2;sbitSEG_D=P2^3;sbitKeyCom=P1^0;//按键公共端IO

3、uint8SegShow1;uint8SegShow2;uint8SegShow3;uint8SegShow4;#defineKeyDelayTime5uint8KeyCode=0;uint8codeTab[]=//共阳极数码管段码{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,//"0~9"0xBF,0x8C,0xFF,0x88,0xAF//10"-",11"P",12"空",13"A",14"r"};voidKey_Dispaly_Driver();voidTimer0_Init(){TMOD

4、

5、=0x01;TH0=(65536-1000)/256;//定时1msTL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;}voidmain(){Timer0_Init();SegShow1=12;SegShow2=12;SegShow3=12;SegShow4=0;while(1){switch(KeyCode){case1:SegShow4=1;KeyCode=0;break;case2:SegShow4=2;KeyCode=0;break;case3:SegShow4=3;KeyCode=0;break;case4:Se

6、gShow4=4;KeyCode=0;break;}}}voidTimer0_Isr()interrupt1{TF0=0;TR0=0;Key_Dispaly_Driver();TH0=(65536-1000)/256;TL0=(65536-1000)%256;TR0=1;}voidKey_Dispaly_Driver()//按键检测和数码管显示放一起{staticuint8num=0;//顺序扫描staticuint8Key1TimeCont=0;//key1去抖延时计数staticuint8Key2TimeCont=0;//key2去抖延时计数st

7、aticuint8Key3TimeCont=0;//key3去抖延时计数staticuint8Key4TimeCont=0;//key4去抖延时计数staticuint8KeyLock=0;switch(num){case0:SEG_A=0;P0=Tab[SegShow1];break;case1:SEG_A=1;P0=0xFE;break;case2:SEG_B=0;P0=Tab[SegShow2];break;case3:SEG_B=1;P0=0xFD;break;case4:SEG_C=0;P0=Tab[SegShow3];break;case

8、5:SEG_C=1;P0=0xFB;break;case6:SEG_D=0;P0=Tab[SegShow4];break;case7:SEG_D=1;P0=0xF7;break;}if(KeyCom==1)//判断无按键按键,解锁{KeyLock=0;}elseif(KeyLock==0&&num==1)//如果按下的是Key1{Key1TimeCont++;//计数if(Key1TimeCont>KeyDelayTime)//计数大于去抖时间{Key1TimeCont=0;//计数清零,下次好用KeyLock=1;//自锁KeyCode=1;//按

9、键值为1}}/******其他按键同上********/elseif(KeyLock==0&&num==3)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。