当前位置:首页 > 单片机 > 单片机
[导读]作为一个简单实用的示例,图1中的电路利用一个8位PIC微控制器控制一个4位LED显示器,显示出按下了哪个按钮。当任意按钮被按下时,比较器中断程序会立即作出响应。

作为一个简单实用的示例,图1中的电路利用一个8位PIC微控制器控制一个4位LED显示器,显示出按下了哪个按钮。当任意按钮被按下时,比较器中断程序会立即作出响应。该程序会在VREF值之间进行循环,直至比较器输出COUT返回高电平,表明该按钮被按下。完整注释的汇编程序源代码总共不到100字。该代码并未作过度优化,从而可方便理解或易于转化到其他控制器上。

 

汇编程序源代码:

; MULTIBTN.ASM: sensing upto 15 pushbuttons with one I/O (pin6: GP1/CIN-)

; BENABADJI Noureddine - ORAN - Dec. 11...14th, 2013

;

Errorlevel -302 ; avoid warning #302: Register in operand not in bank0.

; Ensure that bank bits are correct.

List P = 12F683

#include "p12f683.inc"

__CONFIG _INTOSCIO&_MCLRE_OFF&_PWRTE_ON&_WDT_OFF&_FCMEN_OFF&_IESO_OFF&_BOD_ON&_CPD_OFF&_CP_OFF

#define LED1 GPIO, 0 ; output bit0 of the 4-bit binary LED display

#define LED2 GPIO, 2 ; output bit1 of the 4-bit binary LED display

#define LED3 GPIO, 4 ; output bit2 of the 4-bit binary LED display

#define LED4 GPIO, 5 ; output bit3 of the 4-bit binary LED display

;----------------------------- define variables ------------------------------

CBLOCK 0x20 ; bank0 = [0x20...0x7F] = 94 bytes

;delay

cnt1, cnt2, cnt3 ; counters

ENDC

;------------------------------------------------------------------------------

BANK0 macro

BCF STATUS, RP0 ; bank0

endm

;------------------------------------------------------------------------------

BANK1 macro

BSF STATUS, RP0 ; bank1

endm

;------------------------------------------------------------------------------

SIregGEval8b macro file, val, jmpOk ; if (file >= val) goto jmpOk ;

MOVLW val

SUBWF file, w ; w = file - val

BTFSC STATUS, C

GOTO jmpOk ; yes

endm

;/////////////////////////////////////////////////////////////////////////////

; MAIN PROGRAM

;/////////////////////////////////////////////////////////////////////////////

ORG 0x00 ; reset vector

GOTO Setup

ORG 0X04 ; interrupt vector

GOTO IntCmp

;/////////////////////////////////////////////////////////////////////////////

;-----------------------------------------------------------------------------

LEDsOFF

CALL Delay256ms

CLRF GPIO ; all LEDs off

RETLW 0

;-----------------------------------------------------------------------------

Delay256ms

CLRF cnt2

CLRF cnt1

NOP ; 1us

DECFSZ cnt1, f ; 1us

GOTO $-2 ; 2us => 4*256 = 1024 us, approx. 1 ms internal delay loop

DECFSZ cnt2, f ; approx. 256 ms external delay loop

GOTO $-4

RETLW 0

;/////////////////////////////////////////////////////////////////////////////

Setup

BANK1

CLRF TRISIO ; config. all I/O as outputs

BCF OPTION_REG, T0CS ; use pin5 as GP2, not TOCKI

CLRF ANSEL ; use all AN as digital I/O

BANK0

CLRF GPIO ; all LEDs off

MOVLW b'00000111'

MOVWF CMCON0 ;comparator off

splash ; (initial test for LEDs)

BSF LED1

CALL LEDsOFF

BSF LED2

CALL LEDsOFF

BSF LED3

CALL LEDsOFF

BSF LED4

CALL LEDsOFF

;;;;;;;;;;

initializeComparator

BANK1

MOVLW b'00001010' ;config. GP1 as input (will be CIN-)

MOVWF TRISIO

;BANK0

MOVLW b'10100001'

;BANK1

MOVWF VRCON ;Vref on, low range, VR=0001 => ratio = 1/24

BANK0

MOVLW b'00000100'

MOVWF CMCON0 ;comparator on: CIN- = GP1; CIN+ = Vref; Cout internal

;;;;;;;;;

;enable interrupt

BANK1

BSF INTCON, PEIE ; enable interrupt on Comparator trip

BSF PIE1, CMIE ; enable interrupt on Comparator trip

BANK0

BSF INTCON, GIE ; set general interrupt enable

goto $ ; infinite loop (waiting for an interrupt)

;-----------------------------------------------------------------------------

; Comparator trip interrupt routine

;-----------------------------------------------------------------------------

IntCmp

;don't need to save any context, only interrupting a goto $

BANK0

MOVLW .1

MOVWF cnt3

nextBtn

INCF cnt3, F

SIregGEval8b cnt3, .16, whichBtn ; if (cnt3 >= 16) goto whichBtn ;

MOVLW b'10100000'

ADDWF cnt3, W

BANK1

MOVWF VRCON ;Vref on, low range, VR=cnt3

BANK0

BTFSS CMCON0, COUT ; Cout == 1 ?

GOTO nextBtn

whichBtn

DECF cnt3, F

BTFSC cnt3, 0

BSF LED1

BTFSC cnt3, 1

BSF LED2

BTFSC cnt3, 2

BSF LED3

BTFSC cnt3, 3

BSF LED4

CALL LEDsOFF

endIntCmp

MOVLW b'10100001'

BANK1

MOVWF VRCON ;Vref on, low range, VR=0001 => ratio = 1/24

BANK0

BCF PIR1, CMIF ; clear comparator interrupt flag

RETFIE

;-----------------------------------------------------------------------------

 

END

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