笔者弄2路AD转换,采用2只74ls164驱动8只集成数码管显示2路AD转换结果,但提示内存不足,编译不通过,不知怎么办?Error [1360] D:\desktop\PIC12F675_gai\main.c; 181. no space for auto/param AD_TMR0_ISR@Result_170
- #include <pic.h> //PIC12F675
- //__CONFIG(0x2004); //?????? //配置字要在头文件后 PROTEUS仿真也要有 PIC12F675/629 手册9.1配置位P54
- //bit13/12BG1:0=00最低/11最高带隙电压 bit11:9空 bit8 CPD=0使能/1禁止RAM保护
- //bit7 CP=0使能/1禁止ROM保护bit6=1使能/0禁止欠压检测 bit5 MCLR=0/1GP3复位脚/GP3数字脚,内部复位
- //bit4 PWRET使能上电延时定时器1=禁止,0=使能 bit3 看门狗使能位1=使能,0=禁止 手册14.1配置位
- //bit2:0 FOSC2:0振荡器使能100=INTOSC振荡,GP4/GP5数字I/O口
- #define _XTAL_FREQ 4000000UL
- #define INT8U unsigned char
- #define INT16U unsigned int
- #define DAT GPIO2 //74LS164串行数据线
- #define CLK GPIO3 //74LS164串行时钟线
- #define RST GPIO4 //74LS164复位脚
- //共阳数码管0~9的数字段码,最后一位为黑屏
- const INT8U SEG_CODE[11] ={0xC0,0xF9,0xA4,0xB0,0x99,
- 0x92,0x82,0xF8,0x80,0x90,0xFF};
- //两路模拟转换结果显示缓冲,显示格式为:X.XX X.XX ,第4位和第8位不显示
- //volatile INT8U Display_Buffer[8] = {0,0,0,10,0,0,0,10};
- volatile INT8U k = 0, j = 0;
- volatile int Result = 0;
- //==================================================
- void ADC_int(void); //ADC模块初始化
- void Serial_Output(INT8U d); // 模拟时序向74HC164串行输出1字节数据
- //-----------------------------------------------------------------
- // 模拟时序向74HC164串行输出1字节数据
- //-----------------------------------------------------------------
- void Serial_Output(INT8U d)
- {
- INT8U i;
- for(i = 0; i < 8; i++) //1个字节8位
- {
- CLK = 0; //时钟置0
- if(d&0x80)DAT = 1; //移出一位(高位优先)
- else DAT = 0;
- d <<= 1;
- CLK = 1; //时钟置1,上升沿数据移入74HC164
- }
- }
-
- void ADC_int(void)
- {
- //手册P46 ANSEL - ADCS2 ADCS1 ADCS0 ANS3:0
- // ADCS2=0;ADCS1=1;ADCS0=0; //FOSC/32
- //ANS1=1;ANS0=1; //AN0/AN1模拟输入
- ANSEL = 0b10100011;
- //手册P45 ADCON0 ADFM VCFG - - CHS1 CHS0 GO/DONE ADON
- //ADFM=1; //1右对齐
- //VCFG=0; //VDD参考电压,1=VREF参考电压
- //CHS1=0;CHS0=0; //通道0
- //GODONE = 1; //启动AD转换
- ADCON0 = 0b10110010;
- __delay_ms(2000); //启动AD转换后要延时,等待AD模块稳定
- PIE1 |= 0b01000000; //ADIE = 1; //使能AD转换中断
- PIR1 &= 0b10111111; //ADIF= 0; //AD转换中断标志清0
- }
- void main(void)
- {
- //TRISIO2=0;TRISIO3=0;TRISIO4=0;
- TRISIO = 0b00000011;
- GPIO2=1;GPIO3=1;GPIO4=1;
- //以下配置用于TMR0定时器刷新数码管显示
- PSA = 0; //前分频给TMR0
- PS2 = 0; PS1 = PS0 = 1; //16分频(OPTION低3位为011)
- TMR0 = (INT8U)(256 - _XTAL_FREQ / 4 / 16 * 0.002); //2ms定时
- T0IF = 0; //清TMR0中断标志
- T0CS = 0; //TMR0内部指令周期,工作于定时器
- T0IE = 1; //允许TMR0溢出中断
- PEIE = 1; //允许所有的未屏蔽的中断
- GIE = 1; //开全局中断
- ADC_int( );
-
- while(1);
- }
- //-----------------------------------------------------------------
- // AD转换中断读数据,TMR0定时器溢出中断控制数码管刷新显示两路A/D转换结果
- //-----------------------------------------------------------------
- void interrupt AD_TMR0_ISR( )
- {
- static INT8U Display_Buffer[8] = {0,0,0,10,0,0,0,10};
- static INT8U k = 0 ;
- //*************
- static unsigned int Result = 0;
- if(ADIF&&(k==7)) //强制16ms获取一次AD转换中断结果,否则显示闪烁
- { //也就是timer0中断8次,AD转换中断才发生一次
- //从而提高显示的刷新率
- //读取转换结果,并转换为电压值
- //参考电压5v,所以转换结果*500/1023.0,使结果在000~500间
- unsigned int Result = (unsigned int)((ADRESL | (ADRESH << 8)) *500.0 / 1023.0);
- Display_Buffer[0 +4*CHS0] = Result / 100;
- Display_Buffer[1+4*CHS0] = Result / 10 % 10;
- Display_Buffer[2+4*CHS0] = Result % 10;
- /************
- Display_Buffer[2+4*CHS0]=0;
- while(Result > 100){Result -= 100;Display_Buffer[2+4*CHS0]++;}
- while(Result > 10){Result -= 10;Display_Buffer[1+4*CHS0]++;}
- Display_Buffer[0 +4*CHS0] = Result;
- ****************/
- //if(++j > 1) j=0;
- CHS0 ^= 1;
- GODONE = 1; //改变通道后要重新启动AD转换
- ADIF = 0;
- }
- if(T0IF && T0IE)
- {
- TMR0 = (INT8U)(256 - _XTAL_FREQ / 4 / 16 * 0.002);//位间延时间隔2ms
- RST = 0; //两只74HC164复位,输出为0
- RST = 1; //拉高复位脚,允许74HC164输出
- Serial_Output(0x01<<k); //先送扫描码
- Serial_Output(SEG_CODE[Display_Buffer[k]]); //后送段码
- k =(k+1)&0x07;
- T0IF = 0; //清TMR0中断标志
- }
- }
|