历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2020年01月30日 | 单片机按键扫描程序和显示程序及延时程序解析

2020-01-30 来源:elecfans

//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。

//最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25)

//无按键按下的时候显示FF

//按键跟按键的扫描结果满足如下关系:

//按键扫描结果(result)按键扫描结果

单片机按键扫描程序和显示程序及延时程序解析
 

//K100XE7K180XB7

//K110XEBK190XBB

//K120XEDK200XBD

//K130XEEK210XBE

//K140XD7K220X77

//K150XDBK230X7B

//K160XDDK240X7D

//K170XDEK250X7E

#include//包含 单片机 内部资源预定义

__CONFIG(0x1832);

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

intresult;

voiddelay();//delay函数申明

voidinit();//I/O口初始化函数申明

voidsCAN();//按键扫描程序申明

voiddisplay(intx);//显示函数申明

//---------------------------------------------------

//主程序

voidmain()

{

while(1)//循环工作

{

init();//调用初始化子程序

scan();//调用按键扫描子程序

display(result);//调用结果显示子程序

}

}

//---------------------------------------------------

//初始化函数

voidinit()

{

ADCON1=0X07;//设置A口为普通I/O口

TRISA=0X0f;//设置A口高2位为输出,低4位为输入

TRISC=0XF0;//设置C口高4位为输入,低4位为输出

TRISD=0X00;//设置D口为输出

PORTA=0XFF;

PORTD=0XFF;//先清除所有显示

}

//---------------------------------------------------

//按键扫描程序

voidscan()

{

PORTC=0XF7;//C3输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)?

{

result=result|0x07;//否,加上低4位0x07,做为按键扫描的结果

}

else//是,改变低4位输出,重新判断是否有按键按下

{

PORTC=0XFb;//C2输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)

{

result=result|0x0b;//否,加上低4位0xb,做为按键扫描的结果

}

else//是,改变低4位输出,重新扫描

{

PORTC=0XFd;//C1输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)

{

result=result|0x0d;//否,加上低4位0x0d,做为按键扫描的结果

}

else//是,改变低4位的输出,重新扫描

{

PORTC=0XFe;//C0输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高四位是否为全1(全1代表没有按键按下)

{

result=result|0x0e;//否,加上低4位0x0e,做为按键扫描的结果

}

else//是,全部按键扫描结束,没有按键按下,置无按键按下标志位

{

result=0xff;//扫描结果为0xff,做为没有按键按下的标志

}

}

}

}

}

//----------------------------------------------------------

//显示程序

voiddisplay(intx)

{

switch(result)

{

case0xe7:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;//K10

case0xeb:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;//K11

case0xed:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;//K12

case0xee:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;//K13

case0xd7:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;//K14

case0xdb:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;//K15

case0xdd:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X82;PORTA=0X1F;delay();break;//K16

case0xde:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0XF8;PORTA=0X1F;delay();break;//K17

case0xb7:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X80;PORTA=0X1F;delay();break;//K18

case0xbb:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X90;PORTA=0X1F;delay();break;//K19

case0xbd:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;//K20

case0xbe:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;//K21

case0x77:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;//K22

case0x7b:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;//K23

case0x7d:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;//K24

case0x7e:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;//K25

case0xff:

PORTD=0x8e;PORTA=0X2F;delay();PORTD=0x8e;PORTA=0X1F;delay();//无按键按下

}

}

//------------------------------------------------------------------

//延时程序

voiddelay()//延时程序

{

inti;//定义整形变量

for(i=0x100;i--;);//延时

}

推荐阅读

史海拾趣

Daito Communication Apparatus Co Ltd公司的发展小趣事

自1948年成立以来,Daito公司一直致力于电子元器件的研发与生产。在公司的早期阶段,他们意识到保险丝在电子设备中的重要性,并决定投入大量资源进行研发。经过数年的努力,Daito公司成功开发出了高精度报警保险丝,这一创新产品凭借其卓越的性能和可靠性,迅速在市场上获得了认可。

高精度报警保险丝的成功并没有让Daito公司停止创新的步伐。他们不断对保险丝的失效原因与寿命进行预测和分析,通过全面质量管理,使产品质量得到了显著的提高。同时,Daito公司还将各系列保险丝的额定值多层次化,以满足不同客户的需求,扩大了顾客的选择余地。

浙江凡华(FANHAR)公司的发展小趣事

随着微电子学的快速发展,电子设备对元器件的要求也越来越高。Daito公司敏锐地捕捉到了这一市场趋势,决定对保险丝进行进一步的创新。在1995年,他们成功开发出了适用于电路板安装的高精度小型报警保险丝。这一产品的推出,不仅满足了市场对小型化、高精度保险丝的需求,也进一步巩固了Daito公司在电子行业中的领先地位。

随后,Daito公司又针对微电子学的进一步发展,推出了可以连续自动安装的方形微型保险丝。这一产品的推出,大大提高了生产效率,降低了成本,同时也为客户提供了更加便捷的使用体验。近年来,随着面安装技术的兴起,Daito公司又迅速推出了适用于面安装技术的片状保险丝,再次展示了他们在电子行业中的创新实力。

