打印

pic12f683 adc转换程序??

[复制链接]
5666|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fleshyao|  楼主 | 2007-12-13 01:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

帮看看这个问题吗啊? 为什么取不到数啊?


;AD转换子程序,使用R0,R1,R2,FSR,W
;入口:R0~ADCON0, R1~ADCON1 设置参数
;出口:连续8次AD转换,平均值存R0R1单元
;-----------------------
AD
    BANK1
    CLRF PIE1
    BANK0
    BCF INTCON,PEIE    ;禁止外设中断
    CLRF PIR1
    MOVF R0,W
    MOVWF ADCON0
    BSF ADCON0,ADON
    GOTO $+1    ;采样时间12周
    GOTO $+1
    GOTO $+1
    CLRF R0
    CLRF R1
    MOVLW 08H    ;测8次
    MOVWF R2
AD_1
    BCF PIR1,ADIF
    CLRWDT
    BSF  ADCON0,NOT_DONE     ;启动AD
AD_2
    BTFSC ADCON0,NOT_DONE    ;等待AD结束
    GOTO AD_2
    BSF STATUS,RP0
    MOVF ADRESL,W
    BCF STATUS,RP0
    ADDWF R1,F
    BTFSC STATUS,C
    INCF R0,F
    MOVF ADRESH,W
    ADDWF R0,F
    DECFSZ R2,F
    GOTO AD_1
    BCF PIR1,ADIF
    CLRF ADCON0
    MOVLW 04H    ;4舍5入
    ADDWF R1,F
    BTFSC STATUS,C
    INCF R0,F
    BCF STATUS,C        ;除8
    RRF R0,F
    RRF R1,F
    BCF STATUS,C
    RRF R0,F
    RRF R1,F
    BCF STATUS,C
    RRF R0,F
    RRF R1,F
    MOVF R0,W
    MOVWF ADH
    MOVF R1,W
    MOVF ADL;
    RETURN
沙发
hotpower| | 2007-12-13 01:57 | 只看该作者

哈哈~~~今天看了1天的(反)汇编,眼都看晕了~~~

使用特权

评论回复
板凳
hotpower| | 2007-12-13 02:07 | 只看该作者

这是学习玩的程序????

使用特权

评论回复
地板
hotpower| | 2007-12-13 02:18 | 只看该作者

提点意见

1.玩玩中断.
  ADC查询实在是晕~~~
2.俺喜欢N中取N-2即"跳水算法"
3.汇编也要玩"宏汇编"~~~

看看当年菜农玩的PIC宏汇编~~~

