|
#include <stc15f2k60s2.h>
#include <I2C.h>
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
unsigned char code LedChar[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0x7F
};
unsigned char LedBuff[8] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char code dat_led[4][8] = {
{0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}, //模式1
{0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}, //模式2
{0x7E,0xBD,0xDB,0xE7}, //模式3
{0xE7,0xDB,0xBD,0x7E} //模式4
};
unsigned char mode=0,site=0; //mode控制流水灯模式,site控制流水灯的位置
unsigned int time_led = 400;//LED流转间隔
unsigned char pwn_duty = 0;//脉冲宽度
unsigned char grade_led = 1;//LED亮度等级
unsigned char s6_set = 0;
bit s4_set = 0; //在非设置状态下按下S4可以显示LED的亮度等级
unsigned char dat_rb2 = 0;
void InitSystem();
void ScanKeys();
void ConfigSMG();
void Read_Rb2();
void LED();
void Timer0Init(void); //1毫秒@12.000MHz
unsigned char I2CRead(unsigned char addr);
void I2CWrite(unsigned char addr,unsigned char dat);
void main()
{
InitSystem();
Timer0Init();
mode = I2CRead(0x01);
time_led = I2CRead(0x08)*10;
while(1)
{
ConfigSMG();
Read_Rb2();
LED();
ScanKeys();
}
}
void SelectHC573(unsigned char chane)
{
switch(chane)
{
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;
default:P2 = (P2&0x1F)|0x00;break;
}
}
/*******关闭LED和蜂鸣器、继电器******/
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = 0xFF;
SelectHC573(0);
}
/******数码管显示函数******/
void ConfigSMG()
{
if(s6_set>0)
{
LedBuff[0] = LedChar[16];
LedBuff[1] = LedChar[mode];
LedBuff[2] = LedChar[16];
LedBuff[3] = 0xFF;
if(time_led>=1000)
{
LedBuff[4] = LedChar[time_led/1000];
LedBuff[5] = LedChar[time_led/100%10];
LedBuff[6] = LedChar[time_led/10%10];
LedBuff[7] = LedChar[time_led%10];
}
else
{
LedBuff[4] = 0xFF;
LedBuff[5] = LedChar[time_led/100];
LedBuff[6] = LedChar[time_led/10%10];
LedBuff[7] = LedChar[time_led%10];
}
}
else
{
LedBuff[0] = 0xFF;
LedBuff[1] = 0xFF;
LedBuff[2] = 0xFF;
LedBuff[3] = 0xFF;
LedBuff[4] = 0xFF;
LedBuff[5] = 0xFF;
LedBuff[6] = 0xFF;
LedBuff[7] = 0xFF;
}
if(s4_set)
{
LedBuff[0] = 0xFF;
LedBuff[1] = 0xFF;
LedBuff[2] = 0xFF;
LedBuff[3] = 0xFF;
LedBuff[4] = 0xFF;
LedBuff[5] = 0xFF;
LedBuff[6] = LedChar[16];
LedBuff[7] = LedChar[grade_led];
}
}
/******EEPROM相关函数********/
void I2CWrite(unsigned char addr,unsigned char dat)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitACK();
I2CSendByte(addr);
I2CWaitACK();
I2CSendByte(dat);
I2CWaitACK();
I2CStop();
}
unsigned char I2CRead(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CSendByte(0xA0);
I2CWaitACK();
I2CSendByte(addr);
I2CWaitACK();
I2CStart();
I2CSendByte(0xA1);
I2CWaitACK();
dat = I2CRecByte();
I2C_ACK(0);
I2CStop();
return dat;
}
/******PCF8591数据采集*******/
void Read_Rb2()
{
I2CStart();
I2CSendByte(0x90);
I2CWaitACK();
I2CSendByte(0x03);
I2CWaitACK();
I2CStop();
I2CStart();
I2CSendByte(0x91);
I2CWaitACK();
dat_rb2 = I2CRecByte();
I2C_ACK(0);
I2CStop();
}
/******LED亮度控制函数******/
void LED()
{
if(dat_rb2<60)
{
pwn_duty = 5;
grade_led = 1;
}
else if(dat_rb2<120)
{
pwn_duty = 10;
grade_led = 2;
}
else if(dat_rb2<180)
{
pwn_duty = 15;
grade_led = 3;
}
else
{
pwn_duty = 20;
grade_led = 4;
}
}
/********按键扫描与处理逻辑*********/
void Delay1ms() //@12.000MHz
{
unsigned char i;
i = 1000;
while(i--);
}
void ScanKeys()
{
/*****按键S7*****/
if(S7==0)
{
Delay1ms();
if(S7==0)
{
if(TR0==0)
{
TR0 = 1;
}
else
{
s6_set = 0;
TR0 = 0;
}
while(S7==0);
}
}
/******按键S6*****/
if(S6==0)
{
Delay1ms();
if(S6==0)
{
s6_set++;
if(s6_set==2)
{
I2CWrite(0x01,mode);
Delay1ms();
}
else if(s6_set>=3)
{
s6_set = 0;
I2CWrite(0x08,time_led/10);
Delay1ms();
}
while(S6==0);
}
}
/*****按键S5*****/
if(S5==0)
{
Delay1ms();
if(S5==0)
{
if(s6_set==2)
{
time_led = time_led+100;
if(time_led>=1200)
{
time_led = 1200;
}
}
else if(s6_set==1)
{
mode++;
if(mode>=4)
{
mode = 4;
}
}
while(S5==0);
}
}
/******按键S4*****/
if(S4==0)
{
Delay1ms();
if(S4==0)
{
if(s6_set==2)
{
time_led = time_led-100;
if(time_led<400)
{
time_led = 400;
}
}
else if(s6_set==1)
{
mode--;
if(mode<=1)
{
mode = 1;
}
}
else
{
s4_set = ~s4_set;
}
while(S4==0);
}
}
}
/*******数码管刷新*******/
void ScanSMG()
{
static unsigned char i = 0;
P0 = 0xFF;
SelectHC573(6);
P0 = 0x01<<i;
SelectHC573(7);
P0 = LedBuff[i++];
if(i>=8)
i = 0;
}
/****配置定时器0****/
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void InterruptTimer0() interrupt 1 //定时器服务函数
{
static unsigned int cnt = 0;
static unsigned char PWN = 0;
ScanSMG();
PWN++;
cnt++;
if(PWN<=pwn_duty) //控制LED的亮度大小
{
SelectHC573(4);
P0 = dat_led[mode-1][site];
}
else if(PWN<20)
{
SelectHC573(4);
P0 = 0xFF;
}
else
{
SelectHC573(4);
PWN = 0;
P0 = dat_led[mode-1][site];
}
if(cnt>=time_led) //控制LED的流转间隔
{
SelectHC573(4);
P0 = dat_led[mode-1][site];
cnt = 0;
site++;
if(mode<=2)
{
if(site>=8)
site = 0;
}
else
{
if(site>=4)
site = 0;
}
}
}
|
|