📄 yi1.asm
字号:
;**************************************************************************
; 外贸彩灯 IC=PIC12F675
; WDT: ON
;**************************************************************************
Rcont0 equ 20h ;红灯脉宽计数器
Gcont0 equ 21h ;绿灯脉宽计数器
tcont_b equ 22h
Bcont0 equ 23h ;蓝灯脉宽计数器
Tcont_A equ 24h ;亮度长度计数器1
Tcont equ 25h ;亮度长度计数器2
Rcont_H equ 26h ;红灯高脉宽计数器
Rcont_L equ 27h ;红灯低脉宽计数器
Gcont_H equ 28h ;绿灯高脉宽计数器
Gcont_L equ 29h ;绿灯低脉宽计数器
Bcont_H equ 2ah ;红灯高脉宽计数器
Bcont_L equ 2bh ;红灯底脉宽计数器
W_cont EQU 2cH ;W保护寄存器
ad_cont equ 2dh ;AD数值寄存器
dcont equ 2eh ;状态计数器
dcont1 equ 2fh ;状态寄存器
status_cont equ 30h ;status保护寄存器
option_reg EQU 81H ;
GPIO equ 05h ;IO口
TRISIO EQU 85H ;IO口方向寄存器
ANSEL EQU 9FH
CMCON EQU 19H
;INTCON EQU 0BH
;PIR1 EQU 0CH
ADRESH EQU 1EH ;AD转换高位值
ADRESL EQU 9EH ;
;*******************************************************************
org 000h
goto star
org 004h
goto int_to ;中断入口
org 006H
star: ;主程序开始
;****** 初始化**************************************************
nop ;status 的第5位置0,以选择 BANK0 体
bsf INTCON,7 ;INTCON 的第7位,开全局中断
bsf INTCON, PEIE ;允许外部中断
clrf gpio ;清IO口
MOVLW 01H
MOVWF ADCON0 ;中断设置,0通道,格式为左对齐方式
movlw 07h
movwf CMCON ; 关比较器
clrwdt
MOVLW 200 ;亮度渐变时间寄存器赋值
MOVWF Tcont_a
movwf ad_cont
movlw 5 ;赋延时计数初值
movwf tcont
movlw 10
movwf Tcont_b
movlw 1
movwf Rcont_H
movlw 255
movwf Gcont_H
movlw 255 ;渐变延时寄存器 H为暗寄存器
movwf Bcont_H ;L为亮寄存器,254与1分别为极值
movlw 255 ;脉宽为255
movwf Rcont_L
movlw 1
movwf Gcont_L
movlw 1
movwf Bcont_L
;******************这一段可略去*********************
movlw 0
movwf dcont
movwf dcont1
btfss GPIO,1
goto r_L
movfw Rcont_H ;给脉宽计数器赋初值
movwf Rcont0
goto n1
r_L: movfw Rcont_L
movwf Rcont0
n1: btfss GPIO,4
goto g_L
movfw Gcont_H ;给脉宽计数器赋值
movwf Gcont0
goto n2
g_L: movfw Gcont_L
movwf Gcont0
n2: btfss GPIO,5
goto b_L
movfw bcont_H ;给脉宽计数器赋值
movwf bcont0
goto n3
b_L: movfw bcont_L
movwf bcont0
;**********************************
n3: bsf status,RP0 ;选择体BANK1
bsf PIE1,6 ;开AD中断
MOVLW 51h ;ad 0通道输入 16分
MOVWF ANSEL
movlw 11010010B ;
option ;定时模式
movlw 00001101b ;定义2,3,6脚为输出
movwf trisio
BCF STATUS,RP0 ;恢复0体
;******************** 初始化完;**********************************
mloop: btfss GPIO,2 ;判断5脚有无输入,
goto r_light ;5脚无输入 跳脉宽加减1处
btfss adcon0,1 ;5脚有输入,则查询AD转换是否进行
bsf adcon0,1 ;启动AD
decfsz Tcont,1 ;亮度长度计数器2减1,并判断是否减完
goto r_light ;未减完,跳脉宽加减1处
movlw 8 ;亮度长度计数器2减完,则延时计数器2赋值
movwf Tcont
decfsz Tcont_A ;亮度长度计数器1减1,并判断是否减完
goto r_light ;未减完,跳脉宽加减1处
movfw ad_cont
movwf Tcont_A ;AD寄存器送亮度长度计数器1
INCF dcont,1 ;状态计数器+1
MOVLW 255
subwf dcont,0 ;是否到254?
skpz
goto b1 ;否,则跳出,保持状态
movlw 00 ;是,状态计数器赋值,
movwf dcont
incf dcont1,1 ;指向下一状态
movlw 3 ;共三个状态,
subwf dcont1,0
skpz
goto b1
clrf dcont1 ;到时回到初始状态0
;*****************************************************
b1: movlw 0
subwf dcont1,0 ;判断是否为0状态
skpz ;否,跳下一状态判断
goto b2
movlw 1 ;红色指向下一亮度,以1为单位递减
addwf Rcont_H,1 ;高脉冲则加
subwf Rcont_L,1 ;亮度变化
addwf Gcont_L,1 ;;绿色指向下一亮度,以1为单位递增
subwf Gcont_H,1
movlw 0
subwf Rcont_L,0
btfss status,2 ;到设定值?
goto R_light
movlw 1
movwf Rcont_L ;调整,以避开跳跃闪烁
movwf Gcont_H
movlw 255
movwf Rcont_H
movwf Gcont_L
goto R_light
b2: movlw 1
subwf dcont1,0
skpz ;判断是否为1状态
goto b3 ;否,跳下一状态判断
movlw 1 ;绿色指向下一亮度,以1为单位递减
addwf Gcont_H,1 ;高脉冲加
subwf Gcont_L,1
addwf Bcont_L,1 ;蓝色指向下一亮度,以1为单位递增
subwf Bcont_H,1 ;亮度变化
movlw 0
subwf Gcont_L,0
btfss status,2 ;到设定值?
goto b3
movlw 1
movwf Gcont_L
movwf Bcont_H
movlw 255 ;调整,以避开跳跃闪烁
movwf Gcont_H
movwf Bcont_L
goto R_light
b3: movlw 2
subwf dcont1,0
skpz ;判断是否为2状态
goto r_light ;否,跳下一状态判断
movlw 1
addwf Rcont_L,1 ;红色指向下一亮度,以1为单位递增
subwf Rcont_H,1 ;亮度变化
addwf Bcont_H,1 ;蓝色指向下一亮度,以1为单位递减
subwf Bcont_L,1 ;亮度变化
movlw 0
subwf Rcont_H,0
btfss status,2
goto r_light
movlw 1
movwf Bcont_L
movwf Rcont_H ;调整,以避开跳跃闪烁
movlw 255
movwf Bcont_H
movwf Rcont_L
;***********************脉宽计数************************************************
r_light:
decfsz Rcont0,1 ;脉宽计数器减1
goto G_light
movlw 10h
xorwf GPIO,1 ;GPIO.4(3脚)取反
btfss GPIO,4 ;判断GPIO.4高低
goto gIO_L
movfw Rcont_H ;给脉宽计数器赋值
movwf Rcont0
goto G_light
gIO_L: movfw Rcont_L
movwf Rcont0
goto G_light
G_light:
decfsz Gcont0,1
goto B_light
movlw 20h
xorwf GPIO,1 ;GPIO.5(2脚)取反
btfss GPIO,5
goto ggO_L
movfw Gcont_H ;给脉宽计数器赋值
movwf Gcont0
goto B_light
ggO_L: movfw Gcont_L
movwf Gcont0
goto b_light
B_light:
decfsz Bcont0,1
goto out
movlw 02h
xorwf GPIO,1 ;GPIO.1(6脚)取反
btfss GPIO,1
goto gBO_L
movfw bcont_H ;给脉宽计数器赋值
movwf bcont0
goto out
gBO_L: movfw bcont_L
movwf Bcont0
out: clrwdt
goto mloop
;*******************AD中断程序*********************************
int_to: movwf w_cont ;保护W status
movfw status
movwf status_cont
ad: btfss PIR1,adif
goto g_ret
bcf pir1,adif
movf adresh,w ;共十位,只取高八位adresh,舍去低二位adresl,
addlw 15 ;加十调整, 避免值为零
movwf ad_cont
g_ret: ;乘2放大
movfw status_cont ;恢复 W,status
movwf status
movfw w_cont
retfie
;*****************************************************************
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -