mmuuss586 发表于 2014-5-18 09:28 
判断按键下降沿,每检测到1次按键从高电平到低电平的变化,切换显示就好了; ...
#include <iostm8s003f3.h>
#define uchar unsigned char
#define uint unsigned int
#define led1_off PD_ODR|=0x10
#define led1_on PD_ODR&=~0x10 //PD4
#define led2_off PA_ODR|=0x08
#define led2_on PA_ODR&=~0x08 //PA3
#define cs_1 PC_ODR|=0x20
#define cs_0 PC_ODR&=~0x20 //PC5
#define clk_1 PC_ODR|=0x40
#define clk_0 PC_ODR&=~0x40 //PC6
#define di_1 PC_ODR|=0x80
#define di_0 PC_ODR&=~0x80 //PC7
#define tc_1 PD_ODR|=0X04
#define tc_0 PD_ODR&=~0X04 //PD2
#define tc1_1 PD_ODR|=0X08
#define tc1_0 PD_ODR&=~0X08 //PD3
#define tc (PD_IDR&0X04)>>2 //PD2
#define tc1 (PD_IDR&0X08)>>3 //PD3
#define set (PB_IDR&0X20)>>5 //PB5
const uchar sz[]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f};
float temp1;
float temp2;
float xx;
void delayms(uint x)
{
uint m,n;
for(m=0;m<100;m++)
for(n=0;n<x;n++){;;;};
}
/********************************************/
void delay(uint US)
{
uint i;
US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
////////////////////////////////////////////
void GPIO_init(void)
{
CLK_CKDIVR = 0x08;
PA_DDR = 0xff; // 配置PD端口的方向寄存器PD3输出
PA_CR1 = 0xff; // 设置PD3为推挽输出
PA_CR2 = 0xff;
PB_DDR = 0xdf; // 配置PD端口的方向寄存器PD3输出
PB_CR1 = 0xff; // 设置PD3为推挽输出
// PB_CR2 = 0xff;
PD_DDR = 0xff; // 配置PD端口的方向寄存器PD3输出
PD_CR1 = 0xff; // 设置PD3为推挽输出
PD_CR2 = 0xff;
PE_DDR = 0xff; // 配置PD端口的方向寄存器PD3输出
PE_CR1 = 0xff; // 设置PD3为推挽输出
PE_CR2 = 0xff;
PC_DDR = 0xff; // 配置PD端口的方向寄存器PD3输出
PC_CR1 = 0xff; // 设置PD3为推挽输出
PC_CR2 = 0xff;
}
void clk_init(void)
{
CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M
}
void init_devices(void)
{
asm("sim"); // 关全局中断
clk_init();
GPIO_init();
//tim1_init();
asm("rim"); // 开全局中断
}
////////////////////////////////////////////////
//////////////复位//////////////////////////////
void B20_init(void)
{
tc_0; //配置为输出 //拉低
delay(600); //等待600微秒
tc_1; //释放总线
delay(60); //等待60微秒
PD_DDR=0x04; //配置为输入
while(tc); //等待DS18B20拉低
while(!(tc)); //等待DS18B20释放总线
}
uchar B20_readB(void)
{
uchar i,retd=0;
for(i=0;i<8;i++) //位计数值
{
retd>>=1; //右移,准备接受新的数据位
tc_0; //配置为输出 //拉低,启动读数据位
tc_1; //释放总线
delay(5); //等待5微秒
PD_DDR=0x04; //配置为输入,开始读取数据位
if(tc) //该位是否为高
{
retd|=0x80;//是就将此位置高
}
delay(50); //等待50微秒
}
return retd; //将读到的一个字节返回
}
void B20_writeB(uchar wrd)
{
uchar i;
for(i=0;i<8;i++) //位计数值
{
tc_0; //配置为输出 //拉低,启动写数据位
delay(1); //等待1微秒
if(wrd&0x01) //此位数据是否为高
{
tc_1; //是高则将单总线拉高
}
else
{
tc_0; //是低则将单总线拉低
}
delay(50); //等待50微秒
tc_1; //释放总线
wrd>>=1; //右移,为写入新的数据位做准备
}
delay(50); //等待50微秒
}
float Read_temp(void)
{
uint templ,temph;
// uint temp;
B20_init(); //初始化,每次写命令都从初始化开始
B20_writeB(0xcc); //跳过ROM
B20_writeB(0x44); //启动温度转换
B20_init(); //初始化,每次写命令都从初始化开始
B20_writeB(0xcc); //跳过ROM
B20_writeB(0xbe); //读寄存器
templ=B20_readB(); //读温度低字节
temph=B20_readB(); //读温度高字节
B20_init();
temp1=(templ|(temph<<8))*0.625; //将温度整理成16位变量
return temp1; //返回16位变量
}
////////////////////////////////////////////////////////
/////////////////////////wendu2////////////////////////
void B20_init1(void)
{
//配置为输出 //拉低
tc1_0;
delay(600); //等待600微秒
tc1_1; //释放总线
delay(60); //等待60微秒
PD_DDR=0x08; //配置为输入
while(tc1); //等待DS18B20拉低
while(!(tc1)); //等待DS18B20释放总线
}
uchar B20_readB1(void)
{
uchar i,retd=0;
for(i=0;i<8;i++) //位计数值
{
retd>>=1; //右移,准备接受新的数据位
tc1_0; //配置为输出 //拉低,启动读数据位
tc1_1; //释放总线
delay(5); //等待5微秒
PD_DDR=0x08; //配置为输入,开始读取数据位
if(tc1) //该位是否为高
{
retd|=0x80;//是就将此位置高
}
delay(50); //等待50微秒
}
return retd; //将读到的一个字节返回
}
void B20_writeB1(uchar wrd)
{
uchar i;
for(i=0;i<8;i++) //位计数值
{
tc1_0; //配置为输出 //拉低,启动写数据位
delay(1); //等待1微秒
if(wrd&0x01) //此位数据是否为高
{
tc1_1; //是高则将单总线拉高
}
else
{
tc1_0; //是低则将单总线拉低
}
delay(50); //等待50微秒
tc1_1; //释放总线
wrd>>=1; //右移,为写入新的数据位做准备
}
delay(50); //等待50微秒
}
float Read_temp1(void)
{
uint templ,temph;
B20_init1(); //初始化,每次写命令都从初始化开始
B20_writeB1(0xcc); //跳过ROM
B20_writeB1(0xbe); //读寄存器
delay(30);
templ=B20_readB1(); //读温度低字节
temph=B20_readB1(); //读温度高字节
B20_init1(); //初始化,每次写命令都从初始化开始
B20_writeB1(0xcc); //跳过ROM
B20_writeB1(0x44); //启动温度转换
temp2=(templ|(temph<<8))*0.625; //将温度整理成16位变量
return temp2; //返回16位变量
}
////////////////////////显示///////////////////////////
void send(uchar x)
{
uchar i;
cs_0;
for(i=0;i<8;i++)
{
clk_0;
if((x&0x01)!=0){di_1;}else di_0;
clk_1;
x=x>>1;
};
}
void disp(uint sd,uchar kz)
{ uchar aa[4];
if(kz==0)
{
aa[0]=sd/1000;
aa[1]=sd%1000/100;
aa[2]=sd%100/10;
aa[3]=sd%10;
di_1;
clk_1;
cs_1;
send(0x40);
cs_1;
send(0xc0);
send(sz[aa[0]]);
send(0xc2);
send(sz[aa[1]]);
send(0xc4);
send(sz[aa[2]]);
send(0xc6);
send(sz[aa[3]]);
cs_1;
send(0x8c);
cs_1;
}else
{
}
}
////////////////////////////////////////////////////////////////
/******************************按键选择路数*****************************/
uchar kk=1;
void key()
{
if(set==0){delayms(1000);kk++;};
if(kk==1){led1_on;led2_off;xx=temp2;};
if(kk==2){led1_off;led2_on;xx=temp1;};
if(kk>2)kk=1;
}
//////////////////主函数/////////////////////////
void main()
{
// init_devices();//系统初始化
GPIO_init();
led1_off;
led2_off;
for(;;)
{
key();
temp1=Read_temp(); //读取温度1
temp2= Read_temp1();//读取温度2
disp(xx,0);
}
}
下载后无反应呢 感觉程序死到那一块了 郁闷了
|