按鍵觸發(fā)的1位累加器
;按鍵S3觸發(fā)累加計數(shù)顯示0---9的數(shù)碼管程序
;使用資源
;1、PORTA口,做為6位數(shù)碼管的位選信號
;2、PORTB口,在此只利用了RBO口做按鍵輸入
;3、PORTC口,7段數(shù)碼管的段信號
;功能說明
;1、該程序的功能是把演示板當做一個按鍵計數(shù)器。接通電源時,按下IDE軟軟件的運行鍵6只數(shù)碼管全顯示000000。
;每按下開關S3(RB0)時,計數(shù)器的值加1,數(shù)碼管顯示也增加1,然后松開按鈕;以些類推,反復循環(huán)。
;2、程序中包含按鍵按下檢測跟釋放檢測,并且都伴有一定的延時去抖功能,只有在一次按鍵被釋放后才進行第2次按鍵的判斷
;3、程序中需開啟B口的內部弱上拉功能,因DEMO板上無上拉電阻;并把A口全部設置為普通I/O口,上電復位后A口為模擬輸入口。
;硬件連接
;1、DEMO實驗板作以下設置 s1拔到0FF,S13除拔碼開關1為ON外其余的全拔到OFF
;2、S4,S5全部拔到ON LCD不要插在演示板上
;程序文件名“count.ASM"
;程序清單如下:
;**************************************************
__CONFIG 3F39H;設置配置位中振蕩方式為XT,其它全部禁止或關閉
;*************************************************
PCL equ 2h ;定義寄存器PCL的地址為02H
status equ 3h ;定義狀態(tài)寄存器地址
porta equ 5h ;定義端口A的數(shù)據(jù)寄存器地址
portb equ 6h ;定義端口B的數(shù)據(jù)寄存器地址
portc equ 7h ;定義端口C的數(shù)據(jù)寄存器地址
trisa equ 85h ;定義端口A的方向控制寄存器地址
trisb equ 86h ;定義端口B的方向控制寄存器地址
trisc equ 87h ;定義端口C的方向控制寄存器地址
option_reg equ 81h
adcon1 equ 9fh ;ADC控制寄存器1
;**************************************************
data1 equ 20h ;定義一個廷時變量寄存器
data2 equ 21h ;定義另一個廷時變量寄存器
n1 equ d'13' ;定義一個外層循環(huán)廷時常數(shù)
n2 equ 0ffh ;定義一個內層廷時常數(shù)
rp0 equ 5 ;定義狀態(tài)寄存器的頁選位RP0
z equ 2 ;定義0標志位位地址
;********************************************** ***
wang equ 22h ;定義顯示寄存器的地址
yan equ 23h ;定義計數(shù)寄存器的地址
;*************************************************
org 000h ;定義程序存放區(qū)域的起始地址
nop ;放置一條ICD必須的空操作指令
goto main
main bsf status,rp0 ;設置文件寄存器體1
movlw 00h ;將端口C的方向控制碼00H先送W
movwf trisa ;再轉到方向寄存器,將其設置為輸出
movwf trisc ;設置C口為輸出
movlw 0ffh ;同理,將端口B設置為輸入
movwf trisb
clrf option_reg ;開起內部弱上拉
movlw 06h
movwf adcon1 ;設置A口為普通的數(shù)字口
bcf status,rp0 ;恢復到文件寄存器體0
clrf porta ;使PORTA輸出為低電平,讓所有數(shù)碼管共陽極都為高電平
loop1 movlw .10
movwf yan ;設置循環(huán)值10
movlw 00h
movwf wang ;送初值00H到wang顯示寄存器
loop2
movf wang,0
subwf yan,0 ;判斷是否到了顯示數(shù)值“9”
btfsc status,z ;全亮則返回loop1重新給yan,wang賦值為0
goto loop1
movf wang,0 ;否則繼續(xù)調用顯示程序
call CHABIAO ;調用數(shù)碼段顯示程序
movwf portc
;-----------------------------------------------------------------------------
;測試按鍵與否,以及如按下鍵則寄存器wang的數(shù)據(jù)加1
;-----------------------------------------------------------------------------
check btfsc portb,0 ;測試S3按下否?是!跳過下條指令
goto check ;否!則循環(huán)檢測
call delay ;調用廷時子程序,消除按鈕抖動的影響
btfsc portb,0 ;再次測試S3按下否?是!跳過下條指令
goto check ;否!則循不檢測
incf wang,1 ;寄存器wang的數(shù)據(jù)寄存器加1
check1 btfss portb,0 ;測試S3斷開否?是!跳過下條指令
goto check1 ;否!則循不檢測
call delay ;調用廷時子程序,消除按鈕抖動的影響
btfss portb,0 ;再次測試S3斷開否?是!跳過下條指令
goto check1 ;否!則循不檢測
goto loop2 ;返回
;*************10MS廷時子程序************************
delay ;子程序名,也是子程序入口地址
movlw n1 ;將外層循環(huán)參數(shù)值送到DATA1
movwf data1
lp0 movlw n2 ;將內層循環(huán)參數(shù)值送到DATA2
movwf data2
lp1 decfsz data2,1 ;變量DATA2內容遞減,若為0則跳躍
goto lp1 ;跳轉到LP1
decfsz data1,1 ;變量DATA1內容遞減,若為0則跳躍
goto lp0 ;跳轉到LP0
return ;返回主程序
;***********共陽數(shù)碼管查表子程序***************
CHABIAO ;取數(shù)碼管段碼
ADDWF PCL,1 ;地址偏移量加當前PC
RETLW 0C0H ;0
RETLW 0F9H ;1
RETLW 0A4H ;2
RETLW 0B0H ;3
RETLW 99H ;4
RETLW 92H ;5
RETLW 82H ;6
RETLW 0F8H ;7
RETLW 80H ;8
RETLW 98H ;9
;-----------------------------------------------------------------------------
END ;源程序結束
;-----------------------------------------------------------------------------
; 進入該實戰(zhàn)演練的工序流程如下:
; 1.創(chuàng)建源文件和編輯源文件;在此介紹一種不同于前面講的創(chuàng)建源文件的方法,用Windows附件中的”記事本”
; 這個為大家所熟知和好用的文件編輯器,并且可以方便的加入中文注釋.不過有兩點需要注意,一是注釋前面的
; 分號”;”必須用西文半角輸入;二是必須用”.asm”擴展名存儲到事先建立的一個專用子目錄下.
; 2.打開MPLAB集成開發(fā)環(huán)境:首先在WINDOWS環(huán)境下,選用開始>程序>Microchip MPLAB>MPLAB命令,啟動MPLAB
; 并進入MPLAB的桌面.
; 3.創(chuàng)建項目:選用菜單File>New或Project>New Project,在事先建立的一個專用子目錄下創(chuàng)建一個新項目,將
; 用記事本創(chuàng)建的源文件加入到該項目中.
; 4.建立項目中的目標文件:選擇菜單Project >Build All(項目>建立所有文件),MPLAB將自動調用MPASM將項目
; 文件管理下的源文件(.asm)匯編成十六進制的目標文件(.hex).