请注意,由于篇幅限制,以上仅为两个故事示例。如果需要更多故事,可以进一步深入研究和探索Daito公司在电子行业中的发展历程和创新实践。

Electronic公司的发展小趣事

华为,作为中国的科技巨头,其在电子行业的发展历程中展现出了强大的技术实力和全球视野。华为在通信领域取得了多项技术突破,如5G技术的领先和智能手机拍照技术的创新。同时,华为还积极拓展全球市场,与全球运营商建立了广泛的合作关系。然而,面对国际市场的复杂环境和竞争压力,华为也面临着诸多挑战和不确定性。

Analog Power公司的发展小趣事

为了进一步扩大市场份额,Analog Power公司积极寻求与行业内外的合作伙伴建立战略合作关系。他们与多家知名企业建立了紧密的合作关系,共同开发新产品、开拓市场。通过合作,Analog Power不仅获得了更多的市场资源和技术支持,也提升了自身的品牌影响力和竞争力。

Dantona Industries公司的发展小趣事

Dantona Industries非常重视人才的培养和团队建设。他们深知,一个优秀的团队是公司发展的基石。因此,公司投入大量资源用于员工培训、激励机制建设等方面。他们定期组织技术研讨会、团队拓展活动等,提升员工的业务能力和团队凝聚力。同时,公司还建立了完善的晋升机制和薪酬体系,确保员工能够享受到与公司共同成长的成果。这种以人为本的管理理念为公司的持续发展提供了有力保障。

AEL [AEL Crystals Ltd]公司的发展小趣事

随着业务的不断发展,AEL Crystals意识到全球化战略的重要性。公司开始在全球范围内寻找合适的生产基地,并在英国、日本、台湾、韩国等地区建立了生产基地网络。这一战略布局使得AEL Crystals能够更好地满足全球客户的需求,同时也降低了供应中断的风险。

问答坊 | AI 解惑

音频的基本知识

本文档主要包括: 第一部分 模拟声音-数字声音原理 第二部分 音频压缩编码 第三部分 和弦铃声格式 第四部分 单声道、立体声和环绕声第五部分 3D环绕声技术 第六部分 数字音频格式和数字音频接口…

查看全部问答>

语音识别芯片 声控芯片 LD3320 非特定人/单芯片/动态编辑识别列表 ICRoute

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 看看大家能用这个芯片设计制造出什么样好玩又实用的新产品。 :) # 单芯片,非特定人,动态编辑识别列表的识别芯片LD332X系列,可以用于所有的电子产品,只需要最简单的51作为控制芯片即可 ...…

查看全部问答>

上海逻迅:招聘单片机工程师

公司(上海逻迅信息科技有限公司)现处于创业阶段,招3-4个人(全职),不限学历,能把事情做好即可,欢迎有能力、有学习热情者加入公司。 1、熟悉数字、模拟电路 2、熟练使用一款PCB设计软件 3、熟练使用电子测试仪器 4、优先考虑: 掌握一定 ...…

查看全部问答>

交流输出单电容半桥式变压器开关电源(part1)开关电源原理与设计(连载36)

1-8-2-2.交流输出单电容半桥式变压器开关电源 图1-39是单电容半桥式变压器开关电源的工作原理图。这里的单电容是把图1-36中的上分压电容器C1或下分压电容器省掉了的意思,因此,图1-39的单电容半桥式变压器开关电源是相对于图1-36的双电容半桥式 ...…

查看全部问答>

基准源高了好还是低了好?

本信息来自合作QQ群:AVR单片机学习与交流群(17727270) 群管理员在坛子里的ID:铜河   昨天半夜醒了 突然想到个问题 基准源高了好还是低了好 …

查看全部问答>

求救:sed1335控制器320*240液晶显示地址问题

最近在研究430单片机控制lcd液晶显示的问题!可是对液晶控制器1335的资料却研究的不够透彻。关于分屏和每一屏地址的范围总是无法确定,导致图形字符重叠,或者显示不全!希望有高手能进来帮忙指点一下,或者给我留一个液晶开发的群号也可以,一起讨 ...…

查看全部问答>

各位有沒有PCI的DMA的資料,十分感謝。

如題,看了《Programming the Microsoft Windows Driver Model》第一版,還不如直接編程硬件呢。 不知大家有什么好資料,十分感謝。…

查看全部问答>

【问TI】uip 协议栈写LM3S8962以太网

请问一下 我用uip 协议栈写LM3S8962以太网 怎么让数据连续往上位机发送呢 我现在只能上位机发送一次数据 下位机才向上发送一次数据 我想上位机发送一次命令 下位机能连续发送数据 等到我发停止命令 下位机才停止发送 这个程序在原来的基础上什么改 ...…

查看全部问答>

MSP430程序升级方式探讨

MSP430程序升级方式探讨 作者、源出处未明,如知情者请通知我们;我们会及时更新。 对MSP430系列单片机进行编程的方式有以下三种:利用JTAG接口,利用BSL固件和利用用户自定义的升级固件。由于利用自定义升级固件进行程序升级的 ...…

查看全部问答>