數(shù)碼管顯示程序案例分享
大?。?/span>0.12 MB 人氣: 2017-09-06 需要積分:0
1、數(shù)碼管顯示電子鐘
/*P1.5小時調(diào)整?? P1.4分種調(diào)整*/?
#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中斷服務(wù)程序, 用于數(shù)碼管的動態(tài)掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數(shù)碼管和緩沖區(qū)的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數(shù)碼管的數(shù)值, 如等于0xfe時,
//????選通P2.0口數(shù)碼管
// dis_buf?? --- 顯于緩沖區(qū)基地址?
{
?TH0 = 0xFC;
?TL0 = 0x17;
?
?P2 = 0xff;???????// 先關(guān)閉所有數(shù)碼管
?P0 = dis_buf[dis_index];???// 顯示代碼傳送到P0口
?P2 = dis_digit;??????//
?dis_digit = _crol_(dis_digit,1);?// 位選通值左移, 下次中斷時選通下一位數(shù)碼管
?dis_index++;??????//?
?????
?dis_index &= 0x07;???// 8個數(shù)碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
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、數(shù)碼管顯示秒表
#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];??// 顯示緩沖區(qū)
unsigned char sec_bcd[8]; ??// 秒計數(shù)值, BCD碼
unsigned char dis_index;??//?
unsigned char key_times;??// K1 按下次數(shù)????//
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口數(shù)碼管
?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中斷服務(wù)程序, 用于數(shù)碼管的動態(tài)掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數(shù)碼管和緩沖區(qū)的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數(shù)碼管的數(shù)值, 如等于0xfe時,
//????選通P2.0口數(shù)碼管
// dis_buf?? --- 顯于緩沖區(qū)基地址?
{
?TH0 = 0xFC;
?TL0 = 0x17;
?
?P2 = 0xff;???????// 先關(guān)閉所有數(shù)碼管
?P0 = dis_buf[dis_index];???// 顯示代碼傳送到P0口
?P2 = dis_digit;??????//
?dis_digit = _cror_(dis_digit,1);?// 位選通值右移(P20<-P27), 下次中斷時選通下一位數(shù)碼管
?dis_index++;??????//?
?????
?dis_index &= 0x07;???// 8個數(shù)碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
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();???// 更新顯示緩沖區(qū)
}
void update_disbuf()
// 更新顯示緩沖區(qū)
{
?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;?// 加上小數(shù)點
?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、數(shù)碼管掃描顯示
#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中斷服務(wù)程序, 用于數(shù)碼管的動態(tài)掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數(shù)碼管和緩沖區(qū)的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數(shù)碼管的數(shù)值, 如等于0xfe時,
//????選通P2.0口數(shù)碼管
// dis_buf?? --- 顯于緩沖區(qū)基地址?
{
?TH0 = 0xFC;
?TL0 = 0x17;
?
?P2 = 0xff;???????// 先關(guān)閉所有數(shù)碼管
?P0 = dis_buf[dis_index];???// 顯示代碼傳送到P0口
?P2 = dis_digit;??????//
?dis_digit = _crol_(dis_digit,1);?// 位選通值左移, 下次中斷時選通下一位數(shù)碼管
?dis_index++;??????//?
?????
?dis_index &= 0x07;???// 8個數(shù)碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
數(shù)碼管顯示程序案例分享下載
相關(guān)電子資料下載
- 基于STM32F429芯片的單片機芯片內(nèi)存映射圖 154
- C語言編寫程序執(zhí)行效率高的原因是什么? 31
- 51單片機溫度控制調(diào)速風(fēng)扇仿真設(shè)計 286
- FPGA協(xié)處理的優(yōu)勢有哪些?如何去使用FPGA協(xié)處理? 887
- 辛苦整理的C語言筆記,一學(xué)就會 56
- 帶參數(shù)宏定義易出現(xiàn)的隱藏bug和定義方式歸納 57
- WT588E語音芯片的基本介紹 122
- ARM9中斷中(C語言)如何實現(xiàn)復(fù)位功能,而不是返回中斷前的狀態(tài)? 131
- C語言之GNU C擴展語法應(yīng)用 27
- C語言中位、字節(jié)和字的定義 整數(shù)類型與浮點數(shù)類型的比較 70