打印

单片机写的8421拨码开关(四个两位数)

[复制链接]
3811|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两位的8421拨码开关接到PORTB口,两位一组公共端接在一起,四个公共端分别接PORTD,6/PORTD,5/PORTD,4/PORTC,4/分别命名为
PTIME    /RESTM   /IHJ       /HJTM      /
读取一个的时候很简单
BSF IHJ
MOVF PORTB, W
MOVWF IHBUF

读取四个的时候
BCF PTIME
BCF RESTM
BCF IHJ
BSF HJTM
MOVF PORTB, W
CALLBCDCHB;BCD码转换为二进制码
MOVWF HJBUF  ;焊接时间
CALL DELAY1;延时1ms
BCF HJTM  
BCF RESTM
BCF IHJ
BSF PTIME
MOVF PORTB, W
MOVWF PRBUF  ;预压时间
CALL DELAY1
BCF HJTM  
BCF PTIME
BCF IHJ
BSF RESTM
MOVF PORTB, W
MOVWF RSBUF  ;休止时间
CALL DELAY1
BCF HJTM  
BCF PTIME
BCF RESTM
BSF IHJ
MOVF PORTB, W
CALL BCDCHB
MOVWF IHBUF  ;焊接电流
CALL DELAY1
;********************BCDCHB********************
;本程序实现单字节压缩BCD码转化为二进制数。
;入口参数:原BCD码数在W中。
;出口参数:结果在W中。
;占用资源:W,STATUS,一重堆栈。
;该子程序取自一位高手的。
BCDCHB BANK0
            MOVWF R2
            SWAPF      R2, W
            ANDLW       0FH
            MOVWF       R3
            MOVLW       0FH
            ANDWF       R2,F       ;去掉高位
            BCF         C
            RLF         R3,0     ;高位乘以2
            RLF         R3,1
            RLF         R3,1
            RLF         R3,1     ;乘以8
            ADDWF       R3,W
            ADDWF       R2,F      
            MOVF R2, W
            RETURN

相关帖子

沙发
weimao228|  楼主 | 2011-3-23 09:44 | 只看该作者
不知道谁看出错误来没,酱草酱草哦。

使用特权

评论回复
板凳
weimao228|  楼主 | 2011-3-24 10:40 | 只看该作者
听高手说了,是由于延时时间不够。也就是说延时CALL DELAY10摆放位置不正确。下面是正确的程序。
        ;读各拨码开关的值
        BCF        PTIME
        BCF        RESTM
        BCF        IHJ
        BSF        HJTM
        CALL        DELAY10
        BCF        HJTM       
        MOVF        RB,        W
        CALL        BCDCHB
        MOVWF        HJBUF         ;焊接时间
        CALL        DELAY10
        BCF        HJTM        
        BCF        RESTM
        BCF        IHJ
        BSF        PTIME
        CALL        DELAY10
        BCF        PTIME
        MOVF        RB,        W
        CALL        BCDCHB
        MOVWF        PRBUF         ;预压时间
        CALL        DELAY10
        BCF        HJTM        
        BCF        PTIME
        BCF        IHJ
        BSF        RESTM
        CALL        DELAY10
        BCF        RESTM       
        MOVF        RB,        W
        CALL        BCDCHB
        MOVWF        RSBUF         ;休止时间
        CALL        DELAY10
        BCF        HJTM        
        BCF        PTIME
        BCF        RESTM
        BSF        IHJ
        CALL        DELAY10
        BCF        IHJ       
        MOVF        RB,        W
        CALL        BCDCHB
        MOVWF        IHBUF                ;焊接电流
        CALL        DELAY10

DELAY10
        MOVLW        .33
        MOVWF        TM0
        DECFSZ        TM0,        1
        GOTO        $-1       
        RETURN
;********************BCDCHB********************
;本程序实现单字节压缩BCD码转化为二进制数。
;入口参数:原BCD码数在W中。
;出口参数:结果在W中。
;占用资源:W,STATUS,一重堆栈。
;该子程序取自一位高手的。
BCDCHB BANK0
            MOVWF R2
            SWAPF      R2, W
            ANDLW       0FH
            MOVWF       R3
            MOVLW       0FH
            ANDWF       R2,F       ;去掉高位
            BCF         C
            RLF         R3,0     ;高位乘以2
            RLF         R3,1
            RLF         R3,1
            RLF         R3,1     ;乘以8
            ADDWF       R3,W
            ADDWF       R2,F      
            MOVF R2, W
            RETURN
好长的程序。新的品,不知道有更好的吗?这是我的第一份工作要做的,恩。等大家来评判哈。

使用特权

评论回复
地板
weimao228|  楼主 | 2011-3-24 13:18 | 只看该作者
]就是这种8421拨码开关

使用特权

评论回复
5
weimao228|  楼主 | 2011-4-12 12:55 | 只看该作者
用PICC书写:
                RC7=0;
                RC6=0;
                RC5=0;
                RC4=1;
                RD7=0;
                RD6=0;
                RD5=0;
                RD4=0;
                DELAY1();
                FGTM=PORTB;
                BCDCHB(FGTM);

                RC7=0;
                RC6=0;
                RC5=1;
                RC4=0;
                RD7=0;
                RD6=0;
                RD5=0;
                RD4=0;
                DELAY1();
                HOTM=PORTB;
                BCDCHB(HOTM);       
void DELAY1(void)
{
        int        k;
        for(k=0;k<=200;k++);
}
void BCDCHB(int a)
{
        int tmp;
        tmp=a;
        a=a&0xf0;
        a=a*10;
        a=a+tmp;
}

使用特权

评论回复
6
weimao228|  楼主 | 2011-4-13 10:00 | 只看该作者
5楼书写错误:正确的应该是这样的。
void DELAY1(void)
{
int        k;
for(k=0;k<=200;k++);
}

void BCDCHB(char  a)
{
char   tmp;
tmp=a;
a=a&0xf0;
a=(a>>4)*10;
a=a+(tmp&0x0f);
BUF=a;
}

//读顶锻时间
RC7=0;//RC7-4;RD7-4是拨码开关的公共端。
RC6=0;
RC5=0;
RC4=1;
RD7=0;
RD6=0;
RD5=0;
RD4=0;
DELAY1();
FGTM=PORTB;
BCDCHB(FGTM);       
FGTM=BUF;
//读值
RC7=0;
RC6=0;
RC5=1;
RC4=0;
RD7=0;
RD6=0;
RD5=0;
RD4=0;
DELAY1();
HOTM=PORTB;
BCDCHB(HOTM);       
HOTM=BUF;
//读值
RC7=0;
RC6=1;
RC5=0;
RC4=0;
RD7=0;
RD6=0;
RD5=0;
RD4=0;
DELAY1();
IBAK=PORTB;
BCDCHB(IBAK);
IBAK=BUF;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

60

帖子

1

粉丝