1、IO口复用用于按键和数码管显示1.在一些情况下单片机的IO口不够用,遇到IO口不够用的时候我们该怎么做呢,大家都能想到用芯片来扩展IO,或者用74HC595等来驱动数码管减少IO口的使用。今天,我告诉大家不用其他芯片就能实现按键和数码管显示公用IO口。2.废话不多说,先说原理图(其实电路也不是自己想到的,也是看到别人的),该电路只需用到普通PNP三极管(因为我用的是共阳极数码管)和二极管1N4148,原理图如下:3.其中,数码管阳极接的下拉电阻正常情况是不需要的,可以不知道为什么Protues中不接就不能正常显示。电路中有四个按键(也可添加更多的按键,理论上总的可以接8个),分别是S1、S2、
2、S3和S4。测试程序中,仿真开始显示数字”0”,按下S1则显示1,按下S2则显示2,以此类推。4.下面是程序,其中按键检测原理是借用吴鸿坚按键检测的思想。数码管显示就是普通的动态扫描,程序代码如下:#include typedef unsigned char uint8;typedef unsigned short int uint16;sbit SEG_A = P20;sbit SEG_B = P21;sbit SEG_C = P22;sbit SEG_D = P23;sbit KeyCom = P10; /按键公共端IOuint8 SegShow1;uint8 SegShow2;uint8
3、 SegShow3;uint8 SegShow4;#define KeyDelayTime 5uint8 KeyCode = 0;uint8 code Tab= /共阳极数码管段码 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, /“09“0xBF,0x8C,0xFF,0x88,0xAF /10“-“,11“P“,12“空“,13“A“,14“r“;void Key_Dispaly_Driver();void Timer0_Init() TMOD |= 0x01;TH0 = (65536-1000)/256; /定时1msTL0 = (65
4、536-1000)%256;EA = 1;ET0 = 1;TR0 = 1;void main() Timer0_Init();SegShow1 = 12;SegShow2 = 12;SegShow3 = 12;SegShow4 = 0;while(1) switch(KeyCode) case 1: SegShow4=1;KeyCode = 0;break;case 2: SegShow4=2;KeyCode = 0;break;case 3: SegShow4=3;KeyCode = 0;break;case 4: SegShow4=4;KeyCode = 0;break;void Time
5、r0_Isr() interrupt 1 TF0 = 0;TR0 = 0;Key_Dispaly_Driver();TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;TR0 = 1;void Key_Dispaly_Driver() /按键检测和数码管显示放一起 static uint8 num=0; /顺序扫描static uint8 Key1TimeCont=0;/key1去抖延时计数static uint8 Key2TimeCont=0;/key2去抖延时计数static uint8 Key3TimeCont=0;/key3去抖延时计数stati
6、c uint8 Key4TimeCont=0;/key4去抖延时计数static uint8 KeyLock=0;switch(num) case 0: SEG_A = 0;P0 = TabSegShow1;break;case 1: SEG_A = 1;P0 = 0xFE;break;case 2: SEG_B = 0;P0 = TabSegShow2;break;case 3: SEG_B = 1;P0 = 0xFD;break;case 4: SEG_C = 0;P0 = TabSegShow3;break;case 5:SEG_C = 1;P0 = 0xFB;break;case 6:
7、 SEG_D = 0;P0 = TabSegShow4;break;case 7: SEG_D = 1;P0 = 0xF7;break;if(KeyCom=1)/判断无按键按键,解锁 KeyLock = 0;else if(KeyLock=0 /计数if(Key1TimeContKeyDelayTime)/计数大于去抖时间 Key1TimeCont = 0; /计数清零,下次好用KeyLock = 1; /自锁KeyCode = 1; /按键值为1/*其他按键同上*/else if(KeyLock=0if(Key2TimeContKeyDelayTime) Key2TimeCont = 0;K
8、eyLock = 1;KeyCode = 2;else if(KeyLock=0if(Key3TimeContKeyDelayTime) Key3TimeCont = 0;KeyLock = 1;KeyCode = 3;else if(KeyLock=0if(Key4TimeContKeyDelayTime) Key4TimeCont = 0;KeyLock = 1;KeyCode = 4;num+;if(num7)num = 0;结束语:上面程序有些已经注释了,本人也是看到公司的一个蒸汽流量计的显示电路就是用此电路来实现数码管和按键公用IO口。所以自己就编了个程序来实现其键盘和显示的功能,如有不对的地方,还望指正。本人是菜鸟,一直很喜欢电子,虽然现在从事的不是这方面的工作。