为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

关于12F508定时半小时的编程问题

2011-09-24 11页 doc 68KB 51阅读

用户头像

is_742547

暂无简介

举报
关于12F508定时半小时的编程问题[求助]关于12F508定时半小时的编程问题  Post By:2008-4-5 13:29:00 12F508,设置了3个输入端口GP1、GP2、GP4,两个输出端口GP0、GP5,GP4优先于GP1优先于GP2,其中,GP4是异常状态检测输入,GP1、GP2是正常控制输入,但是,在响应了GP2的输入信号以后,定时30分钟,关闭输 [求助]关于12F508定时半小时的编程问题 Post By:2008-4-5 13:29:00 12F508,设置了3个输入端口GP1、GP2、GP4,两个输出端口GP0、GP...
关于12F508定时半小时的编程问题
[求助]关于12F508定时半小时的编程问题  Post By:2008-4-5 13:29:00 12F508,设置了3个输入端口GP1、GP2、GP4,两个输出端口GP0、GP5,GP4优先于GP1优先于GP2,其中,GP4是异常状态检测输入,GP1、GP2是正常控制输入,但是,在响应了GP2的输入信号以后,定时30分钟,关闭输 [求助]关于12F508定时半小时的编程问题 Post By:2008-4-5 13:29:00 12F508,设置了3个输入端口GP1、GP2、GP4,两个输出端口GP0、GP5,GP4优先于GP1优先于GP2,其中,GP4是异常状态检测输入,GP1、GP2是正常控制输入,但是,在响应了GP2的输入信号以后,定时30分钟,关闭输出,在定时过程中,还要检测GP1、GP4输入并响应,并控制GP0、GP5的输出。。。。。。其中对GP1的响应不影响定时,对GP4的响应将退出定时,因12F508没有定时中断,也没有外部中断引脚,我想的也是不停读取TIMER0(预分频比256),程序其他部分都已经做好了,就差个定时,但是,因本人是新手,有点不知道,程序该怎么处理好?总觉得没办法掌握读取的时机,而且也不懂,怎么处理读取到的TIMER0数据…… 在此先行谢过各位前辈 另外有个问题,GP3作为输入端口外接一个LED加电阻上拉到5V电源时,使能内部弱上拉时,发现端口始终输出5V,就是不能点亮LED,换成GP5就好了,不懂~~~~~ Post By:2008-4-6 1:21:00 GP3是复位脚,只能设置为输入用 不断读TMR0 当TMR0 >= 250则说明定时256*250时间到 然后TMR0=0; 重复循环 这样做定时不怎么精确,当然使用内部时钟,定时会更不准 Post By 在检测GP1,GP4的大循环中加入读TMR0的值,自己估算一下TMR0一次计满多长时间,30分钟的话还要有个对TMRO计满次数的计数器,TMR0每计满一次,该计数器就加一,还有就是gp1,gp4输入的抗干扰延时程序,也在大循环中对另两个计数器计数延时 Post By:做倒是做出来了 定时器不用预分频,定义了几个定时寄存器,定时部分做了个模块,在主循环里调用,每次调用都读取TMR0值,同时清TMR0寄存器,把读到的值加到定时寄存器里,如果溢出,就下级定时寄存器加1,以此类推,只是定时精度,貌似有点太差了点,半小时,误差都到了±25s了,最好的一次,是超了2秒,不知道怎么能提高精度??? Post By:2008-4-19 15:35:00 用内部时钟做到这样也已经不错了 就怕误差比这还大~ 12f508 spi 2010-06-12 14:18 PIC程序优化:PIC12F508 用IO口模拟SPI的程序,经调试已OK 就是前一片文章的代码优化。现在是91% 这个代码还可以优化:把output_high ,output_low这个函数调用去掉,他每次都去设置方向位。 还可以进行更多优化,欢迎高手执教! #include <12C508.h> #use delay(clock=4000000) #fuses NOWDT __CONFIG(0x0FEA); //看门狗关,内部RC振荡,GO0/GP1做I/O,不加密,MCLR脚做复位 #define GP0 PIN_B0 #define GP1 PIN_B1 #define GP2 PIN_B2 #define GP3 PIN_B3 #define GP4 PIN_B4 #define GP5 PIN_B5 #define LCD_nRESET GP0 #define LCD_nCS GP1 //#define LCD_SDI GP3 #define LCD_SDO GP2 #define LCD_nSCL GP4 //initial function // SPI timming chart: // SCL: ~=200KHz。NCS is chipEnable,SDI send data,SDO reverse for future // Add Start Byte before register and data // the struct of Start Byte like bellow: // (011101 | RS| 0),RS=0 while write register ,RS=1 while write data // sample: LCD_CtrlWrite_ILI9320(0x00E5, 0x8000),RS=0 while write 0x00E5,RS=1 while write 0x8000 // So,we send register as 0x7400E5 and data as 0x768000 // 0x74+addr , 0x76+value typedef struct _spi_cmd { unsigned int16 reg_add; unsigned int16 value; }spi_cmd; spi_cmd CONST spi_send_dat[52]={\ {0x00E5, 0x8000},{0x0001, 0x0100},{0x0002, 0x0700},{0x0003, 0x1030},{0x0004, 0x0000},{0x0008, 0x0202},{0x0009, 0x0000},\ {0x000A, 0x0000},{0x000C, 0x0111},{0x000D, 0x0000},{0x000F, 0x0000},{0x0010, 0x0000},{0x0011, 0x0000},{0x0012, 0x0000},\ {0x0013, 0x0000},{0x0010, 0x17B0},{0x0011, 0x0137},{0x0012, 0x0139},{0x0013, 0x1d00},{0x0029, 0x0013},{0x0020, 0x0000},\ {0x0021, 0x0000},{0x0030, 0x0006},{0x0031, 0x0101},{0x0032, 0x0003},{0x0035, 0x0106},{0x0036, 0x0b02},{0x0037, 0x0302},\ {0x0038, 0x0707},{0x0039, 0x0007},{0x003C, 0x0600},{0x003D, 0x020b},{0x0050, 0x0000},{0x0051, 0x00EF},{0x0052, 0x0000},\ {0x0053, 0x013F},{0x0060, 0x2700},{0x0061, 0x0001},{0x006A, 0x0000},{0x0080, 0x0000},{0x0081, 0x0000},{0x0082, 0x0000},\ {0x0083, 0x0000},{0x0084, 0x0000},{0x0085, 0x0000},{0x0090, 0x0010},{0x0092, 0x0000},{0x0093, 0x0003},{0x0095, 0x0110},\ {0x0097, 0x0000},{0x0098, 0x0000},{0x0007, 0x0173}}; unsigned int16 regadd; unsigned int16 value_dat; void SPI_SendByte() { int8 i,j,k,byteStart; unsigned int16 value; for(k=0;k<52;k++) { for(j=0;j<2;j++) { if(j==0) { byteStart=0x74; //value =regadd; value =spi_send_dat[k].reg_add; } else { byteStart= 0x76; //value = value_dat; value =spi_send_dat[k].value; } //TRACE("byteStart:0x%02x,0x%04x\n",byteStart,value); //SPI START output_low(LCD_nCS ); delay_us(10); //delay_us(1);output_low(LCD_nSCL ); //Start BYTE #if 1 //Memory usage: Memory usage: ROM=83% RAM=12% - 40% i=8; // TRACE("BYTE START :"); for(; i>0 ; i --) { delay_us(1);output_low(LCD_nSCL ); if( ( (byteStart>>(i-1)) &0x01) == 0x00) output_low(LCD_SDO ); else output_high(LCD_SDO ); delay_us(1); output_high(LCD_nSCL ); } // TRACE("\n"); #else //have not: Memory usage: ROM=74% RAM=12% - 40% //have: Memory usage: ROM=95% RAM=12% - 40% #if 1 //1 output_low(LCD_SDO ); //0 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); //2 output_high(LCD_SDO );//1 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); //3 //output_high(LCD_SDO );//1 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); //4 //output_high(LCD_SDO );//1 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); //5 output_low(LCD_SDO );//0 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); //6 output_high(LCD_SDO );//1 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); if(byteStart == 0x01 ) output_low(LCD_SDO ); else output_high(LCD_SDO ); //7 delay_us(1); output_high(LCD_nSCL ); delay_us(1); output_low(LCD_nSCL ); //8 output_low(LCD_SDO );//0 delay_us(1); output_high(LCD_nSCL ); #endif #endif //DATA BYTE // TRACE("DATA START :"); i=16; for(;i>0;i--) { delay_us(1); output_low(LCD_nSCL ); if( ((value>>(i-1))&0x0001) == 0x0000) output_low(LCD_SDO ); else output_high(LCD_SDO ); delay_us(1); output_high(LCD_nSCL ); //delay_us(1); output_low(LCD_nSCL ); } // TRACE("\n"); //SPI OVER delay_us(10); //output_high(LCD_nSCL ); output_high(LCD_SDO ); output_high(LCD_nCS ); // TRACE(" \n "); }//for(i=0); switch(k) { case 15: delay_ms(200); break; case 17: case 18: case 20: delay_ms(50); break; default: break; } }//for(k=0;k<52;k++) } #define LCD_CtrlWrite_ILI9320 SPI_SendByte /*void LCD_CtrlWrite_ILI9320(short int addr,short int value) { SPI_SendByte(0x74,addr); SPI_SendByte(0x76,value); } */ // Memory usage: ROM=82% RAM=28% - 44% void main() { //int8 i; //initial(); setup_counters(RTCC_INTERNAL,RTCC_DIV_1); SET_TRIS_B(0x00); while(1) { // OUTPUT_B(0xFF); // delay_ms(3000); // OUTPUT_B(0x00); // delay_ms(3000); /* delay_ms(10000); #if 0 output_high(LCD_nRESET); delay_ms (1); output_low (LCD_nRESET); delay_ms (10); output_high(LCD_nRESET); #else for(i=0;i<100;i++) { OUTPUT_B(0xFF); delay_us(1); OUTPUT_B(0x00); delay_us(1); } #endif */ output_high(LCD_nCS); output_high(LCD_SDO ); output_high(LCD_nSCL ); delay_ms (500); SPI_SendByte(); //.................... OUTPUT_B(0xFF); //00B1: MOVLW 00 //00B2: MOVWF 14 //00B3: TRIS 6 //00B4: MOVLW FF //00B5: MOVWF 06 //.................... //.................... delay_us(10); //0096: MOVLW 03 //0097: MOVWF 07 //0098: DECFSZ 07,F //0099: GOTO 098 //.................... //.................... delay_ms (1); //00B6: MOVLW 01 //00B7: MOVWF 15 //00B8: GOTO 002 //.................... output_high(LCD_nCS); //00B9: BCF 14.1 //00BA: MOVF 14,W //00BB: TRIS 6 //00BC: BSF 06.1 //.................... output_high(LCD_SDO ); //00BD: BCF 14.2 //00BE: MOVF 14,W //00BF: TRIS 6 //00C0: BSF 06.2 //.................... output_low(LCD_SDO ); //0051: BCF 14.2 //0052: MOVF 14,W //0053: TRIS 6 //0054: BCF 06.2 //.................... //.................... output_low(LCD_nCS ); //002E: BCF 14.1 //002F: MOVF 14,W //0030: TRIS 6 //0031: BCF 06.1 //* //00AC: MOVLW FF //00AD: MOVWF 14 //.................... //.................... LCD_CtrlWrite_ILI9320( 0x00E5,0x8000); // Set the internal vcore voltage //00BA: CLRF 0E //00BB: MOVLW E5 //00BC: MOVWF 0D //00BD: MOVLW 80 //00BE: MOVWF 10 //00BF: CLRF 0F //00C0: GOTO 003 //.................... //.................... input_parameter(0x00E5,0x8000); //00BA: CLRF 0D //00BB: MOVLW E5 //00BC: MOVWF 0C //00BD: MOVLW 80 //00BE: MOVWF 0F //00BF: CLRF 0E //.................... LCD_CtrlWrite_ILI9320(); // Set the internal vcore voltage //00C0: GOTO 003 //.................... //regadd=0x00E5 ; value_dat=0x8000; /* #define input_parameter(reg,dat) regadd=reg ; value_dat=dat input_parameter(0x00E5,0x8000); //0 LCD_CtrlWrite_ILI9320(); // Set the internal vcore voltage input_parameter(0x0000, 0x0001); //1 LCD_CtrlWrite_ILI9320(); // Start internal OSC. input_parameter(0x0001, 0x0100); //2 LCD_CtrlWrite_ILI9320(); // set SS and SM bit input_parameter(0x0002, 0x0700); //3 LCD_CtrlWrite_ILI9320(); // set 1 line inversion input_parameter(0x0003, 0x1030); //4 LCD_CtrlWrite_ILI9320(); // set GRAM write direction and BGR=1. input_parameter(0x0004, 0x0000); //5 LCD_CtrlWrite_ILI9320(); // Resize register input_parameter(0x0008, 0x0202); //6 LCD_CtrlWrite_ILI9320(); // set the back porch and front porch input_parameter(0x0009, 0x0000); //7 LCD_CtrlWrite_ILI9320(); // set non-display area refresh cycle ISC[3:0] input_parameter(0x000A, 0x0000); //8 LCD_CtrlWrite_ILI9320(); // FMARK function input_parameter(0x000C, 0x0111); //9 LCD_CtrlWrite_ILI9320(); // RGB interface setting input_parameter(0x000D, 0x0000); //10 LCD_CtrlWrite_ILI9320(); // Frame marker Position input_parameter(0x000F, 0x0000); //11 LCD_CtrlWrite_ILI9320(); // RGB interface polarity //------------Power On sequence ---------------// input_parameter(0x0010, 0x0000); //12 LCD_CtrlWrite_ILI9320(); // SAP, BT[3:0], AP, DSTB, SLP, STB input_parameter(0x0011, 0x0000); //13 LCD_CtrlWrite_ILI9320(); // DC1[2:0], DC0[2:0], VC[2:0] input_parameter(0x0012, 0x0000); //14 LCD_CtrlWrite_ILI9320(); // VREG1OUT voltage input_parameter(0x0013, 0x0000); //15 LCD_CtrlWrite_ILI9320(); // VDV[4:0] for VCOM amplitude delay_ms(200); // Dis-charge capacitor power voltage input_parameter(0x0010, 0x17B0); //16 LCD_CtrlWrite_ILI9320(); // SAP, BT[3:0], AP, DSTB, SLP, STB input_parameter(0x0011, 0x0137); //17 LCD_CtrlWrite_ILI9320(); // DC1[2:0], DC0[2:0], VC[2:0] delay_ms(50); // Delay 50ms input_parameter(0x0012, 0x0139); //18 LCD_CtrlWrite_ILI9320(); // VREG1OUT voltage delay_ms(50); // Delay 50ms input_parameter(0x0013, 0x1d00); //19 LCD_CtrlWrite_ILI9320(); // VDV[4:0] for VCOM amplitude input_parameter(0x0029, 0x0013); //20 LCD_CtrlWrite_ILI9320(); // VCM[4:0] for VCOMH delay_ms(50); // Delay 50ms input_parameter(0x0020, 0x0000); //21 LCD_CtrlWrite_ILI9320(); // GRAM horizontal Address input_parameter(0x0021, 0x0000); LCD_CtrlWrite_ILI9320(); // GRAM Vertical Address // ----------- Adjust the Gamma Curve ----------// input_parameter(0x0030, 0x0006); LCD_CtrlWrite_ILI9320(); input_parameter(0x0031, 0x0101); LCD_CtrlWrite_ILI9320(); input_parameter(0x0032, 0x0003); LCD_CtrlWrite_ILI9320(); input_parameter(0x0035, 0x0106); LCD_CtrlWrite_ILI9320(); input_parameter(0x0036, 0x0b02); LCD_CtrlWrite_ILI9320(); input_parameter(0x0037, 0x0302); LCD_CtrlWrite_ILI9320(); input_parameter(0x0038, 0x0707); LCD_CtrlWrite_ILI9320(); input_parameter(0x0039, 0x0007); LCD_CtrlWrite_ILI9320(); input_parameter(0x003C, 0x0600); LCD_CtrlWrite_ILI9320(); input_parameter(0x003D, 0x020b); LCD_CtrlWrite_ILI9320(); //------------------ Set GRAM area ---------------// input_parameter(0x0050, 0x0000); LCD_CtrlWrite_ILI9320(); // Horizontal GRAM Start Address input_parameter(0x0051, 0x00EF); LCD_CtrlWrite_ILI9320(); // Horizontal GRAM End Address input_parameter(0x0052, 0x0000); LCD_CtrlWrite_ILI9320(); // Vertical GRAM Start Address input_parameter(0x0053, 0x013F); LCD_CtrlWrite_ILI9320(); // Vertical GRAM Start Address input_parameter(0x0060, 0x2700); LCD_CtrlWrite_ILI9320(); // Gate Scan Line input_parameter(0x0061, 0x0001); LCD_CtrlWrite_ILI9320(); // NDL,VLE, REV input_parameter(0x006A, 0x0000); LCD_CtrlWrite_ILI9320(); // set scrolling line //-------------- Partial Display Control ---------// input_parameter(0x0080, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0081, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0082, 0x0000); LCD_CtrlWrite_ILI9320(); //----------------- input_parameter(0x0083, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0084, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0085, 0x0000); LCD_CtrlWrite_ILI9320(); //-------------- Panel Control -------------------// input_parameter(0x0090, 0x0010); LCD_CtrlWrite_ILI9320(); input_parameter(0x0092, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0093, 0x0003); LCD_CtrlWrite_ILI9320(); input_parameter(0x0095, 0x0110); LCD_CtrlWrite_ILI9320(); input_parameter(0x0097, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0098, 0x0000); LCD_CtrlWrite_ILI9320(); input_parameter(0x0007, 0x0173); LCD_CtrlWrite_ILI9320(); // 262K color and display ON
/
本文档为【关于12F508定时半小时的编程问题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索