;-------------------------------------------------------------------;
;HPL Version 1.0 演示程序           ;
;HotPower 2003.5.25       ;
;-------------------------------------------------------------------;
#include <p16f877.inc>
#include <HotPower.inc>HPL语言函数库文件
#include <HPLMath.inc>HPL语言数学函数库文件
#include <HPL16877.inc>P16F877函数库文件
;C++ main(){
    Main(Void);主程序开始
    nop;debug
;C++ unsigned char i,j,k,m,n,h,l,x,y,z;
nop;debug
    TDByteVar(p,0x60,0x64);声明1个地址不连续字型变量i,地址定位在0x60和0x64处
nop;debug
    VarVal(p,0x1234);
nop;debug
; Var(t,0x66,TDByte);声明1个字节型变量i,地址定位在0x20处
;产生告警信息:
;请用TDByteVal()定义变量[t],地址为[0x66]
Var(i,0x20,TByte);声明1个字节型变量i,地址定位在0x20处
nop;debug
    VarVal(i,0x20);i变量使用正确
nop;debug
    ByteVal(i,0x88);i变量使用正确
nop;debug
    WordVal(i,0x1234);i变量使用错误,地址0x21被改写为0x12
; TypeVar(i,0x20,TWord);改写1个字型变量i,地址定位在0x20:0x21处
;产生告警信息:
;第1个变量类型被重新定义为[TWord]类型,变量地址为[0x20]
    WordVal(i,0x1234);i变量使用正确
    ByteVal(i,0x88);i变量使用正确
Var(j,0x21,TByte);声明1个字节型变量j,地址定位在0x21处
;Var(j,0x60,TByte);声明1个字节型变量j,地址定位在0x21处
;产生错误信息(115)
;Duplicate label ("j" or redefining symbol that cannot be redefined
Var(k,0x22,TByte);声明1个字节型变量k,地址定位在0x22处
;Var(k,0x22,TByte);声明1个字节型变量k,地址定位在0x22处
;产生错误信息:
;第3个变量[k]被重复定义,变量地址为[0x22]
Var(m,0x23,TByte);声明1个字节型变量m,地址定位在0x23处
Var(n,0x24,TByte);声明1个字节型变量n,地址定位在0x24处
Var(h,0x25,TByte);声明1个字节型变量h,地址定位在0x25处
Var(l,0x26,TByte);声明1个字节型变量l,地址定位在0x26处
Var(x,0x27,TByte);声明1个字节型变量x,地址定位在0x27处
Var(y,0x28,TByte);声明1个字节型变量y,地址定位在0x28处
Var(z,0x29,TByte);声明1个字节型变量z,地址定位在0x29处
;TypeVar(z,0x29,TWord);将变量z改写为字型,地址定位在0x29:0x2a处
;产生告警信息:
;第10个变量[z]类型被重新定义为[TWord]类型,变量地址为[0x29]
;C++ unsigned int ii,jj,kk,mm,nn,hh,ll,xx,yy,zz;
Var(ii,0x30,TWord);声明1个字型变量ii,地址定位在0x30:0x31处
Var(jj,0x32,TWord);声明1个字型变量jj,地址定位在0x32:0x33处
Var(kk,0x34,TWord);声明1个字型变量kk,地址定位在0x34:0x34处
Var(mm,0x36,TWord);声明1个字型变量mm,地址定位在0x36:0x37处
Var(nn,0x38,TWord);声明1个字型变量nn,地址定位在0x38:0x39处
Var(hh,0x3a,TWord);声明1个字型变量hh,地址定位在0x3a:0x3b处
Var(ll,0x3c,TWord);声明1个字型变量ll,地址定位在0x3c:0x3d处
Var(xx,0x3e,TWord);声明1个字型变量xx,地址定位在0x3e:0x3f处
Var(yy,0x40,TWord);声明1个字型变量yy,地址定位在0x40:0x41处
Var(zz,0x42,TWord);声明1个字型变量zz,地址定位在0x42:0x43处
;Var(zz,0x42,TByte);将变量zz改写为字节型,地址定位在0x42:0x43处
;产生告警信息:
;第20个变量[zz]有多类型定义,变量地址为[0x42]
; org 0x8fd
    nop;debug
IFET_Bit(STATUS,Z);
     ByteVal(i,0);
   nop;debug
    ELSEIFET_Bit;
     ByteVal(i,1);
   nop;debug
    ENDIFET_Bit;
   nop;debug
IFNT_Bit(STATUS,Z);
     ByteVal(i,0);
   nop;debug
    ELSEIFNT_Bit;
     ByteVal(i,1);
   nop;debug
    ENDIFNT_Bit;
;C++    i=100;
ByteVal(i,10);
nop;debug
;C++    j=123
ByteVal(j,123);
nop;debug
;C++    ii=(unsigned int)i*j;
; MulByteVar(i,j,ii);
;C++ ii=0x1234;
WordVal(ii,0x1234);
nop;
;C++    kk=ii/jj;
DivWordVar(ii,jj,xx,yy);
nop;debug
;C++    jj=ii;
WordVar(jj,ii);
nop;debug
;C++ i=88;
ByteVal(i,80);
nop;debug
;C++ if(i==88){
    IFNE_ByteVal(i,88);
;C++ j=99;
     ByteVal(j,99);
     nop;debug
;C++ ??????????????
     IFET_TestByte(zz);
;C++ j=1;
       ByteVal(j,1);
       nop;debug
;     ESLEIFET_TestByte
;C++ j=0;
       ByteVal(j,0);
       nop;debug
     ENDIFET_TestByte;
;C++ if(x & 1){
     IFET_AndByteVal(x,1)
;C++ j=1;
       ByteVal(j,1);
       nop;debug
     ELSEIFET_AndByteVal
       ByteVal(j,0);
       nop;debug
     ENDIFET_AndByteVal
;C++ } 

;C++ if(x | 1){
     IFET_OrByteVal(x,1)
;C++ j=1;
       ByteVal(j,1);
       nop;debug
     ELSEIFET_OrByteVal
       ByteVal(j,0);
       nop;debug
     ENDIFET_OrByteVal
;C++ } 

;C++ if(x ^ 1){
     IFET_XorByteVal(x,1)
;C++ j=1;
       ByteVal(j,1);
       nop;debug
     ELSEIFET_XorByteVal
       ByteVal(j,0);
       nop;debug
     ENDIFET_XorByteVal
;C++ } 

;C++ if(i>=33){
  IFGE_ByteVal(i,33);
;C++ k=i;
       ByteVar(k,i);
       nop;debug
;C++ }
  ENDIFGE_ByteVal;
;C++ if(j==99){
     IFEQ_ByteVal(j,88);
;C++ k=88;
       ByteVal(k,88);
       nop;debug
;C++ }
;C++ else{
     ELSEIFEQ_ByteVal;
;C++ m=9;
       ByteVal(m,9);
       nop;debug
;C++ }
     ENDIFEQ_ByteVal
;C++ h=9;
     ByteVal(h,9);
     nop;debug
;C++ }
;C++ else{
   ELSEIFNE_ByteVal;
;C++ n=9;
     ByteVal(n,9);
     nop;debug
;C++ if(n<8){;
     IFLE_ByteVal(n,8);
;C++ l=12;
    ByteVal(l,12);l=12;
       nop;debug
;C++ }
;C++ else{
     ELSEIFLE_ByteVal;
;C++ z=0xaf;
    ByteVal(z,0xaf);
       nop;debug
;C++ }
     ENDIFLE_ByteVal;
  nop;debug
;C++ }
   ENDIFNE_ByteVal;
;C++ x=123;
   ByteVal(x,123);
   nop;debug
;C++ y=25;
   ByteVal(y,25);
   nop;debug
;C++ y++;
   IncByte(y);
   nop;debug
;C++ if(x>5){
   IFGT_ByteVal(x,5);
;C++ x=y;
     ByteVar(x,y);
  nop;debug
   ENDIFGT_ByteVal;
   nop;debug
org 0x10fd
    nop;debug
IFET_Bit(STATUS,Z);
     ByteVal(i,0);
   nop;debug
    ELSEIFET_Bit;
     ByteVal(i,1);
   nop;debug
    ENDIFET_Bit;
   nop;debug
    ByteVal(i,2);
  nop
    DoCase(i);
      Case 1;
  nop
        AndByteVal(j,0xfe);
  nop
      Case 2;
        AndByteVal(j,0x7f);
  nop
    EndCase;
  nop
;C++ }
;C++ }
   MainEnd;主程序结束

;-------------------------------------------------------------------
;DOCASE(switch) 演示程序           ;
;HotPower 2003.6.8        ;
;-------------------------------------------------------------------;
#include <p16f877.inc>
#include <HotPower.inc>HPL语言函数库文件
#include <HPLMath.inc>HPL语言数学函数库文件
#include <HPL16877.inc>P16F877函数库文件
  Main(Void); main(){//主程序开始
    Var(i,0x20,TByte); unsigned char i;
    Var(j,0x30,TByte); unsigned char j;
    Var(k,0x40,TByte); unsigned char k;
    Var(m,0x50,TByte); unsigned char m;
    Var(n,0x60,TByte); unsigned char n;
    ByteVal(i,2); i = 2;
    ByteVal(j,3); j = 3;
    ByteVal(k,0); k = 0;
    DoCase(k); switch(k){
      nop;
      Case 10; case 10:
        nop; //HPL语言同Delphi等语言一样,不需要加break语句
      Case 8; case 8:
        nop
      ExecCase;//该语句为HPL语言特有的,其他语言中没有
;-----ExecCase执行CASE比较成立的语句--------------------
       nop
    ELSECase; default:
;-----ElseCase执行CASE比较不成立的语句------------------
      nop;
      IncByte(k); k++;
      nop
      IFEQ_ByteVal(k,6); if(k == 6){
        nop
        ExitCase; break;
        nop
      ENDIFEQ_ByteVal; }
      nop;
      LoopCase; continue;
      nop
    ENDCase; }
    nop
    DoCase(i); switch(i){
      Case 1; case 1:
        nop
        ExitCase; break;
      Case 2; case 2:
        nop
        DoCase(j); switch(j){
          Case 1; case 1:
            nop;
          Case 2; case 2:
            nop;
          Case 3; case 3:
            ByteVal(k,88); k = 88;
            nop
            IFEQ_ByteVal(k,88); if(k == 88){
              ByteVal(m,3); m = 3;
              nop
              DoCase(m); switch(m){
                Case 1; case 1:
                  nop
                Case 2; case 2:
                  nop
                Case 3; case 3:
                  ByteVal(n,0x99); n = 99;
                  nop;
                  IFEQ_ByteVal(n,88); if(n == 88){
                    nop
                  ELSEIFEQ_ByteVal; }else{
                    ByteVal(i,2); i = 2;
                    nop;
                    DoCase(i); switch(i){
                      Case 1; case 1:
                        nop
                      Case 2; case 2:
                        ByteVal(j,8); j = 8;
                        nop
                        IFLE_ByteVal(j,88); if(j <= 88){
                          nop
                        ELSEIFLE_ByteVal; }else{
                          ByteVal(j,3); j = 3;
                          nop
                          DoCase(j); switch(j){
                            Case 1; case 1:
                              nop;
                            Case 2; case 2:
                              nop
                            ELSECase; default:
                              nop;
                          ENDCase; }
                          nop
                          ByteVal(k,3); k = 3;
                          nop
                          DoCase(k); switch(k){
                            Case 1; case 1:
                              nop;
                            Case 2; case 2:
                              nop
                            ELSECase; default:
                              nop;
                          ENDCase; }
                          nop
                        ENDIFLE_ByteVal; }
                        nop
                      ELSECase; default:
                        nop
                    ENDCase; }
                    nop
                  ENDIFEQ_ByteVal; }
                  nop;
                ELSECase; default:
                  nop;
              ENDCase; }
              nop
            ELSEIFEQ_ByteVal; }else{
              nop
            ENDIFEQ_ByteVal; }
            nop
          ELSECase; }
            nop
        ENDCase; }
        nop
      Case 3; case 3:
        nop
      Case 4; case 4:
        ByteVal(j,8); j = 8;
        nop
        DoCase(j); switch(j){
          Case 1; case 1:
            nop;
          Case 2; case 2:
            nop
          ELSECase; default:
            nop;
        ENDCase; }
        nop;
        nop
      Case 5; case 5:
        nop
      ELSECase; default:
        ByteVal(j,1); j = 1;
        nop
        DoCase(j); switch(j){
          Case 1; case 1:
            nop;
          Case 2; case 2:
            nop
          ELSECase; default:
            nop;
        ENDCase; }
        nop;
    ENDCase; }
    nop
  MainEnd;}//主程序结束

