【单片机基础】单片机数码管驱动函数(三极管驱动)
生活随笔
收集整理的這篇文章主要介紹了
【单片机基础】单片机数码管驱动函数(三极管驱动)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
將單片機數碼管顯示驅動封裝成一個函數,方便需要用到的時候直接調用
- 1、數碼管電路原理圖及原理
- 2、數碼管碼表
- 3、位選IO管腳定義
- 4、延時函數
- 5、動態顯示一位數碼管
- 6、動態顯示兩位數碼管
- 7、動態顯示三位數碼管
- 8、動態顯示四位數碼管
- 9、主函數調用示例
1、數碼管電路原理圖及原理
電路圖(圖一)
數碼管顯示原理(圖二)
數碼管根據內部連接不同,分為共陰極和共陽極。八段數碼管內部有8顆LED組成,如果想要顯示特定字形只需控制相應的LED亮起,其他LED熄滅即可。
數碼管顯示方式有兩種:靜態顯示和動態顯示
靜態顯示每個數碼管端口都必須接上數據IO口來保持顯示。當送入字形可一直保持,直到送入新字形為止。
優點:數碼管顯示無閃爍、亮度高、軟件控制比較容易。
缺點:需要的硬件電路較多,如果數碼管增多,當數碼管全部被電量的時候,所需要的電流會增大,對電源的要求也隨之增加。所以,大部分硬件設計中,很少采用靜態顯示的方式。
動態顯示:所有位的數碼管段選線并聯在一起,由位選線進行動態掃描,控制是哪一位數碼管有效。所謂動態掃描顯示就是輪流向各位數碼管送出字形碼和相應的位選,利用發光數碼管的余暉和人眼視覺殘留的作用,使人感覺好像各位數碼管同時都在顯示。
擴展:眼睛的另一個重要特性是視覺惰性,即光象一旦在視網膜上形成,視覺將會對這個光象的感覺維持一個有限的時間,這種生理現象叫做視覺暫留性,對于中等亮度的光刺激,視覺暫留時間約為0.05至0.2秒。
優點:硬件簡單(數碼管越多,這個優勢越明顯),由于每個數碼管只有一個被點亮,所以數碼管消耗的電流較小。
缺點:數碼管亮度不如靜態顯示的亮度高,如果刷新率低,會出現閃爍的現象。
2、數碼管碼表
//數碼管碼表,共陽極 unsigned char leddata[]={ 0xC0, //"0"0xF9, //"1"0xA4, //"2"0xB0, //"3"0x99, //"4"0x92, //"5"0x82, //"6"0xF8, //"7"0x80, //"8"0x90, //"9"0x88, //"A"0x83, //"B"0xC6, //"C"0xA1, //"D"0x86, //"E"0x8E, //"F"0x89, //"H"0xC7, //"L"0xC8, //"n"0xC1, //"u"0x8C, //"P"0xA3, //"o"0xBF, //"-"0xFF, //熄滅0xFF //自定義};//數碼管碼表,共陰極 unsigned char leddata[]={ 0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄滅0x00 //自定義};3、位選IO管腳定義
sbit smg1 = P2^0; sbit smg2 = P2^1; sbit smg3 = P2^2; sbit smg4 = P2^3;4、延時函數
//注意:必須包含<intrins.h>頭文件才能使用 void Delay1ms() //@11.0592MHz {unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i); }void delay_ms(unsigned int time) {unsigned int i;for(i=0; i<time; i++){Delay1ms();} }5、動態顯示一位數碼管
//在數碼管顯示一位數字顯示函數, //unsigned char i 輸入0-9以內的數字 void disply_one_digit(unsigned char i) {P0 = leddata[i];smg4 = 0;delay_ms(5);smg4 = 1; }6、動態顯示兩位數碼管
//在數碼管顯示兩位數字顯示函數, //unsigned char i 輸入0-99以內的數字 void disply_two_digit(unsigned char i) {unsigned char shi,ge;shi = i / 10;ge = i % 10;P0 = leddata[ge];smg4 = 0;delay_ms(5);smg4 = 1;P0 = leddata[shi];smg3 = 0;delay_ms(5);smg3 = 1; }7、動態顯示三位數碼管
//在數碼管顯示三位數字顯示函數, //unsigned char i 輸入0-999以內的數字 void disply_three_digit(unsigned int i) {unsigned int ge,shi,bai;bai = i / 100;shi = i % 100 / 10;ge = i % 10;P0 = leddata[ge];smg4 = 0;delay_ms(5);smg4 = 1;P0 = leddata[shi];smg3 = 0;delay_ms(5);smg3 = 1;P0 = leddata[bai];smg2 = 0;delay_ms(5);smg2 = 1; }8、動態顯示四位數碼管
//在數碼管顯示四位數字顯示函數, //unsigned char i 輸入0-9999以內的數字 void disply_four_digit(unsigned int i) {unsigned int ge,shi,bai,qian;qian = i / 1000 % 10;bai = i / 100 % 10;shi = i / 10 % 10;ge = i % 10;P0 = leddata[ge];smg4 = 0;delay_ms(5);smg4 = 1;P0 = leddata[shi];smg3 = 0;delay_ms(5);smg3 = 1;P0 = leddata[bai];smg2 = 0;delay_ms(5);smg2 = 1;P0 = leddata[qian];smg1 = 0;delay_ms(5);smg1 = 1; }9、主函數調用示例
void main() {while(1){ // disply_one_digit(5); // // disply_two_digit(9); // // disply_three_digit(123);disply_four_digit(1234);} }總結
以上是生活随笔為你收集整理的【单片机基础】单片机数码管驱动函数(三极管驱动)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Directory Opus一款功能强大
- 下一篇: 【jQuery】jQuery 教程