scan8[16+2*4]的内容

本文详细解析了x264_scan8数组的设计原理及其在视频编码中的应用。介绍了scan8如何帮助优化访问mv_cache等内存结构,并通过具体实例说明了其在宏块预测模式中的作用。

scan8确实不好理解,解答如下:

static const int x264_scan8[16+2*4] =
{

/* Luma */
4+1*8, 5+1*8, 4+2*8, 5+2*8,
6+1*8, 7+1*8, 6+2*8, 7+2*8,
4+3*8, 5+3*8, 4+4*8, 5+4*8,
6+3*8, 7+3*8, 6+4*8, 7+4*8,

/* Cb */
1+1*8, 2+1*8,
1+2*8, 2+2*8,

/* Cr */
1+4*8, 2+4*8,
1+5*8, 2+5*8,
};


/*
0 1 2 3 4 5 6 7
0
1 B B L L L L
2 B B L L L L
3 L L L L
4 R R L L L L
5 R R
*/
上面这两个对应起来看就可以了。

scan8是为了便于访问 诸如mv_cache, ref_cache, non_zero_count_cache以及mvd_cache等内存,而填充好的一个数组,里面放置的都是上述内存中特定的索引序号
比如scan8[0]=12,这个12就是上述内存中,一般针对macroblock而言的左上角数值,无论是mv,还是non_zero_count,所以只有充分搞懂上述内存结构,那么所有问题就迎刃而解了

attachment中是以前针对某个问题,分析后的笔记
ffmepg中,几个比较重要的cache,大致都是按照此思路进行设置的
希望对于cache理解有帮助!

1.请问色度为什么和Luma度是同一矩阵值?
2.h->block_offset是求什么的值?
  1. for(i=0; i<16; i++){
  2. h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
  3. h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3);
  4. }
  5. for(i=0; i<4; i++){
  6. h->block_offset[16+i]=
  7. h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
  8. h->block_offset[24+16+i]=
  9. h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3);
  10. }
复制代码
1、应该是为了节约内存,同时方便在一个数组中索引同一个MB的亮色度的预测模式。不知这样解释是否正确,希望高人指正
2、block_offset,看名字就知道是block的偏移量啊 16+8,就更加明显啦,16个亮度,两个(8,各为4)色度
如果没记错的话,这个偏移应该是用在yuv像素存储索引的

感谢Juanny 的文档,对于理解x264_scan8中的元素值很有帮组,这主要是一个中间的寻址矩阵,通过它可以很方便的找到MB的色度、亮度4x4块在对应的cache,zero_count中的位置

scan8[]实际上是4x4块的扫描顺序及存储的位置,把scan8放在8x8的矩阵中就能看出其作用了,其中T表示当前块的上面的块,L表示当前块左边的块,它们是用来预测当前块的帧内预测模式(Intra prediction mode)和运动向量之类的,起到一个缓存的作用。可以看到这种设计比JM节约内存,而且非常巧妙。程序中的其他缓存设计都与此类似。

T

T

T

T

T

T

L

16

17

L

0

1

4

5

L

18

19

L

2

3

6

7

T

T

L

8

9

12

13

L

20

21

L

10

11

14

15

L

22

23

