|
#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流轉(zhuǎn)間隔
unsigned char pwn_duty = 0;//脈沖寬度
unsigned char grade_led = 1;//LED亮度等級(jí)
unsigned char s6_set = 0;
bit s4_set = 0; //在非設(shè)置狀態(tài)下按下S4可以顯示LED的亮度等級(jí)
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;
}
}
/*******關(guān)閉LED和蜂鳴器、繼電器******/
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = 0xFF;
SelectHC573(0);
}
/******數(shù)碼管顯示函數(shù)******/
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相關(guān)函數(shù)********/
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數(shù)據(jù)采集*******/
void Read_Rb2()
{
I2CStart();
I2CSendByte(0x90);
I2CWaitACK();
I2CSendByte(0x03);
I2CWaitACK();
I2CStop();
I2CStart();
I2CSendByte(0x91);
I2CWaitACK();
dat_rb2 = I2CRecByte();
I2C_ACK(0);
I2CStop();
}
/******LED亮度控制函數(shù)******/
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);
}
}
}
/*******數(shù)碼管刷新*******/
void ScanSMG()
{
static unsigned char i = 0;
P0 = 0xFF;
SelectHC573(6);
P0 = 0x01<<i;
SelectHC573(7);
P0 = LedBuff[i++];
if(i>=8)
i = 0;
}
/****配置定時(shí)器0****/
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x18; //設(shè)置定時(shí)初值
TH0 = 0xFC; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
ET0 = 1;
EA = 1;
}
void InterruptTimer0() interrupt 1 //定時(shí)器服務(wù)函數(shù)
{
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的流轉(zhuǎn)間隔
{
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;
}
}
}
|
-
-
第9屆彩燈控制器_1.rar
2020-3-24 18:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
44.89 KB, 下載次數(shù): 20, 下載積分: 黑幣 -5
-
-
省賽試題-第9屆-彩燈控制器.pdf
2020-3-24 18:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
283.36 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5
|