单片机EM78P156的I/O口复用技巧
发布时间:2008/5/27 0:00:00 访问次数:1036
0 引言
大多单片机设计中都需要很多的引脚来实现各种各样的输入检测和输出显示或控制功能。这在引脚数不能再增加的前提下。常常会显得引脚数不够。所以能否把芯片的固有资源发挥到极致,往往是决定此系统性价比的关键。本文借鉴软件操作系统的分时复用原理,来把任务分成多个时间片,在不同的时间片执行不同的任务。从而实现了较少i/o口的多功能控制。 1 em78p156n单片机的主要功能 em78p156n是台湾义隆公司推出的8位单片机,图1所示是该芯片的引脚排列图。该器件的主要功能如下: ◇工作电压:2.5~5.5 v; ◇工作温度范围:-40℃~85℃; ◇工作频率在晶振模式时的范围为:dc~20mhz(5v)、dc~8mhz(3v)和dc~4mhz(2.5v);而在外部rc振荡时的频率范围为:dc~4mhz (5v),dc~4 mhz(3v)和dc~4mhz(2.5v); ◇低功耗:工作在5v/4mhz时工作电流小于2ma,工作在3v/32khz时的工作电流20μa,工作在休眠模式时的工作电流1μa; ◇带有1k×13b程序空间; ◇具有双向i/o口; ◇有5级堆栈深度; ◇有8个可编程上拉脚,7个可编程下拉脚,8个可编程横漏极开路输入脚,2个可编程r-op-tion脚。 2 硬件电路的总体设计 本设计中控制电路的mcu部分如图2所示。图2中的单片机采用外部rc振荡,振荡频率为4mhz。其中led1~led6和按键k2、k3共用了p61~p65五个i/o口。在该电路设计时,要注意按键按下时不能影响led的正常点亮,所以在i/o口与按键之间串了一个2kω的电阻,这样即使按住按键不放。led也能正常点亮。每一路led灯的点亮须由两个i/o口同时控制,一路置高、一路置低,使led产生正向压降才能点亮。而其余的i/o口则作为正常的输入、输出控制。 3 程序流程 本文以按键输入、led输出为例,按键k2控制第一组led1~3做跑马灯变化,按键k3控制第二组led4~6做跑马灯变化,第一组与第二组灯中每次只能同时亮一个。这里的复用实际上是利用人眼的视觉暂留功能,实际led是闪烁的,只是人眼分辨不出来而已。每组灯点亮的周期为20ms,按键检测占用的时间为10μs左右,在这么短的时间内,人眼不可能察觉到led的变化。所以在实际电路设计中,显示和按键等人机接口部分的功能最容易实现分时复用。点亮led1与led4的i/o口的工作波形如图3所示。将按键检测的值送到keybuf中,并做20 ms的延时比较检测,主要是为了增加按键检测的可靠性。其程序逻辑如图4所示。 这里需要注意的是,在作为按键检测的时候,p6.2、p6.3、p6.4必须输出高电平,或者作为输入口打开内部上拉(如图3中的p6.2)。这样可以避免led在这时被点亮形成鬼影,而影响整个系统的显示效果。当然也可以将led驱动换成带三极管驱动的继电器。但因为继电器的吸合或断开需要几毫秒的响应过程,而按键检测所需的10μs时间绝对不足以让继电器发生状态跳变。 4 程序介绍 下面给出本系统的显示部分子程序: 下面是系统中的按键扫描部分子程序: 5 结束语 利用本文所介绍的方法复用后就能节省大量的i/o引脚。但设计时需要考虑输入和输出的隔离,而不能相互影响,并且即使输出对象允许在人眼无法察觉的情况下出现瞬间跳变,也不能不影响输出控制的效果。 | ||||||
0 引言
大多单片机设计中都需要很多的引脚来实现各种各样的输入检测和输出显示或控制功能。这在引脚数不能再增加的前提下。常常会显得引脚数不够。所以能否把芯片的固有资源发挥到极致,往往是决定此系统性价比的关键。本文借鉴软件操作系统的分时复用原理,来把任务分成多个时间片,在不同的时间片执行不同的任务。从而实现了较少i/o口的多功能控制。 1 em78p156n单片机的主要功能 em78p156n是台湾义隆公司推出的8位单片机,图1所示是该芯片的引脚排列图。该器件的主要功能如下: ◇工作电压:2.5~5.5 v; ◇工作温度范围:-40℃~85℃; ◇工作频率在晶振模式时的范围为:dc~20mhz(5v)、dc~8mhz(3v)和dc~4mhz(2.5v);而在外部rc振荡时的频率范围为:dc~4mhz (5v),dc~4 mhz(3v)和dc~4mhz(2.5v); ◇低功耗:工作在5v/4mhz时工作电流小于2ma,工作在3v/32khz时的工作电流20μa,工作在休眠模式时的工作电流1μa; ◇带有1k×13b程序空间; ◇具有双向i/o口; ◇有5级堆栈深度; ◇有8个可编程上拉脚,7个可编程下拉脚,8个可编程横漏极开路输入脚,2个可编程r-op-tion脚。 2 硬件电路的总体设计 本设计中控制电路的mcu部分如图2所示。图2中的单片机采用外部rc振荡,振荡频率为4mhz。其中led1~led6和按键k2、k3共用了p61~p65五个i/o口。在该电路设计时,要注意按键按下时不能影响led的正常点亮,所以在i/o口与按键之间串了一个2kω的电阻,这样即使按住按键不放。led也能正常点亮。每一路led灯的点亮须由两个i/o口同时控制,一路置高、一路置低,使led产生正向压降才能点亮。而其余的i/o口则作为正常的输入、输出控制。 3 程序流程 本文以按键输入、led输出为例,按键k2控制第一组led1~3做跑马灯变化,按键k3控制第二组led4~6做跑马灯变化,第一组与第二组灯中每次只能同时亮一个。这里的复用实际上是利用人眼的视觉暂留功能,实际led是闪烁的,只是人眼分辨不出来而已。每组灯点亮的周期为20ms,按键检测占用的时间为10μs左右,在这么短的时间内,人眼不可能察觉到led的变化。所以在实际电路设计中,显示和按键等人机接口部分的功能最容易实现分时复用。点亮led1与led4的i/o口的工作波形如图3所示。将按键检测的值送到keybuf中,并做20 ms的延时比较检测,主要是为了增加按键检测的可靠性。其程序逻辑如图4所示。 这里需要注意的是,在作为按键检测的时候,p6.2、p6.3、p6.4必须输出高电平,或者作为输入口打开内部上拉(如图3中的p6.2)。这样可以避免led在这时被点亮形成鬼影,而影响整个系统的显示效果。当然也可以将led驱动换成带三极管驱动的继电器。但因为继电器的吸合或断开需要几毫秒的响应过程,而按键检测所需的10μs时间绝对不足以让继电器发生状态跳变。 4 程序介绍 下面给出本系统的显示部分子程序: 下面是系统中的按键扫描部分子程序: 5 结束语 利用本文所介绍的方法复用后就能节省大量的i/o引脚。但设计时需要考虑输入和输出的隔离,而不能相互影响,并且即使输出对象允许在人眼无法察觉的情况下出现瞬间跳变,也不能不影响输出控制的效果。 | ||||||