;-------------------------------------------------------------------;while演示程         ;
;HotPower 2003.6.8        ;
;------------------------------------------------------------------- #include <p16f877.inc>
#include <HotPower.inc>HPL语言函数库文件
#include <HPLMath.inc>HPL语言数学函数库文件
#include <HPL16877.inc>P16F877函数库文件
  Main(Void); main(void){//主程序开始
    Var(i,0x20,TByte); unsigned char i;
    Var(j,0x30,TByte); unsigned char j;
    Var(k,0x40,TByte); unsigned char k;
    Var(m,0x50,TByte); unsigned char m;
    Var(n,0x60,TByte); unsigned char n;
    ByteVal(i,10); i = 10;
    ByteVal(j,3); j = 3;
    ByteVal(k,8); k = 8;
    nop
    WhileET_Bit(PORTB,BIT7);
      nop
    EndWhileET_Bit;
    nop
    DnWhileET_Bit;
      nop
;      ExitDnWhileET_Bit;
      nop
    EndDnWhileET_Bit(PORTB,BIT7);
    nop
    DnWhileNT_Bit;
      nop
      ExitDnWhileNT_Bit;
      nop
    EndDnWhileNT_Bit(PORTB,BIT7);
    nop
    WhileEQ_ByteVal(i,10); while(i == 10){
      nop
      ByteVal(m,1); m = 1;
      nop;
      WhileNE_ByteVal(m,10); while(m != 10){
        nop;
        IncByte(m); m++;
        nop;
      ENDWhileNE_ByteVal; }
      nop;
      ByteVal(m,1); m = 1;
      nop;
      WhileLT_ByteVal(m,10); while(m < 10){
        nop;
        ExitWhileLT_ByteVal; break;
        nop
        IncByte(m); m++;
        nop;
      ENDWhileLT_ByteVal; }
      nop;
      ByteVal(m,18); m = 18;
      nop;
      WhileGT_ByteVal(m,10); while(m > 10){
        nop;
        IncByte(m); m++;
        nop
        LoopWhileGT_ByteVal; continue;
        nop;
      ENDWhileGT_ByteVal; }
      nop;
      ByteVal(m,1); m = 1;
      nop;
      WhileLE_ByteVal(m,10); while(m <= 10){
        nop;
        IncByte(m); m++;
        nop;
      ENDWhileLE_ByteVal; }
      nop;
      ByteVal(m,18); m = 18;
      nop;
      WhileGE_ByteVal(m,10); while(m >= 10){
        nop;
        IncByte(m); m++;
        nop;
      ENDWhileGE_ByteVal; }
      nop;
    ENDWhileEQ_ByteVal; }
    nop
  MainEnd; }//主程序结束

