仔细看题
main.c
#include "stc15f2k60s2.h"
#include "system.h"
uint dat_u,dat_f;
void main()
{
close_fucker();
init_timer1();
init_timer0();
while(1)
{
if(flag_ad==1 && flag_da==0) //未做DAC ,有bug
{
flag_ad=0;
dat_u=read_pcf3();
dat_u = dat_u/255.0f*500; //先除后乘,追最大值可到500
}
else if(flag_da==1)
{
flag_da=0;
dat_u=200;
out_pcf3(dat_u);
}
if(flag_f==1)
{
flag_f=0;
TR0=0;
dat_f=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
}
if(flag_da==1) dat_led &=0xef; //L5 ,有bug
else if(flag_da==0)dat_led |=0x10;
if (dat_u<150) dat_led &=0xfb; //L3
else if(dat_u<250) dat_led |=0x04;
else if(dat_u<350) dat_led &=0xfb;
else dat_led |=0x04;
if (dat_f<1000) dat_led &=0xf7; //L4
else if(dat_f<5000) dat_led |=0x08;
else if(dat_f<10000) dat_led &=0xf7;
else dat_led |=0x08;
show_num();
key_driver();
}
}
system.h
#ifndef _SYSTEM_H
#define _SYSTEM_H
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
sbit key_int_1=P3^3;
sbit key_int_2=P3^2;
sbit key_int_3=P3^1;
sbit key_int_4=P3^0;
//init
void hc573(uchar n);
void close_fucker();
void init_timer1();
void init_timer0();
//display
void show_num();
void show_led(uchar temp);
void display();
//key
void key_scan();
void key_action(uchar key_value);
void key_driver();
//变量设置
extern uint dat_u,dat_f;//全局变量在头文件中声明(加extern关键字),在c文件中还要定义
extern bit flag_f,flag_ad,flag_da,flag_smg,flag_led,mode;
extern uchar dat_led;
#endif
display.c
#include "system.h"
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x7f,0xc1,0x8e};
uchar smg_buff[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};
void show_num()
{
if(flag_smg==1)
{
if(mode==0)
{
smg_buff[0]=table[12];
smg_buff[1]=table[10];
smg_buff[2]=table[10];
smg_buff[3]=table[10];
smg_buff[4]=table[10];
smg_buff[5]=table[dat_u/100] & table[11]; //小数点的显示问题
smg_buff[6]=table[dat_u/10%10];
smg_buff[7]=table[dat_u%10];
}
else if(mode==1)
{
smg_buff[0]=table[13];
smg_buff[1]=table[10];
if(dat_f>99999)
smg_buff[2]=table[dat_f/100000];
else
smg_buff[2]=table[10];
if(dat_f>9999)
smg_buff[3]=table[dat_f/10000%10];
else
smg_buff[3]=table[10];
if(dat_f>999)
smg_buff[4]=table[dat_f/1000%10];
else
smg_buff[4]=table[10];
if(dat_f>99)
smg_buff[5]=table[dat_f/100%10];
else
smg_buff[5]=table[10];
if(dat_f>9)
smg_buff[6]=table[dat_f/10%10];
else
smg_buff[6]=table[10];
smg_buff[7]=table[dat_f%10];
}
}
else
{
smg_buff[0]=table[10];
smg_buff[1]=table[10];
smg_buff[2]=table[10];
smg_buff[3]=table[10];
smg_buff[4]=table[10];
smg_buff[5]=table[10];
smg_buff[6]=table[10];
smg_buff[7]=table[10];
}
}
void display()
{
static uchar index=0;
hc573(7);
P0=0xff;
P2=P2 & 0X1F;
hc573(6);
P0=0x01<<index;
P2=P2 & 0X1F;
hc573(7);
P0=smg_buff[index];
P2=P2 & 0X1F;
if(index<7)
index++;
else
index=0;
}
void show_led(uchar temp)//有形参,对temp运算来控制led灯
{
hc573(4);
P0=~temp;
P2=P2 & 0X1F;
}
init.c
#include "system.h"
bit flag_f=0,flag_ad=0;
void hc573(uchar n)
{
switch(n)
{
case 4:P2=(P2 & 0X1F) | 0X80;break;
case 5:P2=(P2 & 0X1F) | 0Xa0;break;
case 6:P2=(P2 & 0X1F) | 0Xc0;break;
case 7:P2=(P2 & 0X1F) | 0Xe0;break;
}
}
void close_fucker()
{
hc573(4);
P0=0XFF;
P2=P2 & 0X1F;
hc573(5);
P0=0XaF;
P2=P2 & 0X1F;
}
void init_timer1()
{
AUXR |= 0x40;
TMOD &= 0x0F;
TL1 = 0x40;
TH1 = 0xA2;
EA=1;
ET1=1;
TF1 = 0;
TR1 = 1;
}
void serivce_timer1() interrupt 3
{
static uint t_f=0,t_u=0;
if(++t_f>=250)
{
t_f=0;
flag_f=1;
}
if(++t_u>=200)
{
t_u=0;
flag_ad=1;
}
if(flag_led==0)
{
show_led(dat_led);
}
else
{
show_led(0x00);
}
display();
key_scan();
}
void init_timer0()
{
TMOD=0x04;
TH0=0;
TL0=0;
TR0=1;
}
key.c
#include "system.h"
uchar key_state[4]={1,1,1,1};
uchar key_value_map[4]={1,2,3,4};
bit flag_da=1,flag_smg=1,mode=0,flag_led=0;
uchar dat_led=0x01;
void key_scan()
{
uchar i;
static uchar key_buff[4]={0xff,0xff,0xff,0xff,};
key_buff[0]=(key_buff[0] <<1) |key_int_1;
key_buff[1]=(key_buff[1] <<1) |key_int_2;
key_buff[2]=(key_buff[2] <<1) |key_int_3;
key_buff[3]=(key_buff[3] <<1) |key_int_4;
for(i=0;i<4;i++)
{
if(key_buff[i]==0xff)
{
key_state[i]=1;
}
else if(key_buff[i]==0x00)
{
key_state[i]=0;
}
else
{
;
}
}
}
void key_action(uchar key_value)
{
if(key_value==1)
{
mode=~mode;
if(mode==0)
{
dat_led |=0x01;
dat_led &=0xfd;
}
else if(mode==1)
{
dat_led |=0x02;
dat_led &=0xfe;
}
}
else if(key_value==2)
{
flag_da=~flag_da;
}
else if(key_value==3)
{
flag_led=~flag_led;
}
else if(key_value==4)
{
flag_smg=~flag_smg;
}
}
void key_driver()
{
uchar i;
static uchar key_back[4]={1,1,1,1};
for(i=0;i<4;i++)
{
if(key_state[i]!=key_back[i])
{
if(key_state[i]==1)
{
key_action(key_value_map[i]);
}
key_back[i]=key_state[i];
}
}
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "system.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
//函数声明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(unsigned char ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
unsigned char read_pcf3(void);
void out_pcf3(unsigned char dat_u);
#endif
iic.c
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(12MHz)
日 期: 2011-8-9
*/
#include "iic.h"
#include "system.h"
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//应答位控制
void IIC_Ack(unsigned char ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
unsigned char read_pcf3(void) //temp=pcf_3();调用的正确用法
{
uchar u;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
u=IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return u; //调用此函数时是该函数名赋值给另一个变量
//不是直接用这个返回值的变量
}
void out_pcf3(uchar dat_u) //将读取的数字量给pcf输出模拟量信号
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40); //发送控制字节,0100 0000在7位,00通道输入,out引脚输出(在J3第二个针),
IIC_WaitAck();
IIC_SendByte(dat_u);
IIC_WaitAck();
IIC_Stop();
}