GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //连续多通道模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不
受外界决定
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //扫描通道数 ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5);
//通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。
ADC_Cmd(ADC1, ENABLE); //使能或者失能指定的ADC ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成 ADC_StartCalibration(ADC1);//开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
ADC_SoftwareStartConvCmd(ADC1 ,ENABLE);//使能或者失能指定的ADC的软件转换
启动功能
void ADC_Read(void) {
static u16 i; float he = 0; u16 j; mass = 0;
for(i=0;i<1000;i++){
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //检查制定ADC标志
位置1与否 ADC_FLAG_EOC 转换结束标志位
mass_get = ((float)ADC_GetConversionValue(ADC1)) / 4096 * 3.3;
adc_get[i] = mass_get ;
}
for(j=0;j<1000;j++){
he = he+adc_get[j]; }
void insertsort(float x[],int n){ int i , j; }
Keyboard.c部分程序如下: void update_key(void) {
unsigned char i, j;
for(i = 0; i < 4; i++) //i????,??????
{ GPIO_ResetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
float a;
for (i=0;i j=i; while (a < x[j]){ x[j+1] = x[j]; } x[j+1] = a; } j--; } mass_get = he/1000; mass_get = mass_get - mass00; adc = mass_get - mass0; mass = (0.7835*adc*adc*adc - 1.3802*adc*adc +1010.3*adc )/1000; for(j = 0; j < 4; j++) //j????,????????????? { if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0) { u16 t = 40000; while (t--); if (GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0) { key[i][j] = 1; key_down(i,j); //printf(\ //printf(\ //keypoint = 0 ; //delay_ms(300); } } } else { key[i][j] = 0; } } GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin); } Oled.c中部分程序如下: void show_mass(void){ switch(oled_point){ case 1 : //正常显示重量 show_string_and_mass(); break; case 0 : //显示系统内存已有单价,可以进行价格选择 OLED_ShowCHinese(0,0,14); OLED_ShowCHinese(16,0,15); OLED_ShowNum(28,3,danjia[0],1,1); OLED_ShowNum(36,3,danjia[1],1,1); OLED_ShowNum(44,3,danjia[2],1,1); OLED_ShowNum(52,3,danjia[3],1,1); break; case 2 : //键入单价界面 break; case 3 : //计价界面 jiage = mass * (danjia[0]*10 + danjia[1] + danjia[2]*0.1 + danjia[3]*0.01); get_char(price,jiage); OLED_ShowNum(20,3,price[4],1,1); OLED_ShowNum(28,3,price[3],1,1); OLED_ShowNum(36,3,price[2],1,1); OLED_ShowNum(44,3,price[1],1,1); } } OLED_ShowNum(52,3,price[0],1,1); OLED_ShowCHinese(60,3,16);//?? void show_m_by_number(void) { get_char(fanhaoyang,mass); } void get_char(u8 get[],float from){ u16 i = (u16)(from*1000); get[4] =(u8)(i/10000); get[3] =(u8)((i - get[4]*10000)/1000); get[2] =(u8)((i - get[4]*10000 - get[3]*1000) / 100); get[1] =(u8)((i - get[4]*10000 - get[3]*1000 - get[2]*100)/10); get[0] =(u8)(i - get[4]*10000 - get[3]*1000 - get[2]*100 - get[1]*10); get[5] = '\\0'; } OLED_ShowNum(20,3,fanhaoyang[4],1,1); OLED_ShowNum(28,3,fanhaoyang[3],1,1); OLED_ShowNum(36,3,fanhaoyang[2],1,1); OLED_ShowNum(44,3,fanhaoyang[1],1,1); OLED_ShowNum(52,3,fanhaoyang[0],1,1);