;-------------------------------------------------------------------;
;For演示程序           ;
;HotPower 2003.6.8        ;
;-------------------------------------------------------------------;
#include <p16f877.inc>
#include <HotPower.inc>HPL语言函数库文件
#include <HPLMath.inc>HPL语言数学函数库文件
#include <HPL16877.inc>P16F877函数库文件
  Main(Void); main(void){//主程序开始
    Var(i,0x20,TByte); unsigned char i;
    Var(j,0x30,TByte); unsigned char j;
    Var(k,0x40,TWord); unsigned int k;
    Var(t,0x48,TWord); unsigned int t;
    Var(m,0x50,TByte); unsigned char m;
    Var(n,0x60,TByte); unsigned char n;
    WordVal(t,0); t = 0;
    ByteVal(m,0); m = 0;
    ByteVal(n,0); n = 0;
    nop
    For_ByteVal(i,1,10); for(i = 1; i <= 10; i++){
      nop
      IncByte(m); m++;
      nop
      For_ByteVal(j,10,1); for(j = 10; j >= 1; j--){
        nop
        IFGT_ByteVal(n,0); if(n > 0){
          nop
          LoopFor_ByteVal; continue;
          nop
        ENDIFGT_ByteVal; }
        nop
        IncByte(n); n++;
        nop
      ENDFor_ByteVal; }   
      nop
      For_WordVal(k,1,10000); for(k = 1; k <= 10000; k++){
        nop
        IncByte(n); n++;
        IFEQ_ByteVal(n,128); if(n == 128){
          nop
          ExitFor_WordVal; break;
          nop
        ENDIFEQ_ByteVal; }
        nop
      ENDFor_WordVal; } 
      nop
      AddWordByte(t,m); t += m;
      nop
      AddWordByte(t,n); t += n;
      nop
    ENDFor_ByteVal; }
    nop
  MainEnd; }//主程序结束



