这届还是有一定难度的,主要处理好,数码管和小灯的显示关系,通过定时器的延时,设置一个可变的间隔时间,然后延时到就改变小灯的状态,其他的时候不改变小灯状态,也有注意这个时候处理好P0口的内容,不要影响小灯的显示,或者引起数码管的隐显。
我的pwm部分还没写,如果之后写了的话再补上吧
代码应该还算简单看懂,就是设置了挺多的变量的,需要仔细看一下,看不懂的话可以随时和我交流。
#include "reg52.h"
#include "iic.h"
sbit S7 = P3 ^ 0;
sbit S6 = P3 ^ 1;
sbit S5 = P3 ^ 2;
sbit S4 = P3 ^ 3;
unsigned char code duanma[18] =//1
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f };
void display_choose();
void keys();
unsigned char led_flow = 1;
void delay(unsigned int t)
{
while (t--);
}
void HC573(unsigned char t)
{
switch (t)
{
case 4:P2 = (P2 & 0x1f) | 0x80; break;2
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(4);
P0 = 0xff;/3
HC573(5);
P0 = 0x00;
HC573(6);
P0 = 0x00;
HC573(7);
P0 = 0xff;
HC573(0);
}
void timer0()
{
TMOD = 0x01;//4
TH0 = (65535 - 20000 + 1) / 256;
TL0 = (65535 - 20000 + 1) % 256;
ET0 = 1;
EA = 1;
}
unsigned char t1s = 0;
unsigned char count_1 = 0;
unsigned char count_jiange = 0;
unsigned int jiange = 400;//4-12
unsigned char led_change = 0;
unsigned char led_n = 1;
void servicetimer0() interrupt 1
{
TH0 = (65535 - 20000 + 1) / 256;
TL0 = (65535 - 20000 + 1) % 256;//20ms
count_1++;
if (led_flow == 1) {
count_jiange++;
}
if (count_1 == 40)
{
t1s++;
if (t1s == 2) { t1s = 0; }
count_1 = 0;
}
if (count_jiange >= (jiange /20))
{
led_n++;
if (led_n == 9) { led_n = 1; }
led_change = 1;
count_jiange = 0;
}
}
/*
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();
dianya = dat_rb2 * 1.961;
if (dianya_stat == 2)
{
dianya = 200;
}
}
*/
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)
{
unsigned char 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_SendAck(1);
IIC_Stop();
return k;
}
void displayled(unsigned char pos, unsigned char value)
{
P0 = 0xff;
HC573(7);
P0 = 0xff;
HC573(6);
P0 = 0x01 << pos;
HC573(7);
P0 = value;
//hc573(0);//这里不能加
}
void displayoff()
{
P0 = 0xff;
HC573(7);
P0 = 0xff;
HC573(6);
P0 = 0x00;
//hc573(0);//这里不能加
}
unsigned char mode = 1;
void display_1()
{
displayoff();
}
void display_2()
{
if (t1s == 0)
{
displayled(0, duanma[16]);
delay(500);
displayled(1, 0xff);
delay(500);
displayled(2, duanma[16]);
delay(500);
if (jiange > 999) { displayled(4, duanma[1]); }
else { displayled(4, 0xff); }
delay(500);
displayled(5, duanma[(jiange / 100) % 10]);
delay(500);
displayled(6, duanma[(jiange / 10) % 10]);
delay(500);
displayled(7, duanma[jiange % 10]);
delay(500);
displayoff();
}
else if (t1s == 1)
{
displayled(0, duanma[16]);
delay(500);
displayled(1, duanma[mode]);
delay(500);
displayled(2, duanma[16]);
delay(500);
displayled(3, 0xff);
delay(500);
if (jiange > 999) { displayled(4, duanma[1]); }
else { displayled(4, 0xff); }
delay(500);
displayled(5, duanma[(jiange / 100) % 10]);
delay(500);
displayled(6, duanma[(jiange / 10) % 10]);
delay(500);
displayled(7, duanma[jiange % 10]);
delay(500);
displayoff();
}
}
void display_3()
{
if (t1s == 0)
{
displayled(0, duanma[16]);
delay(500);
displayled(1, duanma[mode]);
delay(500);
displayled(2, duanma[16]);
delay(500);
displayled(3, 0xff);
delay(500);
if (jiange > 999) { displayled(4, duanma[1]); }
else { displayled(4, 0xff); }
delay(500);
displayled(5, duanma[(jiange / 100) % 10]);
delay(500);
displayled(6, duanma[(jiange / 10) % 10]);
delay(500);
displayled(7, duanma[jiange % 10]);
delay(500);
displayoff();
}
else if (t1s == 1)
{
displayled(0, duanma[16]);
delay(500);
displayled(1, duanma[mode]);
delay(500);
displayled(2, duanma[16]);
delay(500);
/*
displayled(3, 0xff);
delay(100);
displayled(4, 0xff);
delay(100);
displayled(5, 0xff);
delay(100);
displayled(6, 0xff);
delay(100);
displayled(7, 0xff);
delay(100);
*/
displayoff();
}
}
unsigned char display_stat = 1;
unsigned char stat_led = 0xff;
unsigned char i = 0;
void led()
{
P0 = 0xff;//这个一定要
if (led_flow == 1)
{
if (mode == 1)
{
if (led_change == 1) {
switch (led_n)
{
case 1:
P0 = 0xfe;
break;
case 2:
P0 = 0xfd;
break;
case 3:
P0 = 0xfb;
break;
case 4:
P0 = 0xf7;
break;
case 5:
P0 = 0xef;
break;
case 6:
P0 = 0xdf;
break;
case 7:
P0 = 0xbf;
break;
case 8:
P0 = 0x7f;
break;
}
HC573(4);
led_change = 0;
}
}
else if (mode == 2)
{
if (led_change == 1) {
switch (led_n)
{
case 1:
P0 = 0x7f;
break;
case 2:
P0 = 0xbf;
break;
case 3:
P0 = 0xdf;
break;
case 4:
P0 = 0xef;
break;
case 5:
P0 = 0xf7;
break;
case 6:
P0 = 0xfb;
break;
case 7:
P0 = 0xfd;
break;
case 8:
P0 = 0xfe;
break;
}
HC573(4);
led_change = 0;
}
}
else if (mode == 3)
{
if (led_change == 1) {
switch (led_n)
{
case 1:
P0 = 0x7e;
break;
case 2:
P0 = 0xbd;
break;
case 3:
P0 = 0xdb;
break;
case 4:
P0 = 0xe7;
break;
case 5:
P0 = 0x7e;
break;
case 6:
P0 = 0xbd;
break;
case 7:
P0 = 0xdb;
break;
case 8:
P0 = 0xe7;
break;
}
HC573(4);
led_change = 0;
}
}
else if (mode == 4)
{
if (led_change == 1) {
switch (led_n)
{
case 1:
P0 = 0xe7;
break;
case 2:
P0 = 0xdb;
break;
case 3:
P0 = 0xbd;
break;
case 4:
P0 = 0x7e;
break;
case 5:
P0 = 0xe7;
break;
case 6:
P0 = 0xdb;
break;
case 7:
P0 = 0xbd;
break;
case 8:
P0 = 0x7e;
break;
}
HC573(4);
led_change = 0;
}
}
}
else
{
HC573(4);
}
HC573(0);//小灯改完状态,也要关
}
void display_choose()
{
if (display_stat == 1) { display_1(); }
else if (display_stat == 2) { display_2(); }
else if (display_stat == 3) { display_3(); }
led();
}
void keys()
{
if (S7 == 0)
{
delay(100);
if (S7 == 0)
{
led_flow++;
if (led_flow == 2) { led_flow = 0; }
}
while (S7 == 0)
{
display_choose();
}
}
if (S6 == 0)
{
delay(100);
if (S6 == 0)
{
TR0 = 0;
display_stat++;
TR0 = 1;
if (display_stat == 4)
{
display_stat = 1;
}
while (S6 == 0)
{
display_choose();
}
}
}
if (S5 == 0)
{
delay(100);
if (S5 == 0)
{
if (display_stat == 2)
{
mode++;
if (mode == 5) { mode = 1; }
led_n = 0;
count_jiange = 0;
}
else if (display_stat == 3)
{
jiange = jiange + 100;
if (jiange > 1200) { jiange = 400; }
Write_24C02(0x05, jiange / 100);//防止第一次取出来的时候不是100的倍数
}
while (S5 == 0)
{
display_choose();
}
}
}
if (S4 == 0)
{
delay(100);
if (S4 == 0)
{
if (display_stat == 2)
{
mode--;
if (mode == 0) { mode = 4; }
led_n = 0;
count_jiange = 0;
}
else if (display_stat == 3)
{
jiange = jiange - 100;
if (jiange < 400) { jiange = 1200; }
Write_24C02(0x05, jiange / 100);
}
while (S4 == 0)
{
display_choose();
}
}
}
}
void main()
{
jiange = Read_24C02(0x05);
jiange = 100 * jiange;//防止第一次取出来的时候不是100的倍数
if (jiange < 400) { jiange = 1200; }
if (jiange > 1200) { jiange = 400; }//防止第一次取出来的数越界
first();
timer0();
while (1)
{
//led();
keys();
display_choose();
}
}
省赛加油