大一寒假大年初一闲来无事,7天爆肝实验室祖传作业——多功能电子秤,本来实验室要求电子秤应该用51单片机写,但是学完32后想找个项目练练手,于是用32搓了一台电子秤。
电子秤采用多功能菜单,矩阵键盘与摇杆控制,电子秤可以自校准,用一次函数y=ax+b建模运算,计算后的参数可通过AT24C02储存,带有DS1302万年历,还有闹钟功能。
VID_20230129_180057
下面是主函数多功能菜单代码。
HX为重力秤。
xysw为摇杆控制,x,y为摇杆ADC采集数据。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "HX.h"
#include "OLED.h"
#include "xysw.h"
#include "ds1302.h"
#include "bigkey.h"
#include "buzzer.h"
#include "alarm.h"
#include "i2c.h"
#include "24c02.h"
char menu[3][15]={"clock setting","alarm","scale"};
uint16_t key,num,wei,p,d,re,d1,c,d,e,f;
uint32_t m,x1,cou,co,n;
int selectx,selecty,temp,temp2,temp3,alarm[3]={0};
int main()
{
OLED_Init();
i2c_Init();
// OLED_ShowString(1,4,"multsclae");
// OLED_ShowString(2,6,"BOS");
re=0;
temp2=0; //设置控制数
selectx=0;
selecty=0;
key=0;
temp=0;
//初始化
buzzer_Init();
hx_Init();
DS1302_Init();
DS1302_SetTime();
bigkey_Init();
xysw_Init();
alarm_Init();
// Delay_ms(1000);
while(1) //进入主界面
{
DS1302_ReadTime();
OLED_ShowNum(1,1,DS1302_Time[0]+2000,4); //year
OLED_ShowString(1,5,"-");
OLED_ShowNum(1,6,DS1302_Time[1],2);//month
OLED_ShowString(1,8,"-");
OLED_ShowNum(1,9,DS1302_Time[2],2);//date
OLED_ShowNum(2,1,DS1302_Time[3],2); //hour
OLED_ShowString(2,3,":");
OLED_ShowNum(2,4,DS1302_Time[4],2);//minate
OLED_ShowString(2,6,":");
OLED_ShowNum(2,7,DS1302_Time[5],2);//sound
OLED_ShowString(2,10,"week");
OLED_ShowNum(2,15,DS1302_Time[6],1);//day
OLED_ShowNum(3,1,dr[0],4); //Y UP MAX
OLED_ShowNum(3,6,dr[1],4); //X RIGHT MAX
OLED_ShowString(4,11,"menu");
readxy();
OLED_ShowSignedNum(4,4,x,1);
OLED_ShowSignedNum(4,6,y,1);
//进入菜单界面
if(x==1)
{
OLED_Clear();
while(1)
{
readxy();
OLED_ShowString(1,1,menu[0]);
OLED_ShowString(2,1,menu[1]);
OLED_ShowString(3,1,menu[2]);
if(y==1) selecty++;
if(y==-1) selecty--;
if(selectx==-1) selectx=0; //防控制数溢出
if(selectx==2) selectx=1;
if(selecty==0) selecty=1;
if(selecty==4) selecty=3;
if(selecty)
{
if(selecty!=temp) //when selety change clear oled 参数变化刷新一次
{
OLED_Clear();
temp=selecty;
}
OLED_ShowString(selecty,15,"<-");
}
//进入时钟调节界面
if(selecty==1&&x==1) //enter clock setting page
{
OLED_Clear();
selectx=0;
temp=0;
while(1)
{
readxy(); //read xy
if(selectx!=temp) //when selety change clear oled
{
OLED_Clear();
temp=selectx;
}
OLED_ShowNum(1,1,DS1302_Time[0]+2000,4); //year
OLED_ShowString(1,5,"-");
OLED_ShowNum(1,6,DS1302_Time[1],2);//month
OLED_ShowString(1,8,"-");
OLED_ShowNum(1,9,DS1302_Time[2],2);//date
OLED_ShowNum(3,3,DS1302_Time[3],2); //hour
OLED_ShowString(3,5,":");
OLED_ShowNum(3,6,DS1302_Time[4],2);//minate
OLED_ShowString(3,8,":");
OLED_ShowNum(3,9,DS1302_Time[5],2);//sound
OLED_ShowString(3,11,"week");
OLED_ShowNum(3,15,DS1302_Time[6],1);//day
if(x==1) selectx++; //遥感数据转变为 选择参数
if(x==-1) selectx--;
if(selectx==-1) {selectx=0;x=0;break;} //out
if(0<selectx&&selectx<4 ) OLED_ShowString(2,selectx*3,"||");
if(3<selectx&&selectx<8 ) OLED_ShowString(4,(selectx-3)*3,"||");
if(selectx==8) selectx=7;
// show over
//show change
if(selectx==1&&y==1) //年设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(1,1,DS1302_Time[0]+2000,4); //year
OLED_ShowString(1,5,"-");
OLED_ShowNum(1,6,DS1302_Time[1],2);//month
OLED_ShowString(1,8,"-");
OLED_ShowNum(1,9,DS1302_Time[2],2);//date
while(1)
{
readxy();
if(y==1) DS1302_Time[0]++;
if(y==-1) DS1302_Time[0]--;
if(x==-1) {x=0;break;}
if(DS1302_Time[0]>99){DS1302_Time[0]=0;}
if(DS1302_Time[0]<0){DS1302_Time[0]=99;}
OLED_ShowNum(1,1,DS1302_Time[0]+2000,4);
}
}
if(selectx==2&&y==1) //月设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(1,1,DS1302_Time[0]+2000,4); //year
OLED_ShowString(1,5,"-");
OLED_ShowNum(1,6,DS1302_Time[1],2);//month
OLED_ShowString(1,8,"-");
OLED_ShowNum(1,9,DS1302_Time[2],2);//date
while(1)
{
readxy();
if(y==1) DS1302_Time[1]++;
if(y==-1) DS1302_Time[1]--;
if(x==-1) {x=0;break;}
if(DS1302_Time[1]>12){DS1302_Time[1]=1;}
if(DS1302_Time[1]<1){DS1302_Time[1]=12;}
OLED_ShowNum(1,6,DS1302_Time[1],2);
}
}
if(selectx==3&&y==1) //日设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(1,1,DS1302_Time[0]+2000,4); //year
OLED_ShowString(1,5,"-");
OLED_ShowNum(1,6,DS1302_Time[1],2);//month
OLED_ShowString(1,8,"-");
OLED_ShowNum(1,9,DS1302_Time[2],2);//date
while(1)
{
readxy();
if(y==1) DS1302_Time[2]++;
if(y==-1) DS1302_Time[2]--;
if(x==-1) {x=0;break;}
if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 ||
DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
{
if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
}
else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
{
if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
}
else if(DS1302_Time[1]==2)
{
if(DS1302_Time[0]%4==0)
{
if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
}
else
{
if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
}
}
if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 ||
DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
{
if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月
}
else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
{
if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月
}
else if(DS1302_Time[1]==2)
{
if(DS1302_Time[0]%4==0)
{
if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月
}
else
{
if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
}
}
OLED_ShowNum(1,9,DS1302_Time[2],2);
}
}
if(selectx==4&&y==1) //小时设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(3,3,DS1302_Time[3],2); //hour
OLED_ShowString(3,5,":");
OLED_ShowNum(3,6,DS1302_Time[4],2);//minate
OLED_ShowString(3,8,":");
OLED_ShowNum(3,9,DS1302_Time[5],2);//sound
OLED_ShowString(3,11,"week");
OLED_ShowNum(3,15,DS1302_Time[6],1);//day
while(1)
{
readxy();
if(y==1) DS1302_Time[3]++;
if(y==-1) DS1302_Time[3]--;
if(x==-1) {x=0;break;}
if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断
OLED_ShowNum(3,3,DS1302_Time[3],2);
}
}
if(selectx==5&&y==1) //分钟设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(3,3,DS1302_Time[3],2); //hour
OLED_ShowString(3,5,":");
OLED_ShowNum(3,6,DS1302_Time[4],2);//minate
OLED_ShowString(3,8,":");
OLED_ShowNum(3,9,DS1302_Time[5],2);//sound
OLED_ShowString(3,11,"week");
OLED_ShowNum(3,15,DS1302_Time[6],1);//day
while(1)
{
readxy();
if(y==1) DS1302_Time[4]++;
if(y==-1) DS1302_Time[4]--;
if(x==-1) {x=0;break;}
if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断
if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
OLED_ShowNum(3,6,DS1302_Time[4],2);
}
}
if(selectx==6&&y==1) //秒设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(3,3,DS1302_Time[3],2); //hour
OLED_ShowString(3,5,":");
OLED_ShowNum(3,6,DS1302_Time[4],2);//minate
OLED_ShowString(3,8,":");
OLED_ShowNum(3,9,DS1302_Time[5],2);//sound
OLED_ShowString(3,11,"week");
OLED_ShowNum(3,15,DS1302_Time[6],1);//day
while(1)
{
readxy();
if(y==1) DS1302_Time[5]++;
if(y==-1) DS1302_Time[5]--;
if(x==-1) {x=0;break;}
if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断
if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
OLED_ShowNum(3,9,DS1302_Time[5],2);
}
}
if(selectx==7&&y==1) //秒设置
{
OLED_Clear();
Delay_ms(100);
OLED_ShowNum(3,3,DS1302_Time[3],2); //hour
OLED_ShowString(3,5,":");
OLED_ShowNum(3,6,DS1302_Time[4],2);//minate
OLED_ShowString(3,8,":");
OLED_ShowNum(3,9,DS1302_Time[5],2);//sound
OLED_ShowString(3,11,"week");
OLED_ShowNum(3,15,DS1302_Time[6],1);//day
while(1)
{
readxy();
if(y==1) DS1302_Time[6]++;
if(y==-1) DS1302_Time[6]--;
if(x==-1) {x=0;break;}
if(DS1302_Time[6]>7){DS1302_Time[6]=1;}//秒越界判断
if(DS1302_Time[6]<1){DS1302_Time[6]=7;}//秒越界判断
OLED_ShowNum(3,15,DS1302_Time[6],1);
}
}
}
selectx=0;
temp=0;
DS1302_SetTime();
}
//闹钟调节
if(selecty==2&&x==1) //enter alarm page
{
OLED_Clear();
while(1)
{
//参数变动屏幕刷新
if(selectx!=temp) //when seletx change clear oled
{
OLED_Clear();
temp=selectx;
}
if(selecty!=temp2) //when selety change clear oled
{
OLED_Clear();
temp2=selecty;
}
readxy();
OLED_ShowSignedNum(4,1,selectx,2);
OLED_ShowSignedNum(4,4,selecty,2);
OLED_ShowNum(2,3,alarm[0],2); //hour
OLED_ShowString(2,5,":");
OLED_ShowNum(2,6,alarm[1],2);//minate
OLED_ShowString(2,8,":");
OLED_ShowNum(2,9,alarm[2],2);//sound
OLED_ShowString(2,12,"go");
if(x==1) selectx++; //遥感数据转变为 选择参数
if(x==-1) {selectx--;x=0;}
if(selectx==-1) {selectx=0;x=0;break;} //out
if(0<selectx&&selectx<5 ) OLED_ShowString(3,selectx*3,"||");
if(selectx==5) selectx=4;
// show over
//show change
//hour
if(selectx==1&&y==1)
{
if(0<selectx&&selectx<5 ) OLED_ShowString(3,selectx*3,"| ");
Delay_ms(100);
OLED_ShowNum(2,3,alarm[0],2); //hour
OLED_ShowString(2,5,":");
OLED_ShowNum(2,6,alarm[1],2);//minate
OLED_ShowString(2,8,":");
OLED_ShowNum(2,9,alarm[2],2);//sound
while(1)
{
readxy();
if(y==1) alarm[0]++;
if(y==-1) alarm[0]--;
if(x==-1) {x=0;break;}
if(alarm[0]>24){alarm[0]=0;}
if(alarm[0]<0) {alarm[0]=24;}
OLED_ShowNum(2,3,alarm[0],2); //hour
}
}
//minate
if(selectx==2&&y==1)
{
if(0<selectx&&selectx<5 ) OLED_ShowString(3,selectx*3,"| ");
Delay_ms(100);
OLED_ShowNum(2,3,alarm[0],2); //hour
OLED_ShowString(2,5,":");
OLED_ShowNum(2,6,alarm[1],2);//minate
OLED_ShowString(2,8,":");
OLED_ShowNum(2,9,alarm[2],2);//sound
OLED_ShowString(2,12,"go");
while(1)
{
readxy();
if(y==1) alarm[1]++;
if(y==-1) alarm[1]--;
if(x==-1) {x=0;break;}
if(alarm[1]>59){alarm[1]=0;}
if(alarm[1]<0){alarm[1]=59;}
OLED_ShowNum(2,6,alarm[1],2);
}
}
//sound
if(selectx==3&&y==1)
{
if(0<selectx&&selectx<5 ) OLED_ShowString(3,selectx*3,"| ");
Delay_ms(100);
OLED_ShowNum(2,3,alarm[0],2); //hour
OLED_ShowString(2,5,":");
OLED_ShowNum(2,6,alarm[1],2);//minate
OLED_ShowString(2,8,":");
OLED_ShowNum(2,9,alarm[2],2);//sound
OLED_ShowString(2,12,"go");
while(1)
{
readxy();
if(y==1) alarm[2]++;
if(y==-1) alarm[2]--;
if(x==-1) {x=0;break;}
if(alarm[2]>59){alarm[2]=0;}
if(alarm[2]<0){alarm[2]=59;}
OLED_ShowNum(2,9,alarm[2],2);
}
}
//go
if(selectx==4&&y==1)
{
if(0<selectx&&selectx<5 ) OLED_ShowString(3,selectx*3,"| ");
Delay_ms(100);
alarm_Enable();
}
tim=60*60*alarm[0]+60*alarm[1]+alarm[2];
OLED_ShowNum(1,3,tim-i2+1,6);
OLED_ShowNum(3,3,tim,6);
OLED_ShowNum(3,10,i2,6);
OLED_ShowString(1,10,"sound");
if(x==-1) {x=0;break;}
}
OLED_Clear();
selectx=0;
temp=0;
}
if(selecty==3&&x==1) //enter scale page //秤的使用与校准
{
selecty=0;
while(1)
{
readxy();
if(selectx!=temp) //when seletx change clear oled
{
OLED_Clear();
temp=selectx;
}
if(selecty!=temp2) //when selety change clear oled
{
OLED_Clear();
temp2=selecty;
OLED_ShowString(selecty,15,"<-");
}
if(y==1) selecty++;
if(y==-1) selecty--;
if(selecty==0) selecty=1;
if(selecty==4) selecty=3;
OLED_ShowSignedNum(4,1,selectx,2);
OLED_ShowSignedNum(4,4,selecty,2);
OLED_ShowString(1,1,"pmscale");
OLED_ShowString(2,1,"dnscale");
OLED_ShowString(3,1,"calibration");
if(selecty==1&&x==1) //进入pm计价秤
{
OLED_Clear();
while(1)
{
readxy();
wei=weight();
OLED_ShowString(1,7,"kg");
OLED_ShowString(1,3,".");
OLED_ShowString(2,1,"p=");
OLED_ShowString(2,5,".");
OLED_ShowString(2,8,"m=");
OLED_ShowString(2,13,".");
OLED_ShowNum(1,1,wei/1000,2);
OLED_ShowNum(1,4,wei%1000,3);
key=bigkeyread();
if(key)
{
if(key<11)
{
p*=10;
p=p+key%10;
if(p>9999) p/=10;
}
if(key==11)
{
p/=10;
}
}
OLED_ShowNum(2,3,p/100,2);
OLED_ShowNum(2,6,p%1000,2);
m=p*wei;
OLED_ShowNum(3,1,m,9);
OLED_ShowNum(2,10,m/100000,3);
OLED_ShowNum(2,14,m/1000,2);
if(x==-1) {x=0;break;}
if(key!=0) num=key;
OLED_ShowNum(4,1,num,2);
}
OLED_Clear();
OLED_ShowString(selecty,15,"<-");
}
if(selecty==2&&x==1) //进入dn计价秤
{
OLED_Clear();
while(1)
{
readxy();
wei=weight();
OLED_ShowString(1,7,"kg");
OLED_ShowString(1,3,".");
OLED_ShowString(2,1,"d=");
OLED_ShowString(2,8,"n=");
OLED_ShowString(2,13,".");
OLED_ShowNum(1,1,wei/1000,2);
OLED_ShowNum(1,4,wei%1000,3);
key=bigkeyread();
if(key)
{
if(key<11)
{
d*=10;
d=d+key%10;
if(d>9999) d/=10;
}
if(key==11)
{
d/=10;
}
}
OLED_ShowNum(2,3,d,5);
n=wei/d*100000;
OLED_ShowNum(3,1,n,9);
OLED_ShowNum(2,10,n/100000,3);
OLED_ShowNum(2,14,n/1000,2);
if(x==-1) {x=0;break;}
if(key!=0) num=key;
OLED_ShowNum(4,1,num,2);
}
OLED_Clear();
OLED_ShowString(selecty,15,"<-");
}
if(selecty==3&&x==1) //进入校准模式
{
OLED_Clear();
cou=hx_Read();
co=cou;
while(1)
{
readxy();
wei=weight();
OLED_ShowString(1,1,"put thing");
cou=hx_Read();
OLED_ShowNum(2,1,d1,6);
OLED_ShowString(2,7,"g");
OLED_ShowNum(2,8,x1,8);
OLED_ShowNum(3,1,cou,15);
key=bigkeyread();
if(key)
{
if(key<11)
{
d*=10;
d=d+key%10;
if(d>9999) d/=10;
}
if(key==11)
{
d/=10;
}
if(key==13) //放入数据
{
d1=d;
d=0;
x1=cou;
}
if((key==14)&&(d1!=0)) //计算模型常量a b
{
a=(x1-co)/d1;
b=co/a;
}
}
OLED_ShowNum(4,1,d,6);
OLED_ShowNum(4,8,a,4);
OLED_ShowNum(4,13,b,4);
if(x==-1) {x=0;break;}
if(x==1) //把模型常量a b 放入24c02
{
AT24C02wdata2(1,a/255);
AT24C02wdata2(2,a%255);
AT24C02wdata2(3,b/255);
AT24C02wdata2(4,b%255);
OLED_Clear();
OLED_ShowString(1,1,"ok");
}
}
OLED_Clear();
OLED_ShowString(selecty,15,"<-");
}
if(x==-1) {x=0;break;}
}
selecty=3;
OLED_Clear();
}
OLED_ShowSignedNum(4,8,selectx,1);
OLED_ShowSignedNum(4,10,selecty,1);
OLED_ShowSignedNum(4,1,x,2);
OLED_ShowSignedNum(4,4,y,2);
if(x==-1) {x=0;break;} //退出菜单界面
}
OLED_Clear();
}
key=bigkeyread();
if(key!=0) num=key;
OLED_ShowNum(4,1,num,2);
}
}
下面为HX秤代码。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "24c02.h"
#define sck1 GPIO_SetBits(GPIOA,GPIO_Pin_12) //sck置1
#define sck0 GPIO_ResetBits(GPIOA,GPIO_Pin_12) //sck置0
#define dot GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11) //dot的值
uint16_t a,b;
void hx_Init() //端口初始化 A0 DOT A1 SCK
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
a=255*AT24C02rdata(1)+AT24C02rdata(2);
b=255*AT24C02rdata(3)+AT24C02rdata(4);
}
int i;
uint32_t count;
uint32_t hx_Read() //读取count
{
sck0; //变量初始化
count=0;
while(dot==1); //等待dot置0
for(i=0;i<24;i++) //dot置零后 一边sck置1 一边读取cot返回的数据
{
sck1; //sck拉高 让dot发出数据
Delay_us(1); //等待dot 发出数据
if(dot==1) {count++;count=count<<1;} //对dot两种状态分类讨论
if(dot==0) count=count<<1;
Delay_us(1); //sck 拉高后不能立即拉低 高电平时长一共2us
sck0; //sck拉低准备下次收数据
Delay_us(2); //准备时长2us起步
}
sck1; //脉冲发送至25次 让下次增益到128
Delay_us(2);
sck0;
return count;
}
int16_t weight() //count转化为实物重量
{
return hx_Read()/a-b; //转换函数
}
#ifndef __HX_h
#define __HX_h
void hx_Init();
uint32_t hx_Read();
extern uint32_t count;
int16_t weight();
extern uint16_t a,b;
#endif
下面为xysw摇杆代码。
#include "stm32f10x.h" // Device header
int dr[2]={0},x,y;
void xysw_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC分频
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_1Cycles5); //通道顺序 采样 分配
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,2,ADC_SampleTime_1Cycles5);
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel=2;
ADC_InitStruct.ADC_ScanConvMode=ENABLE;
ADC_Init(ADC1,&ADC_InitStruct);
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_BufferSize=2;
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC;
DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
DMA_InitStruct.DMA_MemoryBaseAddr=(uint32_t)dr;
DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_Mode=DMA_Mode_Circular;
DMA_InitStruct.DMA_PeripheralBaseAddr=(uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;
DMA_Init( DMA1_Channel1,&DMA_InitStruct);
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)==SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)==SET);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
x=0;
y=0;
}
void readxy()
{
if(1000<dr[1]&&dr[1]<3000) {x=0;Delay_ms(20);}
if(dr[1]>3000) {while(dr[1]>3000);Delay_ms(20);x=1;}
if(dr[1]<1000) {while(dr[1]<1000);Delay_ms(20);x=-1;}
if(1000<dr[0]&&dr[0]<3000) {y=0;Delay_ms(20);}
if(dr[0]>3000) {while(dr[0]>3000);y=1;Delay_ms(20);}
if(dr[0]<1000) {while(dr[0]<1000);y=-1;Delay_ms(20);}
}
#ifndef __xysw_h
#define __xysw_h
extern int dr[2],x,y;
void xysw_Init();
void readxy();
#endif
下面是DS1302代码。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
#define clk GPIO_Pin_15 //p36
#define dat GPIO_Pin_13 //p34
#define rst GPIO_Pin_14 //p35
#define rst1 GPIO_SetBits(GPIOB,rst)
#define rst0 GPIO_ResetBits(GPIOB,rst)
#define clk1 GPIO_SetBits(GPIOB,clk)
#define clk0 GPIO_ResetBits(GPIOB,clk)
#define dat1 GPIO_SetBits(GPIOB,dat)
#define dat0 GPIO_ResetBits(GPIOB,dat)
#define rdat GPIO_ReadInputDataBit(GPIOB,dat)
int DS1302_Time[]={23,2,17,19,20,0,1};
//unsigned char DS1302_Time[7]={0};
void DS1302_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=rst|clk|dat;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
rst0;
clk0;
dat0;
}
void write(uint16_t command,uint16_t data)
{
uint16_t i,temp;
rst1;
for(i=0;i<8;i++)
{
temp=command&(0x01<<i); //一位位的取command的数据
if(temp) dat1; //放上数据
if(temp==0) dat0;
clk1; //上升沿发送数
clk0;
}
for(i=0;i<8;i++)
{
temp=data&(0x01<<i);
if(temp) dat1;
if(temp==0) dat0;
clk1;
clk0;
}
rst0;
dat0;
}
uint16_t read(uint16_t command)
{
command|=0x01;
uint16_t i,temp,data;
rst1;
data=0;
for(i=0;i<8;i++)
{
temp=command&(0x01<<i);
if(temp) dat1;
if(temp==0) dat0;
clk0;
clk1;
}
GPIO_InitTypeDef GPIO_InitStruct; //定义dat为写入模式
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=dat;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
for(i=0;i<8;i++)
{
clk1; //下降沿让1302 把数据放在dat上
clk0;
if(rdat) data|=(0x01<<i);
}
rst0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //定义dat为默认输出模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Pin=dat;
GPIO_Init(GPIOB,&GPIO_InitStruct);
return data;
dat0;
}
void DS1302_SetTime(void)
{
write(DS1302_WP,0x00);
write(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
write(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
write(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
write(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
write(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
write(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
write(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
write(DS1302_WP,0x80);
}
void DS1302_ReadTime(void)
{
unsigned char Temp;
Temp=read(DS1302_YEAR);
DS1302_Time[0]=Temp/16*10+Temp%16;
Temp=read(DS1302_MONTH);
DS1302_Time[1]=Temp/16*10+Temp%16;
Temp=read(DS1302_DATE);
DS1302_Time[2]=Temp/16*10+Temp%16;
Temp=read(DS1302_HOUR);
DS1302_Time[3]=Temp/16*10+Temp%16;
Temp=read(DS1302_MINUTE);
DS1302_Time[4]=Temp/16*10+Temp%16;
Temp=read(DS1302_SECOND);
DS1302_Time[5]=Temp/16*10+Temp%16;
Temp=read(DS1302_DAY);
DS1302_Time[6]=Temp/16*10+Temp%16;
}
#ifndef __ds1302_h
#define __ds1302_h
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
extern int DS1302_Time[];
void DS1302_Init();
void DS1302_SetTime(void);
void DS1302_ReadTime(void);
uint16_t read(uint16_t command);
void write(uint16_t command,uint16_t data);
#endif
下面是矩阵代码。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#define p7 GPIO_Pin_0 //p17
#define p6 GPIO_Pin_1
#define p5 GPIO_Pin_2
#define p4 GPIO_Pin_3
#define p3 GPIO_Pin_4
#define p2 GPIO_Pin_5
#define p1 GPIO_Pin_6
#define p0 GPIO_Pin_7
void bigkey_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=p3|p2|p1|p0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=p7|p6|p5|p4;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
uint16_t bigkeyread()
{
uint16_t keynum;
keynum=0;
GPIO_SetBits(GPIOA,p3);
GPIO_SetBits(GPIOA,p2);
GPIO_SetBits(GPIOA,p1);
GPIO_SetBits(GPIOA,p0);
GPIO_ResetBits(GPIOA,p3);
if(GPIO_ReadInputDataBit(GPIOA,p7)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p7)==0);Delay_ms(20);keynum=1;}
if(GPIO_ReadInputDataBit(GPIOA,p6)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p6)==0);Delay_ms(20);keynum=5;}
if(GPIO_ReadInputDataBit(GPIOA,p5)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p5)==0);Delay_ms(20);keynum=9;}
if(GPIO_ReadInputDataBit(GPIOA,p4)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p4)==0);Delay_ms(20);keynum=13;}
GPIO_SetBits(GPIOA,p3);
GPIO_SetBits(GPIOA,p2);
GPIO_SetBits(GPIOA,p1);
GPIO_SetBits(GPIOA,p0);
GPIO_ResetBits(GPIOA,p2);
if(GPIO_ReadInputDataBit(GPIOA,p7)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p7)==0);Delay_ms(20);keynum=2;}
if(GPIO_ReadInputDataBit(GPIOA,p6)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p6)==0);Delay_ms(20);keynum=6;}
if(GPIO_ReadInputDataBit(GPIOA,p5)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p5)==0);Delay_ms(20);keynum=10;}
if(GPIO_ReadInputDataBit(GPIOA,p4)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p4)==0);Delay_ms(20);keynum=14;}
GPIO_SetBits(GPIOA,p3);
GPIO_SetBits(GPIOA,p2);
GPIO_SetBits(GPIOA,p1);
GPIO_SetBits(GPIOA,p0);
GPIO_ResetBits(GPIOA,p1);
if(GPIO_ReadInputDataBit(GPIOA,p7)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p7)==0);Delay_ms(20);keynum=3;}
if(GPIO_ReadInputDataBit(GPIOA,p6)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p6)==0);Delay_ms(20);keynum=7;}
if(GPIO_ReadInputDataBit(GPIOA,p5)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p5)==0);Delay_ms(20);keynum=11;}
if(GPIO_ReadInputDataBit(GPIOA,p4)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p4)==0);Delay_ms(20);keynum=15;}
GPIO_SetBits(GPIOA,p3);
GPIO_SetBits(GPIOA,p2);
GPIO_SetBits(GPIOA,p1);
GPIO_SetBits(GPIOA,p0);
GPIO_ResetBits(GPIOA,p0);
if(GPIO_ReadInputDataBit(GPIOA,p7)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p7)==0);Delay_ms(20);keynum=4;}
if(GPIO_ReadInputDataBit(GPIOA,p6)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p6)==0);Delay_ms(20);keynum=8;}
if(GPIO_ReadInputDataBit(GPIOA,p5)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p5)==0);Delay_ms(20);keynum=12;}
if(GPIO_ReadInputDataBit(GPIOA,p4)==0) {Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,p4)==0);Delay_ms(20);keynum=16;}
return keynum;
}
#ifndef __bigkey_h
#define __bigkey_h
void bigkey_Init();
uint16_t bigkeyread();
unsigned char MatrixKey();
#endif
下面是ALLAM代码。
#include "stm32f10x.h" // Device header
#include "buzzer.h"
#include "OLED.h"
#include "main.h"
int i2;
uint16_t tim;
void alarm_Init()
{
i2=0;
tim=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_Timebaseinitstructure;
TIM_Timebaseinitstructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_Timebaseinitstructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_Timebaseinitstructure.TIM_Period=10000-1;
TIM_Timebaseinitstructure.TIM_Prescaler=72000-1;
TIM_Timebaseinitstructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_Timebaseinitstructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_Initstructure;
NVIC_Initstructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_Initstructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_Initstructure);
TIM_Cmd(TIM2,DISABLE);
}
void alarm_Enable()
{
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
i2++;
if(i2==tim) {buzzer();i2=0;tim=0;TIM_Cmd(TIM2,DISABLE);OLED_Clear();main();}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
#ifndef __alarm_h
#define __alarm_h
void alarm_Init();
extern uint16_t tim;
extern int i2;
void alarm_Enable();
#endif