吴鉴鹰51单片机学习—中断、定时器同时点亮数码管和LED各种效果

LED闪烁有5种效果,数码管点亮有3种效果,包含小彩蛋哟

实现代码如下:

//#include 
#include //typedef unsigned char uchar;
#define uchar unsigned charsbit 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 为模式 1TH0 = 0xFC;  //为 T0 赋初值 0xFC67,定时 1msTL0 = 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;//数码管延时大循环2void 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.3scnt2 = 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++;  //中断次数计数值加 1cnt2++;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]);}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部