利用单个PIC输入监控15个触点

发布者:码梦小子最新更新时间:2015-03-06 来源: 21ic关键字:PIC微控制器  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[page]

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

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

关键字:PIC微控制器  LED显示器  汇编 引用地址:利用单个PIC输入监控15个触点

上一篇:Microchip推出行业首款两个独立闭环通道的8位PIC MCU
下一篇:基于单片机的数字涡街流量计设计方案

推荐阅读最新更新时间:2024-03-16 13:54

图解在keil中的c程序加入汇编语句
  在C51编程中,有时控制一些器件时,需要较强实时性,这时有必要在其中嵌入ASM语句,关于嵌入的方法众多,网上也可以找到相关说明,不过说得并不详细,这里结合本人调试18B20测温程序来说说如何在C中嵌入ASM语句。(题外话:18B20完全用C来写也可以的,这里仅只是作个示范) 看下图,在我们一般建立好的项目文件里,加上C51S.LIB文件。   此主题相关图片如下:   然后,点选我们写好的C程序,点右键,按下面操作进行。   此主题相关图片如下:   此主题相关图片如下:   跟着,我们在程序中建一个函数,里面嵌入ASM语句,在开始和结束,加上这两行,这样中间就可以写ASM语句。   此主题相关图片如下:
[单片机]
图解在keil中的c程序加入<font color='red'>汇编</font>语句
basic语言与汇编语言混合编程---电子手表
这是一个外国网站的程序,在bascom avr平台采用basic语言与汇编语言混合编程。下载回来对其进行部分改造: 去掉lcd16x4液晶改用流行的oled屏仿真。 增加中文设置提示。 注意:源程序是用Bascom-Avr-1.11.9.1编写的,在新版Bascom-Avr须在非汇编块中的汇编指令前增加“!”字符 $regfile = m8def.dat $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 8000000 Config Portb.1 = Output '一个引脚配置为LED输出 '*********
[单片机]
basic语言与<font color='red'>汇编</font>语言混合编程---电子手表
PIC10F202单片机制作两路开关源程序
//=======================================用户配置区,供用户修改=========================================== #define TIME2 1000 //长按键时间设置,单位ms ,1000 = 1s 范围:1~10s //========================================================================================================= //************************************
[单片机]
固态继电器在PIC单片机控制的多回路温度检测系统的应用
1.引言 对于塑料制瓶工艺, 塑料加热处于溶融状态, 经高压注射成为管胚, 短时间冷却以后, 经过高压空气的吹胀, 在制瓶模具中成型。其工艺特点之一是: 溶融状态下的塑料定时流动; 成为管胚之后, 将与外部空气接触 2 秒钟时间左右, 产品质量不可避免地受到环境温度的影响。 制瓶工艺要求在不同的制瓶过程中, 恒定在不同的温度下, 其温度控制是制瓶的关键技术之一。目前这种设备的温度控制装置通常采用单回路的通用温度控制仪表, 温度控制无法与工艺过程直接产生联系, 使得温度控制达不到最优状态, 而且受到环境温度的影响, 必须随环境温度的变化调整温度控制参数, 否则产品质量受到影响。另一方面, 单回路的通用温度控制仪表价格也比较高, 且
[单片机]
固态继电器在<font color='red'>PIC</font><font color='red'>单片机</font>控制的多回路温度检测系统的应用
PIC16位单片机CAN(3)串口详解(232)
--------------------------------- 串口的引脚定义: 9芯 信号方向来自 缩写 描述 1 调制解调器 CD 载波检测 2 调制解调器 RXD 接收数据 3 PC TXD 发送数据 4 PC DTR 数据终端准备好 5 GND 信号地 6 调制解调器 DSR 通讯设备准备好 7 PC RTS 请求发送 8 调制解调器 CTS 允许发送 9 调制解调器 RI 响铃指示器 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。 --------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离是50英尺 2)RS232可做到
[单片机]
<font color='red'>PIC</font>16位<font color='red'>单片机</font>CAN(3)串口详解(232)
GCC中的内嵌汇编语言
一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。 写这篇文章的主要信息来源是GNU的两个info文件:as.info和gcc.info,如果你觉得这篇文章中的介绍还不够详细的话,你可以查阅这两个文件。当然,直接查阅这两个文件可以获得更加权威的信息。如果你不想被这两篇文档中的一大堆信息搞迷糊的话,我建议你先阅读一下这篇文章,然后在必要
[单片机]
单片机计数器计数脉冲检测汇编程序
4位数码管用2个573接到p0口,位选p2 段选P0口,电路详见单片机开发板的原理图: 点这里 采用定时器来记录脉冲 并用数码管输出 以下是源代码: ;********51hei单片机 计数脉冲检测汇编程序,数码管显示脉冲的的次数 ********************************** ORG 0000H JMP MAIN ORG 000BH JMP TT0 ORG 001BH JMP TT1 MOV 23H,#300 MOV 20H,#00H MOV SP,70H ;============================
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved