色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>C/C++語言編程>

數碼管顯示程序案例分享

大?。?/span>0.12 MB 人氣: 2017-09-06 需要積分:0
數碼管顯示程序案例分享

1、數碼管顯示電子

/*P1.5小時調整?? P1.4分種調整*/
?
#include
#include
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,?// 0, 1, 2, 3
????0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off?
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100;
sbit?K1 = P1^5;
sbit?K2 = P1^4;
bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);
void main(void)
{
?P0 = 0xff;
?P2 = 0xff;
?TMOD = 0x11;??// 定時器0, 1工作模式1, 16位定時方式
?TH1 = 0xdc;
?TL1 = 0;
?TH0 = 0xFC;
?TL0 = 0x17;
?
?hour = 12;
?min = 00;
?sec = 00;
?sec100 = 0;
?
?dis_buf[0] = dis_code[hour / 10];??// 時十位
?dis_buf[1] = dis_code[hour % 10];??// 時個位
?dis_buf[3] = dis_code[min / 10];??// 分十位
?dis_buf[4] = dis_code[min % 10];??// 分個位
?dis_buf[6] = dis_code[sec / 10];??// 秒十位
?dis_buf[7] = dis_code[sec % 10];??// 秒個位
?dis_buf[2] = 0xbf;??????// 顯示"-"
?dis_buf[5] = 0xbf;??????// 顯示"-"
???
?dis_digit = 0xfe;
?dis_index = 0;
?
?TCON = 0x01;
?IE = 0x8a;????// 使能timer0,1 中斷
?
?TR0 = 1;
?TR1 = 1;
?key_v = 0x03;
?while(1)
?{
??if(scan_key())
??{
???delayms(10);
???if(scan_key())
???{
????key_v = key_s;
????proc_key();
???}
??}
??
?}
}
bit scan_key()
{
?key_s = 0x00;
?key_s |= K2;
?key_s <<= 1;
?key_s |= K1;
?return(key_s ^ key_v);?
}
void proc_key()
{
?EA = 0;
?if((key_v & 0x01) == 0)??// K1
?{
??inc_hour();
?}
?else if((key_v & 0x02) == 0)?// K2
?{
??min++;
??if(min > 59)
??{
???min = 0;
??}
??dis_buf[3] = dis_code[min / 10];??// 分十位
??dis_buf[4] = dis_code[min % 10];??// 分個位
?}
?EA = 1;
}
void timer0() interrupt 1
// 定時器0中斷服務程序, 用于數碼管的動態掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數碼管和緩沖區的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數碼管的數值, 如等于0xfe時,
//????選通P2.0口數碼管
// dis_buf?? --- 顯于緩沖區基地址?
{
?TH0 = 0xFC;
?TL0 = 0x17;
?
?P2 = 0xff;???????// 先關閉所有數碼管
?P0 = dis_buf[dis_index];???// 顯示代碼傳送到P0口
?P2 = dis_digit;??????//
?dis_digit = _crol_(dis_digit,1);?// 位選通值左移, 下次中斷時選通下一位數碼管
?dis_index++;??????//?
?????
?dis_index &= 0x07;???// 8個數碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
void timer1() interrupt 3
{
?TH1 = 0xdc;
?
?sec100++;
?
?if(sec100 >= 100)
?{
??sec100 = 0;
??inc_sec();
?}
}
void inc_sec()
{
?sec++;
?if(sec > 59)
?{
??sec = 0;
??inc_min();
?}
?dis_buf[6] = dis_code[sec / 10];??// 秒十位
?dis_buf[7] = dis_code[sec % 10];??// 秒個位?
}
void inc_min()
{
?min++;
?if(min > 59)
?{
??min = 0;
??inc_hour();
?}
?dis_buf[3] = dis_code[min / 10];??// 分十位
?dis_buf[4] = dis_code[min % 10];??// 分個位
}
void inc_hour()
{
?hour++;
?if(hour > 23)
?{
??hour = 0;
?}
?if(hour > 9)
??dis_buf[0] = dis_code[hour / 10];??// 時十位
?else
??dis_buf[0] = 0xff;?????// 當小時的十位為0時不顯示
?dis_buf[1] = dis_code[hour % 10];??// 時個位
}

void delayms(unsigned char ms)?
// 延時子程序
{??????
?unsigned char i;
?while(ms--)
?{
??for(i = 0; i < 120; i++);
?}
}
?

2、數碼管顯示秒表

#include
#include
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,?// 0, 1, 2, 3
????0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off?
unsigned char dis_buf[8];??// 顯示緩沖區
unsigned char sec_bcd[8]; ??// 秒計數值, BCD碼
unsigned char dis_index;??//?
unsigned char key_times;??// K1 按下次數????//
void clr_time();?
void update_disbuf();
bit?scan_key();
void proc_key();
void delayms(unsigned char ms);
sbit?K1 = P1^4;

void main(void)
{
?P0 = 0xff;
?P2 = 0xff;
?TMOD = 0x11;??// 定時器0, 1工作模式1, 16位定時方式
?TH1 = 0xdc;
?TL1 = 0;
?TH0 = 0xFC;
?TL0 = 0x17;
?
?clr_time();???//?
??????????????????????
?dis_digit = 0x7f;??// 初始顯示P20口數碼管
?dis_index = 0;???//?
?
?key_times = 0;
?key_v = 0x01;
?
?IE = 0x8a;????// 使能timer0, timer1中斷
?
?TR0 = 1;
?TR1 = 0;
?while(1)
?{
??if(scan_key())
??{
???delayms(10);
???if(scan_key())
???{
????key_v = key_s;
????proc_key();
???}
??}
??
?}
}
void clr_time()
{
?sec_bcd[0] = 0x0;
?sec_bcd[1] = 0x0;
?sec_bcd[2] = 0x0;
?sec_bcd[3] = 0x0;
?sec_bcd[4] = 0x0;
?sec_bcd[5] = 0x0;
?sec_bcd[6] = 0x0;
?sec_bcd[7] = 0x0;???
?
?update_disbuf();
?
}
bit scan_key()
{
?key_s = 0x00;
?key_s |= K1;
?return(key_s ^ key_v);?
}
void proc_key()
{
?if((key_v & 0x01) == 0)
?{
??key_times++;
??if(key_times == 1)
??{
???TR1 = 1;
??}
??else if(key_times == 2)
??{?
???TR1 = 0;
??}
??else
??{
???clr_time();
???key_times = 0;
??}
??
?}
}
void timer0() interrupt 1
// 定時器0中斷服務程序, 用于數碼管的動態掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數碼管和緩沖區的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數碼管的數值, 如等于0xfe時,
//????選通P2.0口數碼管
// dis_buf?? --- 顯于緩沖區基地址?
{
?TH0 = 0xFC;
?TL0 = 0x17;
?
?P2 = 0xff;???????// 先關閉所有數碼管
?P0 = dis_buf[dis_index];???// 顯示代碼傳送到P0口
?P2 = dis_digit;??????//
?dis_digit = _cror_(dis_digit,1);?// 位選通值右移(P20<-P27), 下次中斷時選通下一位數碼管
?dis_index++;??????//?
?????
?dis_index &= 0x07;???// 8個數碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
void timer1() interrupt 3
//
{?
?unsigned char i;
?TH1 |= 0xdc;
?for(i = 0; i < 8; i++)
?{
??sec_bcd[i]++;???// 低位加1
??if(sec_bcd[i] < 10)??// 如果低位滿10則向高位進1
???break;???// 低位未滿10
??sec_bcd[i] = 0;???// 低位滿10清0
?}
?update_disbuf();???// 更新顯示緩沖區
}
void update_disbuf()
// 更新顯示緩沖區
{
?dis_buf[0] = dis_code[sec_bcd[0]];
?dis_buf[1] = dis_code[sec_bcd[1]];
?dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;?// 加上小數點
?dis_buf[3] = dis_code[sec_bcd[3]];
?dis_buf[4] = dis_code[sec_bcd[4]];
?dis_buf[5] = dis_code[sec_bcd[5]];
?dis_buf[6] = dis_code[sec_bcd[6]];
?dis_buf[7] = dis_code[sec_bcd[7]];
}
void delayms(unsigned char ms)?
// 延時子程序
{??????
?unsigned char i;
?while(ms--)
?{
??for(i = 0; i < 120; i++);
?}
}
?

3、數碼管掃描顯示

#include
#include
unsigned char data dis_digit;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,?// 0, 1, 2, 3
????0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off?
unsigned char data dis_buf[8];
unsigned char data dis_index;
void main()
{
?P0 = 0xff;
?P2 = 0xff;
?TMOD = 0x01;
?TH0 = 0xFC;
?TL0 = 0x17;
?IE = 0x82;
?dis_buf[0] = dis_code[0x1];
?dis_buf[1] = dis_code[0x2];
?dis_buf[2] = dis_code[0x3];
?dis_buf[3] = dis_code[0x4];
?dis_buf[4] = dis_code[0x5];
?dis_buf[5] = dis_code[0x6];
?dis_buf[6] = dis_code[0x7];
?dis_buf[7] = dis_code[0x8];
?
?dis_digit = 0xfe;
?dis_index = 0;
?
?TR0 = 1;
?while(1);
}
void timer0() interrupt 1
// 定時器0中斷服務程序, 用于數碼管的動態掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數碼管和緩沖區的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數碼管的數值, 如等于0xfe時,
//????選通P2.0口數碼管
// dis_buf?? --- 顯于緩沖區基地址?
{
?TH0 = 0xFC;
?TL0 = 0x17;
?
?P2 = 0xff;???????// 先關閉所有數碼管
?P0 = dis_buf[dis_index];???// 顯示代碼傳送到P0口
?P2 = dis_digit;??????//
?dis_digit = _crol_(dis_digit,1);?// 位選通值左移, 下次中斷時選通下一位數碼管
?dis_index++;??????//?
?????
?dis_index &= 0x07;???// 8個數碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 日本美女搞基视频| 国模玲玲自拍337p| 俄罗斯bbbb| 国偷自产视频一区二区99| 美国z0069| 小鸟酱喷水| BL全肉多攻NP高H| 经典三级四虎在线观看| 亚洲欧美日韩在线观看一区二区三区 | 宝贝你骚死哥了好爽| 韩国无遮羞禁动漫在线观看| 欧美日本高清动作片www网站| 艺术片 快播| 国产亚洲精品免费视频| 全免费A敌肛交毛片免费懂色AV| 稚嫩挤奶h调教h| 精品日韩视频| 性夜夜春夜夜爽AA片A| 富婆找黑人老外泻火在线播放| 嫩草影院未满十八岁禁止入内| 一本之道高清在线3线观看| 国产偷国产偷亚洲高清SWAG| 色悠久久久久综合网小说| av在线不卡中文网| 免费A级毛片无码鲁大师| 月夜直播免费观看全集| 九九热这里只有精品2| 麻豆婷婷狠狠色18禁久久| 性欧美金发洋妞xxxxbbbb| 俄罗斯雏妓的BBB孩交| 欧美色图天堂网| 99精品中文字幕在线观看| 麻豆出品国产AV在线观看| 一抽一出BGM免费3分钟| 国产伊人久久| 亚洲AV久久久噜噜噜噜| 国产免国产免费| 亚洲AV久久久噜噜噜久久| 国产亚洲精品久久久久| 亚洲成人免费观看| 幻女FREE性俄罗斯学生|