师从小蜜蜂,代码简单易懂,
#include "reg52.h"
#include "iic.h"
sfr P4 = 0xC0;
sbit R1 = P3 ^ 0;
sbit R2 = P3 ^ 1;
sbit R3 = P3 ^ 2;
sbit R4 = P3 ^ 3;
sbit C4 = P3 ^ 4;
sbit C3 = P3 ^ 5;
sbit C2 = P4 ^ 2;
sbit C1 = P4 ^ 4;
unsigned int AIN3;///必须int
unsigned int SET = 0;
unsigned int key_cnt = 0;//无效按键
unsigned int display_stat = 1;
unsigned char dat_rb2;
unsigned char cnt_5s = 0;
unsigned int equ_cnt = 0;//等于设定值计数
unsigned int flag = 2;
unsigned char L1_stat = 0;
unsigned char stat_L3 = 0;
unsigned char P0_stat = 0Xff;
unsigned char code smg_duanma[18] =
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f };
unsigned char code dian_duanma[10] =
{ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10 };
void display_choose();
void LED();
void delay(unsigned char t)
{
while (t--);
}
void delay_display(unsigned char t)
{
while (t--);
display_choose();
}
void HC573(unsigned char 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;
case 0:P2 = (P2 & 0x1f) | 0x00; break;
}
}
void first()
{
HC573(5);
P0 = 0x00;
HC573(4);
P0 = 0xff;
HC573(5);
P0 = 0x00;
HC573(6);
P0 = 0xff;
HC573(5);
P0 = 0x00;
HC573(7);
P0 = 0xff;
flag = 2;
key_cnt = 0;
}
void display_led(unsigned char value, unsigned char pos)
{
HC573(7);//防止按键时小灯暗
P0 = 0xff;/关键
HC573(6);
P0 = 0x01 << pos;
HC573(7);
P0 = value;
}
//********三种显示界面切换**************
void display_1()
{
display_led(smg_duanma[AIN3 % 10], 7);
delay(500);
display_led(smg_duanma[(AIN3 / 10) % 10], 6);
delay(500);
display_led(dian_duanma[AIN3 / 100], 5);
delay(500);
display_led(0xff, 4);
delay(500);
display_led(0xff, 3);
delay(500);
display_led(0xff, 2);
delay(500);
display_led(0xff, 1);
delay(500);
display_led(0xc1, 0);
delay(500);
HC573(7);
P0 = 0xff;
}
void display_2()
{
display_led(smg_duanma[SET % 10], 7);
delay(500);
display_led(smg_duanma[(SET / 10) % 10], 6);
delay(500);
display_led(dian_duanma[SET / 100], 5);
delay(500);
display_led(0xff, 4);
delay(500);
display_led(0xff, 3);
delay(500);
display_led(0xff, 2);
delay(500);
display_led(0xff, 1);
delay(500);
display_led(0x8c, 0);
delay(500);
HC573(7);
P0 = 0xff;
}
void display_3()
{
display_led(smg_duanma[equ_cnt % 10], 7);
delay(500);
if (equ_cnt > 9)
{
display_led(smg_duanma[(equ_cnt / 10) % 10], 6);
delay(500);
}
if (equ_cnt > 99)
{
display_led(smg_duanma[equ_cnt / 100], 5);
delay(500);
}
display_led(0xff, 4);
delay(500);
display_led(0xff, 3);
delay(500);
display_led(0xff, 2);
delay(500);
display_led(0xff, 1);
delay(500);
display_led(0x89, 0);
delay(500);
HC573(7);
P0 = 0xff;
}
void display_choose()
{
if (display_stat == 1) { display_1(); }
else if (display_stat == 2) { display_2(); }
else if (display_stat == 3) { display_3(); }
LED();
}
//************定时5s***********
void timer0()
{
TMOD = 0x01;
TH0 = (65535 - 50000) / 256;//50ms定时
TL0 = (65535 - 50000) % 256;
ET0 = 1;
EA = 1;
}
void servicetimer() interrupt 1
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
cnt_5s++;
if (cnt_5s == 100)
{
L1_stat = 1;
}
}
//***************rb2电压A/D转化*************
void Read_rb2()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_rb2 = IIC_RecByte();
IIC_Ack(1);
IIC_Stop();
AIN3 = dat_rb2 * 1.961;
}
//********存储器写入**********
void Write_24C02(unsigned char addr, unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//********存储器读出**********
unsigned char Read_24C02(unsigned char addr)
{
int k = 0;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
k = IIC_RecByte();
IIC_Ack(1);
IIC_Stop();
return k;
}
void scankey()
{
R1 = 0;
R2 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if (C1 == 0)//S11
{
delay(10);
if (C1 == 0)
{
if (display_stat == 2)
{
key_cnt = 0;
stat_L3 = 0;
SET = SET + 50;
if (SET > 500)
{
SET = 0;
}
}
else
{ key_cnt++;
if (key_cnt >= 3)
{
stat_L3 = 1;
}
}
while (C1 == 0)
{
display_choose();
}
}
}
else if (C2 == 0)//S15
{
delay(10);
if (C2 == 0)
{
if (display_stat == 2)
{
key_cnt = 0;
stat_L3 = 0;
SET = SET - 50;
if (SET < 0)
{SET = 500;}
}
else
{
key_cnt++;
if (key_cnt >= 3)
{stat_L3 = 1;}
}
}
while (C2 == 0)
{
display_choose();
}
}
R2 = 0;
R1 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if (C1 == 0)//S7
{
delay(10);
if (C1 == 0)
{
key_cnt = 0;
stat_L3 = 0;
display_stat++;
if (display_stat == 4)
{
display_stat = 1;
}
if (display_stat == 3)
{
Write_24C02(0x01, (SET / 10));
}
}
while (C1 == 0)
{
display_choose();
}
}
else if (C2 == 0)//S19
{
delay_display(1000);
if (C2 == 0)
{
if (display_stat == 3)
{
equ_cnt = 0;
key_cnt = 0;
stat_L3 = 0;
}
else {
key_cnt++;
if (key_cnt >= 3)
{
stat_L3 = 1;
}
}
}
while (C2 == 0)
{
display_choose();
}
}
}
void timer_5s()
{
if (AIN3 < SET)
{
TR0 = 1;
}
else {
TR0 = 0;
cnt_5s = 0;
L1_stat = 0;
}
}
void LED()
{
HC573(4);
P0 = 0xff;
if (L1_stat == 1) {
P0_stat = (P0_stat & 0xfe); P0 = P0_stat;
}
else { P0_stat = (P0_stat | 0x01); P0 = P0_stat; }
if ((equ_cnt % 2) == 1) {
P0_stat = P0_stat & 0xfd; P0 = P0_stat;
}
else { P0_stat = (P0_stat | 0x02); P0 = P0_stat; }
if (stat_L3==1) {
P0_stat = P0_stat & 0xfb; P0 = P0_stat;
}
else { P0_stat = (P0_stat | 0x04); P0 = P0_stat; }
delay(1000);
}
void cnt()
{
if (AIN3 > SET)
{
if (flag == 0) { equ_cnt++; }
flag = 1;
delay(1000);
}
else if (AIN3 < SET)
{
if (flag == 1) { equ_cnt++; }
flag = 0;
delay(1000);
}
}
void main()
{
first();
timer0();
SET = Read_24C02(0x01);
SET = 10 * SET;
while (1)
{
Read_rb2();
cnt();
timer_5s();
scankey();
display_choose();
}
}