一、题目说明:
题目说明来自这篇文章:https://blog.csdn.net/qq_44106838/article/details/115277841
(感谢博主呀~)
二、代码实现:
1、main.c文件:
#include <STC15F2K60S2.H>
#include "port.h"
#include "key.h"
#include "pcf.h"
#define u8 unsigned char
#define u16 unsigned int
u8 code t_display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,
0x00,0x40,0x3E,0x73};
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
u8 menu[][8] = {{22, 1, 20, 20, 20, 0, 0, 0}, {23, 1, 20, 20, 20, 0, 0, 0}};
u8 Trg, Com, index, voltage, LEDState = 0x0c;
u16 t2_cnt;
bit keyflag, tick_200ms;
void Timer2Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x20; //设置定时初值
T2H = 0xD1; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //开定时器2中断
}
void t2int() interrupt 12 //中断入口
{
static u8 i;
u8 val;
LED_Com(0x00);
LED_Bit(T_COM[i]);
LED_Com(t_display[menu[index][i]]);
if(++i == 8)
i = 0;
if(t2_cnt % 20 == 0)
{
val = KeyScan();
Trg = val & (val ^ Com);
Com = val;
if(Trg != 0)
keyflag = 1;
}
// if(t2_cnt % 200 == 0)
// tick_200ms = 1;
if(t2_cnt % 300 == 0)
LED(LEDState), tick_200ms = 1;
if(++t2_cnt == 1000)
{
t2_cnt = 0;
}
}
void main(void)
{
u8 channel;
u16 voltage[2], vp[2] = {250, 300}, vp_tmp[2] = {250, 300};
bit blink;
device_Init();
LED(0x00);
Timer2Init();
EA = 1;
while(1)
{
if(tick_200ms)
{
tick_200ms = 0;
blink = ~blink;
if(blink == 1)
{
voltage[0] = GetVoltage(0x43) * 100 / 51;
if(voltage[0] > vp[0])
LEDState = LEDState & 0xfe | 0x01;
else
LEDState = LEDState & 0xfe;
}
else
{
voltage[1] = GetVoltage(0x41) * 100 / 51;
if(voltage[1] > vp[1])
LEDState = LEDState & 0xfd | 0x02;
else
LEDState = LEDState & 0xfd;
}
if(index == 0)
{
menu[0][1] = channel*2 + 1;
menu[0][5] = voltage[channel] / 100 + 10;
menu[0][6] = voltage[channel] / 10 % 10;
menu[0][7] = voltage[channel] % 10;
}
else if(index == 1)
{
menu[1][1] = channel*2 + 1;
menu[1][5] = vp_tmp[channel] / 100 + 10;
menu[1][6] = vp_tmp[channel] / 10 % 10;
menu[1][7] = vp_tmp[channel] % 10;
}
}
if(keyflag)
{
keyflag = 0;
switch(Trg)
{
case 4:
{
channel = (++channel) % 2;
if(channel == 0)
LEDState = LEDState & 0xfb | 0x04;
else
LEDState = LEDState & 0xfb;
break;
}
case 5://显示界面切换
{
index = (++index) % 2;
if(index == 0)
{
vp[0] = vp_tmp[0];
vp[1] = vp_tmp[1];
LEDState = LEDState & 0xf7 | 0x08;
}
else
LEDState = LEDState & 0xf7;
break;
}
case 6:
{
if(index == 1 && vp_tmp[channel] < 500)
vp_tmp[channel] += 20;
break;
}
case 7:
{
if(index == 1 && vp_tmp[channel] > 0)
vp_tmp[channel] -= 20;
break;
}
}
}
}
}
2、port.c文件:
#include <STC15F2K60S2.H>
#include "port.h"
#include <intrins.h>
void device_Init(void)
{
P0 = 0x00;
P2 = 0xa0;
_nop_();
P2 = 0x00;
}
void LED(unsigned char k)
{
P0 = ~k;
P2 = 0x80;
_nop_();
P2 = 0x00;
}
void LED_Bit(unsigned char k)
{
P0 = k;
P2 = 0xc0;
_nop_();
P2 = 0x00;
}
void LED_Com(unsigned char k)
{
P0 = ~k;
P2 = 0xf0;
_nop_();
P2 = 0x00;
}
port.h文件:
#ifndef __PORT_H
#define __PORT_H
void device_Init(void);
void LED(unsigned char k);
void LED_Bit(unsigned char k);
void LED_Com(unsigned char k);
#endif
3、key.c文件:
#include <STC15F2K60S2.H>
#include "key.h"
#include <intrins.h>
void Delay100us() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
unsigned char KeyScan(void)
{
if(P30 == 0)
{
Delay100us();
if(P30 == 0)
return 7;
}
else if(P31 == 0)
{
Delay100us();
if(P31 == 0)
return 6;
}
else if(P32 == 0)
{
Delay100us();
if(P32 == 0)
return 5;
}
else if(P33 == 0)
{
Delay100us();
if(P33 == 0)
return 4;
}
return 0;
}
key.h文件:
#ifndef __KEY_H
#define __KEY_H
unsigned char KeyScan(void);
#endif
4、iic.c文件:
/*
ԌѲ˵ķ: IICПȽ֯ԌѲ
ɭݾ۷: Keil uVision 4.10
Ӳݾ۷: CT107եƬܺ؛ۏʵѵƽ̨ 8051ì12MHz
ɕ ǚ: 2011-8-9
*/
#include "reg52.h"
#include "intrins.h"
#include "iic.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//Пӽޅ֨ӥ
sbit SDA = P2^1; /* ˽ߝП */
sbit SCL = P2^0; /* ʱדП */
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//ПǴ֯͵ݾ
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//Пֹͣ͵ݾ
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//ע̍Ӧհ
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0úӦհì1ú؇Ӧհ
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//ֈսӦհ
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//ͨڽI2CПע̍˽ߝ
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//ՓI2CПʏޓ˕˽ߝ
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
iic.h文件:
#ifndef _IIC_H
#define _IIC_H
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
#endif
5、pcf.c文件:
#include "pcf.h"
#include "iic.h"
unsigned char GetVoltage(unsigned char k)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(k);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return dat;
}
pcf.h文件:
#ifndef __PCF_H
#define __PCF_H
unsigned char GetVoltage(unsigned char k);
#endif