删除下面代码中所有和OLED无关的部分,我只需要OLED模块 #include "stm32f10x.h" #include "OLED_I2C.h" #include "ds1302.h" #include "ds18b20.h" #include "usart1.h" #include "led.h" #include "delay.h" #include "max30102_read.h" #include "myiic.h" #include "key.h" #include "iic.h" #include "stdio.h" #include "string.h" #include "adxl345.h" #include "timer.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #define FLASH_SAVE_ADDR ((u32)0x0800F000) //ÉèÖÃFLASH ±£´æµØÖ·(±ØÐëΪÅ&frac14;Êý) #define STM32_RX1_BUF Usart1RecBuf #define STM32_Rx1Counter RxCounter #define STM32_RX1BUFF_SIZE USART1_RXBUFF_SIZE unsigned char setn=0; unsigned char p_r=0; //Æ&frac12;Äê/ÈóÄê =0±íÊ&frac34;Æ&frac12;Ä꣬=1±íÊ&frac34;ÈóÄê float adx,ady,adz; float acc; float acc2,acc3; u8 flag=0; u16 bushu=0; short temperature=0; u16 xinlvMin=60,xinlvMax=120;//ÐÄÂÊÏÂÏÞÉÏÏÞ u16 spo2Min=80;//ѪÑõÏÂÏÞ u16 tempMax=373;//ζÈÉÏÏÞ u16 tempMin=150;//ζÈÏÂÏÞ char display[16]; u8 shanshuo=0; u8 beepFlag=0x00; //·äÃùÆ÷±¨&frac34;¯±êÖ&frac34; u8 sendFlag = 1; u8 tiltFlag=0; //µøµ¹±êÖ&frac34; u8 fallTime=5; //µøµ¹³ÖÐøµÄʱ&frac14;ä u8 displayfall=0; bool sendSetValueFlag=0; int32_t hrAvg;//ÐÄÂÊ int32_t spo2Avg;//ѪÑõŨ¶È void DisplayTime(void)//ÏÔÊ&frac34;ʱ&frac14;亯Êý { unsigned char i=0,x=0; u16 nian_temp; if(setn==0)DS1302_DateRead(&SysDate);//¶Áʱ&frac14;ä nian_temp=2000+SysDate.year; if((nian_temp%400==0)||((nian_temp%100!=0)&&(nian_temp%4==0))) //ÅжÏÊÇ·ñΪÈòÄê p_r=1; else p_r=0; if(setn<8) { OLED_ShowChar((x++)*8,0,'2',2,setn+1-1); OLED_ShowChar((x++)*8,0,'0',2,setn+1-1); OLED_ShowChar((x++)*8,0,SysDate.year/10+'0',2,setn+1-1); OLED_ShowChar((x++)*8,0,SysDate.year%10+'0',2,setn+1-1); OLED_ShowChar((x++)*8,0,'-',2,0); OLED_ShowChar((x++)*8,0,SysDate.mon/10+'0',2,setn+1-2); OLED_ShowChar((x++)*8,0,SysDate.mon%10+'0',2,setn+1-2); OLED_ShowChar((x++)*8,0,'-',2,0); OLED_ShowChar((x++)*8,0,SysDate.day/10+'0',2,setn+1-3); OLED_ShowChar((x++)*8,0,SysDate.day%10+'0',2,setn+1-3); OLED_ShowCN(i*16+88,0,0,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÖÜ switch(SysDate.week) { case 1: OLED_ShowCN(i*16+104,0,1,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÒ» break; case 2: OLED_ShowCN(i*16+104,0,2,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£º¶þ break; case 3: OLED_ShowCN(i*16+104,0,3,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÈý break; case 4: OLED_ShowCN(i*16+104,0,4,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºËÄ break; case 5: OLED_ShowCN(i*16+104,0,i+5,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÎå break; case 6: OLED_ShowCN(i*16+104,0,6,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÁù break; case 7: OLED_ShowCN(i*16+104,0,7,setn+1-4);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÈÕ break; } x=0; OLED_ShowChar((x++)*8,2,SysDate.hour/10+'0',2,setn+1-5); OLED_ShowChar((x++)*8,2,SysDate.hour%10+'0',2,setn+1-5); OLED_ShowChar((x++)*8,2,':',2,0); OLED_ShowChar((x++)*8,2,SysDate.min/10+'0',2,setn+1-6); OLED_ShowChar((x++)*8,2,SysDate.min%10+'0',2,setn+1-6); OLED_ShowChar((x++)*8,2,':',2,0); OLED_ShowChar((x++)*8,2,SysDate.sec/10+'0',2,setn+1-7); OLED_ShowChar((x++)*8,2,SysDate.sec%10+'0',2,setn+1-7); } } void GetHeartRateSpO2(void) { unsigned char x=0; ReadHeartRateSpO2(); //¶ÁÈ¡ÐÄÂÊѪÑõ //ÏÔÊ&frac34;Ïà¹ØµÄÐÅÏ¢ if(((hrAvg!=0)&&(hrAvg>=xinlvMax||hrAvg<=xinlvMin))&&shanshuo==1) { OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); } else { //ÏÔÊ&frac34;Ïà¹ØµÄÐÅÏ¢ OLED_ShowChar((x++)*8,6,hrAvg%1000/100+'0',2,0); OLED_ShowChar((x++)*8,6,hrAvg%100/10+'0',2,0); OLED_ShowChar((x++)*8,6,hrAvg%10+'0',2,0); } x=6; if(((spo2Avg!=0)&&(spo2Avg<=spo2Min))&&shanshuo==1) { OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); } else { //ÏÔÊ&frac34;Ïà¹ØµÄÐÅÏ¢ OLED_ShowChar((x++)*8,6,spo2Avg%1000/100+'0',2,0); OLED_ShowChar((x++)*8,6,spo2Avg%100/10+'0',2,0); OLED_ShowChar((x++)*8,6,spo2Avg%10+'0',2,0); } } void DisplayTemperature(void)//ÏÔÊ&frac34;ζȺ¯Êý { unsigned char x=10;//ÏÔÊ&frac34;µÄµÚ&frac14;¸¸ö×Ö·û temperature=DS18B20_Get_Temp(); if((temperature<=tempMin||temperature>=tempMax)&&shanshuo==1) { OLED_ShowChar((x++)*8,2,' ',2,0); OLED_ShowChar((x++)*8,2,' ',2,0); OLED_ShowChar((x++)*8,2,' ',2,0); OLED_ShowChar((x++)*8,2,' ',2,0); } else { OLED_ShowChar((x++)*8,2,temperature/100+'0',2,0); OLED_ShowChar((x++)*8,2,temperature%100/10+'0',2,0); OLED_ShowChar((x++)*8,2,'.',2,0); OLED_ShowChar((x++)*8,2,temperature%10+'0',2,0); } } void Store_Data(void) //´æ´¢Êý&frac34;Ý { u16 DATA_BUF[6]; DATA_BUF[0] = bushu; DATA_BUF[1] = xinlvMin; DATA_BUF[2] = xinlvMax; DATA_BUF[3] = spo2Min; DATA_BUF[4] = tempMin; DATA_BUF[5] = tempMax; STMFLASH_Write(FLASH_SAVE_ADDR + 0x20,(u16*)DATA_BUF,6); //дÈëÊý&frac34;Ý DelayMs(50); } void Read_Data(void) //¶Á³öÊý&frac34;Ý { u16 DATA_BUF[10]; STM32F10x_Read(FLASH_SAVE_ADDR + 0x20,(u16*)DATA_BUF,6); //¶ÁÈ¡Êý&frac34;Ý bushu = DATA_BUF[0]; xinlvMin = DATA_BUF[1]; xinlvMax = DATA_BUF[2]; spo2Min = DATA_BUF[3]; tempMin = DATA_BUF[4]; tempMax = DATA_BUF[5]; } void CheckNewMcu(void) // &frac14;ì&sup2;éÊÇ·ñÊÇеĵ¥Æ¬»ú£¬ÊǵϰÇå¿Õ´æ´¢Çø£¬·ñÔò±£Áô { u8 comper_str[6]; STM32F10x_Read(FLASH_SAVE_ADDR,(u16*)comper_str,5); comper_str[5] = '\0'; if(strstr((char *)comper_str,"FDYDZ") == NULL) //еĵ¥Æ¬»ú { STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)"FDYDZ",5); //дÈë¡°FDYDZ¡±£¬·&frac12;±ãÏ´ÎУÑé DelayMs(50); Store_Data();//´æ´¢Ï³õÊ&frac14;Êý&frac34;Ý DelayMs(50); } Read_Data(); //¿ª»ú¶ÁÈ¡ÏÂÏà¹ØÊý&frac34;Ý£¨&sup2;&frac12;ÊýÀï³Ì¿¨Â·Àï&sup2;&frac12;³¤£© } void GetSteps(void)//»ñÈ¡&sup2;&frac12;Êýº¯Êý { static u16 temp=0; u16 x=11; adxl345_read_average(&adx,&ady,&adz,10);//»ñÈ¡Êý&frac34;Ý acc=ady; acc2=ady; acc3=adx; if(acc2<0)acc2=-acc2; if(acc3<0)acc3=-acc3; if(((u16)acc2)>=190 || ((u16)acc3)>=190)//&frac14;ì&sup2;âµ&frac12;Çãб { tiltFlag=1; } else { tiltFlag=0; fallTime=5; displayfall=0; } if(acc>0)//ÔÚÕýÖá { if(acc/10>=4&&flag==1)//&frac14;ÓËÙ¶ÈÖµ£¬ÔÚÕýÖáÖµÊÇ·ñ´óÓÚ5£¬&sup2;¢ÇÒflagΪ1£¬ÔòÊÓΪһ¸öÖÜÆÚÍê³É£¬&sup2;&frac12;Êý&frac14;Ó1 { flag=0; if(bushu<60000)bushu++; //&sup2;&frac12;Êý&frac14;Ó1 if(temp!=bushu)//µ±&sup2;&frac12;Êý·¢Éú±ä»¯&sup2;ÅÈ¥´æ´¢&sup2;&frac12;Êý { temp=bushu; Store_Data(); //´æ´¢&sup2;&frac12;Êý } } } if(acc<0)//ÔÚ¸ºÖá { acc=-acc; if(acc/10>=4)//&frac14;ÓËÙ¶ÈÖµ£¬ÔÚ¸ºÖáÊÇ·ñСÓÚ-5 { flag=1;//falgÖÃ1 } } if(bushu>9999) { OLED_ShowChar((x++)*8,6,bushu/10000+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%10000/1000+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%1000/100+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%100/10+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%10+'0',2,0); } else if(bushu>999) { OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,bushu%10000/1000+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%1000/100+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%100/10+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%10+'0',2,0); } else if(bushu>99) { OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,bushu%1000/100+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%100/10+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%10+'0',2,0); } else if(bushu>9) { OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,bushu%100/10+'0',2,0); OLED_ShowChar((x++)*8,6,bushu%10+'0',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); } else { OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,bushu%10+'0',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); OLED_ShowChar((x++)*8,6,' ',2,0); } } void DisplaySetValue(void) //ÏÔÊ&frac34;ÉèÖÃÖµ { if(setn==8||setn==9) { OLED_ShowChar(48,4,xinlvMin/100+'0',2,setn+1-8);//ÏÔÊ&frac34; OLED_ShowChar(56,4,xinlvMin%100/10+'0',2,setn+1-8);//ÏÔÊ&frac34; OLED_ShowChar(64,4,xinlvMin%10+'0',2,setn+1-8);//ÏÔÊ&frac34; OLED_ShowChar(48,6,xinlvMax/100+'0',2,setn+1-9);//ÏÔÊ&frac34; OLED_ShowChar(56,6,xinlvMax%100/10+'0',2,setn+1-9);//ÏÔÊ&frac34; OLED_ShowChar(64,6,xinlvMax%10+'0',2,setn+1-9);//ÏÔÊ&frac34; } if(setn==10) { OLED_ShowChar(48,4,spo2Min/100+'0',2,setn+1-10);//ÏÔÊ&frac34; OLED_ShowChar(56,4,spo2Min%100/10+'0',2,setn+1-10);//ÏÔÊ&frac34; OLED_ShowChar(64,4,spo2Min%10+'0',2,setn+1-10);//ÏÔÊ&frac34; } if(setn==11||setn==12) { OLED_ShowChar(48,4,tempMin/100+'0',2,setn+1-11);//ÏÔÊ&frac34; OLED_ShowChar(56,4,tempMin%100/10+'0',2,setn+1-11);//ÏÔÊ&frac34; OLED_ShowChar(64,4,'.',2,setn+1-11); OLED_ShowChar(72,4,tempMin%10+'0',2,setn+1-11);//ÏÔÊ&frac34; OLED_ShowChar(48,6,tempMax/100+'0',2,setn+1-12);//ÏÔÊ&frac34; OLED_ShowChar(56,6,tempMax%100/10+'0',2,setn+1-12);//ÏÔÊ&frac34; OLED_ShowChar(64,6,'.',2,setn+1-12); OLED_ShowChar(72,6,tempMax%10+'0',2,setn+1-12);//ÏÔÊ&frac34; } } void KeySettings(void)//°´&frac14;üÉèÖú¯Êý { unsigned char keynum = 0,i; keynum = KEY_Scan(1);//»ñÈ¡°´&frac14;üÖµ if(keynum==1)//ÉèÖà { setn++; if(setn > 12) { setn=0; sendSetValueFlag=1; OLED_CLS();//ÇåÆÁ for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÐÄÂÊ for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÑªÑõ for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£º&sup2;&frac12;Êý OLED_ShowCentigrade(112, 2); //¡æ DelayMs(50); Store_Data(); } if(setn==8) { OLED_CLS();//ÇåÆÁ for(i=0;i<4;i++)OLED_ShowCN(i*16+32,0,i+22,0);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÉèÖÃÐÄÂÊ for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+26,0); //&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÏÂÏÞ for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+28,0); //&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÉÏÏÞ OLED_ShowChar(34,4,':',2,0); OLED_ShowChar(34,6,':',2,0); } if(setn==10) { for(i=0;i<4;i++)OLED_ShowCN(i*16+32,0,i+30,0);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÉèÖÃѪÑõ for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+26,0); //&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÏÂÏÞ OLED_ShowStr(0,6,(u8*)" ", 2); } if(setn==11) { for(i=0;i<4;i++)OLED_ShowCN(i*16+32,0,i+34,0);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÉèÖÃÎÂ¶È for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+26,0); //&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÏÂÏÞ for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+28,0); //&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÉÏÏÞ OLED_ShowChar(34,4,':',2,0); OLED_ShowChar(34,6,':',2,0); } DisplaySetValue(); } if(keynum==2)//&frac14;Ó { if(setn == 1)//ÉèÖÃÄê { SysDate.year ++; if(SysDate.year == 100)SysDate.year=0; DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if(setn == 2)//ÉèÖÃÔ { SysDate.mon ++; if(SysDate.mon == 13)SysDate.mon = 1; if((SysDate.mon==4)||(SysDate.mon==6)||(SysDate.mon==9)||(SysDate.mon==11)) { if(SysDate.day>30)SysDate.day=1; } else { if(SysDate.mon==2) { if(p_r==1) { if(SysDate.day>29) SysDate.day=1; } else { if(SysDate.day>28) SysDate.day=1; } } } DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if(setn == 3)//ÉèÖÃÈÕ { SysDate.day ++; if((SysDate.mon==1)||(SysDate.mon==3)||(SysDate.mon==5)||(SysDate.mon==7)||(SysDate.mon==8)||(SysDate.mon==10)||(SysDate.mon==12))//´óÔ { if(SysDate.day==32)//×î´ó31Ìì SysDate.day=1;//´Ó1¿ªÊ&frac14; } else { if(SysDate.mon==2)//¶þÔÂ·Ý { if(p_r==1)//ÈòÄê { if(SysDate.day==30)//×î´ó29Ìì SysDate.day=1; } else { if(SysDate.day==29)//×î´ó28Ìì SysDate.day=1; } } else { if(SysDate.day==31)//×î´ó30Ìì SysDate.day=1; } } DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if(setn == 4)//ÉèÖÃÐÇÆÚ { SysDate.week ++; if(SysDate.week == 8)SysDate.week=1; DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if(setn == 5)//ÉèÖÃʱ { SysDate.hour ++; if(SysDate.hour == 24)SysDate.hour=0; DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if(setn == 6)//ÉèÖÃ·Ö { SysDate.min ++; if(SysDate.min == 60)SysDate.min=0; DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if(setn == 7)//ÉèÖÃÃë { SysDate.sec ++; if(SysDate.sec == 60)SysDate.sec=0; DS1302_DateSet(&SysDate);//ÉèÖÃʱ&frac14;ä } if((setn==8)&&(xinlvMax-xinlvMin>1))xinlvMin++; if((setn==9)&&(xinlvMax<300))xinlvMax++; if((setn==10)&&(spo2Min<200))spo2Min++; if((setn==11)&&(tempMax-tempMin>1))tempMin++; if((setn==12)&&(tempMax<999))tempMax++; DisplaySetValue(); } if(keynum==3)//&frac14;õ { if(setn == 1)//ÉèÖÃÄê { if(SysDate.year == 0)SysDate.year=100; SysDate.year --; DS1302_DateSet(&SysDate); } if(setn == 2)//ÉèÖÃÔ { if(SysDate.mon == 1)SysDate.mon=13; SysDate.mon --; if((SysDate.mon==4)||(SysDate.mon==6)||(SysDate.mon==9)||(SysDate.mon==11)) { if(SysDate.day>30) SysDate.day=1; } else { if(SysDate.mon==2) { if(p_r==1) { if(SysDate.day>29) SysDate.day=1; } else { if(SysDate.day>28) SysDate.day=1; } } } DS1302_DateSet(&SysDate); } if(setn == 3)//ÉèÖÃÈÕ { SysDate.day --; if((SysDate.mon==1)||(SysDate.mon==3)||(SysDate.mon==5)||(SysDate.mon==7)||(SysDate.mon==8)||(SysDate.mon==10)||(SysDate.mon==12)) { if(SysDate.day==0) SysDate.day=31; } else { if(SysDate.mon==2) { if(p_r==1) { if(SysDate.day==0) SysDate.day=29; } else { if(SysDate.day==0) SysDate.day=28; } } else { if(SysDate.day==0) SysDate.day=30; } } DS1302_DateSet(&SysDate); } if(setn == 4)//ÉèÖÃÐÇÆÚ { if(SysDate.week == 1)SysDate.week=8; SysDate.week --; DS1302_DateSet(&SysDate); } if(setn == 5)//ÉèÖÃʱ { if(SysDate.hour == 0)SysDate.hour=24; SysDate.hour --; DS1302_DateSet(&SysDate); } if(setn == 6)//ÉèÖÃ·Ö { if(SysDate.min == 0)SysDate.min=60; SysDate.min --; DS1302_DateSet(&SysDate); } if(setn == 7)//ÉèÖÃÃë { if(SysDate.sec == 0)SysDate.sec=60; SysDate.sec --; DS1302_DateSet(&SysDate); } if((setn==8)&&(xinlvMin>0))xinlvMin--; if((setn==9)&&(xinlvMax-xinlvMin>1))xinlvMax--; if((setn==10)&&(spo2Min>0))spo2Min--; if((setn==11)&&(tempMin>0))tempMin--; if((setn==12)&&(tempMax-tempMin>1))tempMax--; DisplaySetValue(); } if(keynum==4)//&sup2;&frac12;ÊýÇåÁã { bushu = 0; Store_Data();//´æ´¢Êý&frac34;Ý } } void UsartSendReceiveData(void) //´®¿Ú·¢ËÍ&frac12;ÓÊÕÊý&frac34;Ý { char *str1=0,i; int setValue=0; char setvalue[4]={0}; if(STM32_Rx1Counter > 0) { DelayMs(20); if(strstr(STM32_RX1_BUF,"setHeartMin:")!=NULL) //&frac12;ÓÊÕµ&frac12;ÉèÖÃÐÄÂÊÏÂÏÞµÄÖ¸Áî { str1 = strstr(STM32_RX1_BUF,"setHeartMin:"); while(*str1 < '0' || *str1 > '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { str1 = str1 + 1; DelayMs(10); } i = 0; while(*str1 >= '0' && *str1 <= '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { setvalue[i] = *str1; i ++; str1 ++; if(*str1 == '\r')break; //»»Ðзû£¬Ö±&frac12;ÓÍ˳öwhileÑ­»· DelayMs(10); } setvalue[i] = '\0'; //&frac14;ÓÉÏ&frac12;áÎ&sup2;·û setValue = atoi(setvalue); if(setValue>=0 && setValue<=300) { xinlvMin = setValue; //ÉèÖõÄÐÄÂÊÏÂÏÞ DisplaySetValue(); Store_Data();//´æ´¢Êý&frac34;Ý } } if(strstr(STM32_RX1_BUF,"setHeartMax:")!=NULL) //&frac12;ÓÊÕµ&frac12;ÉèÖÃÐÄÂÊÉÏÏÞµÄÖ¸Áî { str1 = strstr(STM32_RX1_BUF,"setHeartMax:"); while(*str1 < '0' || *str1 > '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { str1 = str1 + 1; DelayMs(10); } i = 0; while(*str1 >= '0' && *str1 <= '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { setvalue[i] = *str1; i ++; str1 ++; if(*str1 == '\r')break; //»»Ðзû£¬Ö±&frac12;ÓÍ˳öwhileÑ­»· DelayMs(10); } setvalue[i] = '\0'; //&frac14;ÓÉÏ&frac12;áÎ&sup2;·û setValue = atoi(setvalue); if(setValue>=0 && setValue<=300) { xinlvMax = setValue; //ÉèÖõÄÐÄÂÊÉÏÏÞ DisplaySetValue(); Store_Data();//´æ´¢Êý&frac34;Ý } } if(strstr(STM32_RX1_BUF,"setSpo2Min:")!=NULL) //&frac12;ÓÊÕµ&frac12;ÉèÖÃѪÑõÏÂÏÞµÄÖ¸Áî { str1 = strstr(STM32_RX1_BUF,"setSpo2Min:"); while(*str1 != ':') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { str1 = str1 + 1; DelayMs(10); } str1 = str1 + 1; i = 0; while(*str1 >= '0' && *str1 <= '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { setvalue[i] = *str1; i ++; str1 ++; if(*str1 == '\r')break; //»»Ðзû£¬Ö±&frac12;ÓÍ˳öwhileÑ­»· DelayMs(10); } setvalue[i] = '\0'; //&frac14;ÓÉÏ&frac12;áÎ&sup2;·û setValue = atoi(setvalue); if(setValue>=0 && setValue<=200) { spo2Min = setValue; //ÉèÖõÄѪÑõÏÂÏÞ DisplaySetValue(); Store_Data();//´æ´¢Êý&frac34;Ý } } if(strstr(STM32_RX1_BUF,"setTempMin:")!=NULL) //&frac12;ÓÊÕµ&frac12;ÉèÖÃζÈÏÂÏÞµÄÖ¸Áî { str1 = strstr(STM32_RX1_BUF,"setTempMin:"); while(*str1 < '0' || *str1 > '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { str1 = str1 + 1; DelayMs(10); } i = 0; while(*str1 >= '0' && *str1 <= '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { setvalue[i] = *str1; i ++; str1 ++; if(*str1 == '.')break; //»»Ðзû£¬Ö±&frac12;ÓÍ˳öwhileÑ­»· DelayMs(10); } if(*str1 == '.') { str1 = str1 + 1; } if(*str1 >= '0' && *str1 <= '9') { setvalue[i] = *str1; } i = i + 1; setvalue[i] = '\0'; //&frac14;ÓÉÏ&frac12;áÎ&sup2;·û setValue = atoi(setvalue); if(setValue>=0 && setValue<=999) { tempMin = setValue; //ÉèÖõÄζÈÏÂÏÞ DisplaySetValue(); Store_Data();//´æ´¢Êý&frac34;Ý } } if(strstr(STM32_RX1_BUF,"setTempMax:")!=NULL) //&frac12;ÓÊÕµ&frac12;ÉèÖÃζÈÉÏÏÞµÄÖ¸Áî { str1 = strstr(STM32_RX1_BUF,"setTempMax:"); while(*str1 < '0' || *str1 > '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { str1 = str1 + 1; DelayMs(10); } i = 0; while(*str1 >= '0' && *str1 <= '9') //ÅжÏÊÇ&sup2;»ÊÇ0µ&frac12;9ÓÐЧÊý×Ö { setvalue[i] = *str1; i ++; str1 ++; if(*str1 == '.')break; //»»Ðзû£¬Ö±&frac12;ÓÍ˳öwhileÑ­»· DelayMs(10); } if(*str1 == '.') { str1 = str1 + 1; } if(*str1 >= '0' && *str1 <= '9') { setvalue[i] = *str1; } i = i + 1; setvalue[i] = '\0'; //&frac14;ÓÉÏ&frac12;áÎ&sup2;·û setValue = atoi(setvalue); if(setValue>=0 && setValue<=999) { tempMax = setValue; //ÉèÖõÄζÈÉÏÏÞ DisplaySetValue(); Store_Data();//´æ´¢Êý&frac34;Ý } } if(strstr(STM32_RX1_BUF,"stepsClear")!=NULL) //ÊÕµ&frac12;&sup2;&frac12;ÊýÇåÁãÖ¸Áî { BEEP = 1; DelayMs(80); BEEP = 0; bushu = 0; Store_Data(); //´æ´¢Êý&frac34;Ý } memset(STM32_RX1_BUF, 0, STM32_RX1BUFF_SIZE);//Çå³ý»º´æ STM32_Rx1Counter = 0; } /* À¶ÑÀ·¢ËÍÊý&frac34*/ if(sendFlag==1) { sendFlag = 0; printf("$Heartrate:%d#,$Spo2:%d#,$Temperature:%4.1f#,",hrAvg,spo2Avg,(float)temperature/10); printf("$Steps:%d#",bushu); if(fallTime==0)printf("fall"); if(sendSetValueFlag==1) { sendSetValueFlag=0; DelayMs(200); printf("$setHeartMin:%d#,",xinlvMin); printf("$setHeartMax:%d#,",xinlvMax); printf("$setSpo2Min:%d#,",spo2Min); printf("$setTempMin:%4.1f#,",(float)tempMin/10); printf("$setTempMax:%4.1f#,",(float)tempMax/10); } } } int main(void) { unsigned char i; DelayInit(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ&frac14;ÓÅÏÈ&frac14;¶£¬2λÏìÓ¦ÓÅÏÈ&frac14;¶ I2C_Configuration(); //IIC³õÊ&frac14;»¯ OLED_Init(); //OLED³õÊ&frac14;»¯ KEY_Init(); //°´&frac14;ü³õÊ&frac14;»¯ DelayMs(200); CheckNewMcu(); OLED_CLS();//ÇåÆÁ DS18B20_Init(); DS1302_Init(&SysDate); DelayMs(100); for(i=0;i<8;i++)OLED_ShowCN(i*16,2,i+8,0);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£º»¶Ó­Ê¹ÓÃʹÄÜÊÖ»· DelayMs(1000); OLED_CLS();//ÇåÆÁ DS1302_DateRead(&SysDate);//¶Áʱ&frac14;ä OLED_CLS();//ÇåÆÁ for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÐÄÂÊ for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÑªÑõ for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£º&sup2;&frac12;Êý OLED_ShowCentigrade(112, 2); //¡æ IIC_init();//IIC³õÊ&frac14;»¯ uart1_Init(9600); adxl345_init();//ADXL345³õÊ&frac14;»¯ Init_MAX30102();//MAX30102³õÊ&frac14;»¯ TIM2_Init(99,719); //¶¨Ê±Æ÷³õÊ&frac14;»¯£¬¶¨Ê±1ms //Tout = ((arr+1)*(psc+1))/Tclk ; //Tclk:¶¨Ê±Æ÷ÊäÈëÆµÂÊ(µ¥Î»MHZ) //Tout:¶¨Ê±Æ÷Òç³öʱ&frac14;ä(µ¥Î»us) while(1) { shanshuo=!shanshuo; KeySettings(); DisplayTime(); if(setn == 0)//&sup2;»ÔÚÉèÖÃ״̬Ï£¬¶ÁÈ¡Ïà¹ØÊý&frac34;Ý { DisplayTemperature(); GetSteps(); GetHeartRateSpO2(); if(fallTime==0) { if(displayfall==0) { displayfall=1; OLED_CLS();//ÇåÆÁ for(i=0;i<3;i++)OLED_ShowCN(i*16+48,2,i+64,0);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºµøµ¹ UsartSendReceiveData(); DelayMs(1000);DelayMs(1000); OLED_CLS();//ÇåÆÁ for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÐÄÂÊ for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£ºÑªÑõ for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//&sup2;âÊÔÏÔÊ&frac34;ÖÐÎÄ£º&sup2;&frac12;Êý OLED_ShowCentigrade(112, 2); //¡æ } } } UsartSendReceiveData(); DelayMs(10); } } void TIM2_IRQHandler(void)//¶¨Ê±Æ÷2ÖжϷþÎñ³ÌÐò£¬ÓÃÓÚ&frac14;ÇÂ&frac14;ʱ&frac14;ä { static u16 timeCount1 = 0; static u16 timeCount3 = 0; if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //&frac14;ì&sup2;éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´ { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //Çå³ýÖжϱêÖ&frac34;λ timeCount1 ++; if(timeCount1 >= 800) { timeCount1 = 0; sendFlag = 1; if(tiltFlag) { if(fallTime>0)fallTime--; //µøµ¹Ê±&frac14;äµ¹&frac14;ÆÊ± } } timeCount3 ++; if(timeCount3 >= 100) { timeCount3=0; if(fallTime==0){ //µøµ¹·äÃùÆ÷±¨&frac34;¯ BEEP=1; } else { if(((hrAvg!=0)&&(hrAvg>=xinlvMax||hrAvg<=xinlvMin))||((spo2Avg!=0)&&(spo2Avg<=spo2Min))||(temperature>=tempMax||temperature<=tempMin))//&sup2;»ÔÚ·¶Î§·äÃùÆ÷±¨&frac34;¯ { BEEP=~BEEP; beepFlag|=0x01; }else { beepFlag&=0xFE; BEEP=0; } } } } }
最新发布
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值