LED闪烁有5种效果,数码管点亮有3种效果,包含小彩蛋哟
实现代码如下:
//#include <reg52.h>
#include <REGX52.H>
//typedef unsigned char uchar;
#define uchar unsigned char
sbit HC595_RCK = P0^6;
sbit HC595_SCK = P0^5;
sbit HC595_DATA = P0^7;
uchar LED_1_ARRAY[2] = {0x00, 0x00};
//点亮LED
void send_data(uchar l_one, uchar l_two)
{
uchar i;
HC595_RCK = 0;
for(i = 0; i < 8; i++)
{
HC595_SCK = 0;
HC595_DATA = l_one & 0x80? 1 : 0;
l_one = l_one << 1;
HC595_SCK = 1;
}
for(i = 0; i < 8; i++)
{
HC595_SCK = 0;
HC595_DATA = l_two & 0x80? 1 : 0;
l_two = l_two << 1;
HC595_SCK = 1;
}
HC595_RCK = 1;
}
//led 效果1
code uchar Led8_One_Array[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code uchar Led8_Two_Array[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
//led 效果2
code unsigned char Led8_One2_Array[16] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
code unsigned char Led8_Two2_Array[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};
//led 效果4
code unsigned char Led8_One4_Array[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
code unsigned char Led8_Two4_Array[16] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
//led 效果5
code unsigned char Led8_One5_Array[17] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00};
code unsigned char Led8_Two5_Array[17] = {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00};
sbit HC595_RCK2 = P1^0;
sbit HC595_SCK2 = P1^1;
sbit HC595_DATA2 = P1^4;
code uchar SM_Array[11] = {0x3F, 0x06, 0x5B, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F, 0x00};
code uchar SHU_Wei_Array[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
//数码管 520效果
code unsigned char SHU_Duan2_Array[8] = {0, 5, 2, 0, 1, 3, 1, 4};
//数码管显数
void Shu_Show_Data(uchar Data_One, uchar Data_Two)
{
uchar i;
HC595_RCK2 = 0;
for(i = 0; i < 8; i++)
{
HC595_SCK2 = 0;
HC595_DATA2 = Data_One & 0x80? 1 : 0;
Data_One = Data_One << 1;
HC595_SCK2 = 1;
}
for(i = 0; i < 8; i++)
{
HC595_SCK2 = 0;
HC595_DATA2 = Data_Two & 0x80? 1 : 0;
Data_Two = Data_Two << 1;
HC595_SCK2 = 1;
}
HC595_RCK2 = 1;
}
void time0_init()
{
TMOD = 0x01; //设置 T0 为模式 1
TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms
TL0 = 0x66;
TR0 = 1;
EA = 1; //使能总中断
ET0 = 1; //使能 T0 中断
}
unsigned int cnt = 0, cnt2 = 1, sec = 0; //记录 T0 中断次数
uchar led_p_type = 1;//led效果,共5种
uchar led_run_c = 0;//led运行次数
char led_i = 0;//led内部计数
uchar led_giv = 0;//led公共计数变量
uchar shu_sec_array[8] = {0x00};
uchar shu_p_type = 1;//数码管效果,共4种
uchar shu_run_c = 0;//数码管运行次数
char shu_i = 0;//数码管内部计数
uchar shu_giv = 0;//数码管公共计数变量
uchar ii;//数码管循环变量
uchar iii = 0;//数码管延时大循环
uchar iiii = 0;//数码管延时大循环2
void main()
{
time0_init();
while(1)
{
if(cnt == 200)//0.2s
{
cnt = 0;
switch(shu_p_type) {
case 1:
if(iiii == 0) {
shu_giv = shu_i % 8;
for(ii = 0; ii < 8; ii++) {
if(ii == shu_giv) {
shu_sec_array[ii] = iii;
} else {
shu_sec_array[ii] = 10;
}
}
if(shu_giv == 7) {
shu_run_c ++;
shu_i = 0;
if(shu_run_c == 2) {
shu_run_c = 0;
shu_p_type ++;
shu_giv = 0;
iii = 0;
iiii = 0;
break;
}
}
iii ++;
if(iii == 10) {
shu_i ++;
iii = 0;
}
}
iiii ++;
if(iiii == 2) iiii = 0;
break;
case 2:
if(iii == 0) {
shu_giv = shu_i % 10;
for(ii = 0; ii < 8; ii++)
shu_sec_array[ii] = shu_giv;
shu_i ++;
if(shu_giv == 9) {
shu_run_c ++;
shu_i = 0;
if(shu_run_c == 2) {
shu_run_c = 0;
shu_p_type ++;
shu_giv = 0;
iii = 0;
break;
}
}
}
iii ++;
if(iii == 2) iii = 0;
break;
case 3:
for(ii = 0; ii < 8; ii++)
shu_sec_array[ii] = SHU_Duan2_Array[ii];
if(shu_i % 8 == 7) {
shu_run_c ++;
shu_i = 0;
if(shu_run_c == 3) {
shu_run_c = 0;
shu_p_type ++;
shu_giv = 0;
break;
}
}
shu_i ++;
break;
case 4:
sec ++;
shu_sec_array[7] = sec / 1 % 10;
shu_sec_array[6] = sec / 10 % 10;
shu_sec_array[5] = sec / 100 % 10;
shu_sec_array[4] = sec / 1000 % 10;
shu_sec_array[3] = sec / 10000 % 10;
shu_sec_array[2] = sec / 100000 % 10;
shu_sec_array[1] = sec / 1000000 % 10;
shu_sec_array[0] = sec / 10000000 % 10;
break;
}
}
if(cnt2 == 300) {//0.3s
cnt2 = 0;
switch(led_p_type) {
case 1:
led_giv = led_i % 32;
if(led_giv < 16) {
LED_1_ARRAY[0] = Led8_One_Array[led_giv];
LED_1_ARRAY[1] = Led8_Two_Array[led_giv];
} else {
LED_1_ARRAY[0] = Led8_One_Array[31 - led_giv];
LED_1_ARRAY[1] = Led8_Two_Array[31 - led_giv];
}
led_i ++;
if(led_i == 32) {
led_run_c ++;
led_i = 0;
if(led_run_c == 2) {
LED_1_ARRAY[0] = Led8_Two2_Array[0];
LED_1_ARRAY[1] = Led8_Two2_Array[0];
led_run_c = 0;
led_p_type ++;
led_giv = 0;
break;
}
}
break;
case 2:
led_giv = led_i % 16;
LED_1_ARRAY[0] = Led8_One2_Array[led_giv];
LED_1_ARRAY[1] = Led8_Two2_Array[led_giv];
led_i ++;
if(led_i == 16) {
led_run_c ++;
led_i = 0;
if(led_run_c == 3) {
LED_1_ARRAY[0] = Led8_Two2_Array[0];
LED_1_ARRAY[1] = Led8_Two2_Array[0];
led_run_c = 0;
led_p_type ++;
led_giv = 0;
break;
}
}
break;
case 3:
if(led_i % 2 == 0) {
LED_1_ARRAY[0] = Led8_Two2_Array[15];
LED_1_ARRAY[1] = Led8_Two2_Array[15];
} else {
LED_1_ARRAY[0] = Led8_Two2_Array[0];
LED_1_ARRAY[1] = Led8_Two2_Array[0];
}
led_i ++;
if(led_i == 2) {
led_run_c ++;
led_i = 0;
if(led_run_c == 6) {
LED_1_ARRAY[0] = Led8_Two2_Array[0];
LED_1_ARRAY[1] = Led8_Two2_Array[0];
led_run_c = 0;
led_p_type ++;
led_giv = 0;
break;
}
}
break;
case 4:
led_giv = led_i % 16;
LED_1_ARRAY[0] = Led8_One4_Array[led_giv];
LED_1_ARRAY[1] = Led8_Two4_Array[led_giv];
led_i ++;
if(led_i == 16) {
led_run_c ++;
led_i = 0;
if(led_run_c == 3) {
LED_1_ARRAY[0] = Led8_Two2_Array[0];
LED_1_ARRAY[1] = Led8_Two2_Array[0];
led_run_c = 0;
led_p_type ++;
led_giv = 0;
break;
}
}
break;
case 5:
led_giv = led_i % 17;
LED_1_ARRAY[0] = Led8_One5_Array[led_giv];
LED_1_ARRAY[1] = Led8_Two5_Array[led_giv];
led_i ++;
if(led_i == 17) {
led_run_c ++;
led_i = 0;
if(led_run_c == 3) {
LED_1_ARRAY[0] = Led8_Two2_Array[0];
LED_1_ARRAY[1] = Led8_Two2_Array[0];
led_run_c = 0;
led_p_type = 1;
led_giv = 0;
break;
}
}
break;
}
}
}
}
uchar p = 0;
/* 定时器 0 中断服务函数 */
void InterruptTimer0() interrupt 1{
TH0 = 0xFC; //重新加载初值
TL0 = 0x66;
cnt++; //中断次数计数值加 1
cnt2++;
Shu_Show_Data(SM_Array[shu_sec_array[p]], SHU_Wei_Array[p++]);
if(p == 8) p = 0;
send_data(LED_1_ARRAY[0], LED_1_ARRAY[1]);
}