⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yi1.asm

📁 PIC12F675,控制三基色LED,使之变化.
💻 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 + -