大家好,我写一个程序碰到了点问提,希望大家能够帮我分析分析,,单片机型号是:台湾远翔(与EMC的153,PIC508是兼容的),,程序的功能我大概的说下吧,做的产品就是个手电筒,轻触开关第一次按下,LED爆闪(延时是100MS),第二次按下:LED快闪(延时是250MS),就这两种状态。
下面是源代码
TMR0 REG 01H
PHCON REG 0x0D
PDCON REG 0x0B
PCON REG 0x08
PCL REG 0x02
PORTB REG 0x06
IOSTB REG 0x06
ORG 000H
GOTO MAIN
org 0ah
;---------------------------------------------------------------------------------------------------
(PB.0为输入(低电平有效),.PB.1为输出(高电平有效),,其中PB.0带上拉)
MAIN:
MOVIA 00H
MOVAR PORTB ;B口初始化
; MOVIA 07H ;set 256 freg
; OPTION ;设预分频
MOVIA ffh ;关闭上下拉电阻
MOVAR PDCON
MOVIA feh ;允许P1.0上啦
MOVAR PHCON
MOVIA 01H ;设置B口为输出 P0.0为输入
IOST IOSTB
MOVIA 00H ;设置电源控制寄存器
MOVAR PCON
movia 0 ;按鍵次數標誌
movar 20h
movia 03
movar 21h ;按鍵的最高次數
movia 01 ;按鍵次數初始值
movar 23h
movia 02h ;
movar 24h
;--------------------------------------------------------------------------------------------------
call stata ;調用按鍵程序
ddd: Call lpz1
btrss portb,0 ;检测按键
hhhh: call yjq ;有键按下
goto ddd ;无键按下
;------------------------------------------------------------------------------------------------
;以下為按鍵掃描子程序
;------------------------------------------------------------------------------------------------
STATA: btrsc portb,0 ;判断是否有键按下
goto statA ;没就等待
yjq: CALL YS2 ;延时消斗
btrsc portb,0 ;判断是否有键按下
goto statA
incr 20h,1 ;有键按下 20H加1
movr 20h,0 ;20H->A
movar 22h ;A->22H 将按键值暂存22H (当前按键值与最高按键值比较)
movr 21h,0 ;21H->A 將按鍵最高次數存A中
subar 22h,1 22h-21h->22h;如果相减结果为0,则Z=1,反之相反
btrsc 03h,2 判断03H单元“Z”的状态
movia 1 ;当前按键与最高按键值相等,重赋值
movar 20h
lpz: btrss portb,0 ;檢測按鍵是否釋放
goto lpz ;鍵未放
RETFIE
;---------------------------------------------------------------------------------------------------
;;以下为按鍵識別子程序 (必要時可以開啟定時器掃描按鍵)
;---------------------------------------------------------------------------------------------------
lpz1: movr 20h,0 ;將当前的按鍵值先預存在3EH里
movar 3eh
movr 23h,0 ;23H->A
subar 3eh,1 ;判斷是否是第一次按鍵
btrsc 03h,2
call gn1 ;调用第一次按键的功能程序
movr 20h,0 ;將当前的按鍵值先預存在3FH里
movar 3Fh
movr 24h,0 ;24H->A
subar 3Fh,1 ;判斷是否是第二次按鍵
btrsc 03h,2
call gn2 ;调用第二次按键的功能程序
RETFIE
;---------------------------------------------------------------------------------
;以下是按鍵功能子程序
;---------------------------------------------------------------------------------
gn1: movia 02h ;按鍵1的功能程序
movar portb
call ys ;ys延時時間是100ms
movia 00h
movar portb
call ys
RETFIE
gn2: movia 02h ;按鍵2的功能程序
movar portb
call ys1 ;ys1延時時間是250ms
movia 00h
movar portb
call ys1
RETFIE
;-------------------------------------------------------------------------------------------------
;下面是延時子程序
;-------------------------------------------------------------------------------------------------
ys: movia 250 // 100MS延时
movar 30h
mm1: movia 100
movar 31h
mm: decrsz 31h,1 ;時間是100×2=200
goto mm
decrsz 30h,1 ;時間是250×2=500
goto mm1
RETFIE
YS1: movia 250 // 250MS延时
movar 2ah
zdhsq1: movia 250
movar 2bh
btrss portb,0
goto hhhh
zdhsq: decrsz 2bh,1 ;250*2=500
goto zdhsq
decrsz 2ah,1 ;25*2=500
goto zdhsq1
RETFIE
YS2: movia 25 //10MS延时
movar 2ch
wert: movia 100
movar 2dh
fsd: decrsz 2dh,1
goto fsd
decrsz 2ch,1
goto wert
RETFIE |