DoCase(k); switch(k){
      nop;
      Case 10; case 10:
        nop; //HPL语言同Delphi等语言一样,不需要加break语句
      Case 8; case 8:
        nop
      ExecCase;//该语句为HPL语言特有的,其他语言中没有
;-----ExecCase执行CASE比较成立的语句--------------------
       nop
    ELSECase; default:
;-----ElseCase执行CASE比较不成立的语句------------------
      nop;
      IncByte(k); k++;
      nop
      IFEQ_ByteVal(k,6); if(k == 6){
        nop
        ExitCase; break;
        nop
      ENDIFEQ_ByteVal; }
      nop;
      LoopCase; continue;
      nop
    ENDCase; }

使用特权

评论回复
5
兰天白云| | 2007-12-13 08:22 | 只看该作者

hotpower太有才了

汇编玩的和C一样

使用特权

评论回复
6
兰天白云| | 2007-12-13 08:31 | 只看该作者

LZ只采样一次看看,些那么多中断的寄存器干吗?

使用特权

评论回复
7
hotpower| | 2007-12-13 19:31 | 只看该作者

哈哈~~~当年俺也是在PC上这么玩汇编的~~~和C++一样

if/docase/while等都是"无级嵌套"~~~

使用特权

评论回复
8
兰天白云| | 2007-12-13 20:48 | 只看该作者

hotpower

开个贴给大家讲讲伪C++怎么样?

使用特权

评论回复
9
hotpower| | 2007-12-13 22:22 | 只看该作者

哈哈~~~这个玩意太古老~~~不玩也罢...4年前"卖弄"没人搭理

哈哈~~~现在是新社会了~~~

使用特权

评论回复
10
hotpower| | 2019-1-21 00:28 | 只看该作者
呵呵,自己顶起来!!!

使用特权

评论回复
11
hotpower| | 2019-1-21 00:38 | 只看该作者
呵呵,16年了!

使用特权

评论回复
12
钓鱼大师| | 2019-1-22 09:12 | 只看该作者
hotpower 发表于 2019-1-21 00:28
呵呵,自己顶起来!!!

这么古老的帖子还顶起来

使用特权

评论回复
13
大卫颂| | 2019-1-23 14:54 | 只看该作者
可以用C语言么?求你了..

使用特权

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

本版积分规则

16

主题

45

帖子

0

粉丝