我給你來個程序試試
- #include <pic.h> //調用PIC16F87XA單片機的頭文件
- //根據(jù)選項,配置字應該如下所示:
- //__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);
- //實際使用中,這樣太麻煩,對于默認選項,我們將其忽略掉:
- __CONFIG(HS&WDTDIS&LVPDIS);
- //---------------------------------------
- //數(shù)碼管字形表,供顯示時查詢
- const unsigned char LED[10]=
- { //定義表格一定要使用const,這樣會做到程序存儲區(qū)中
- 0B00111111, //"0"的字形表,0x3F
- 0B00000110, //"1"的字形表,0x06
- 0B01011011, //"2"的字形表,0x5B
- 0B01001111, //"3"的字形表,0x4F
- 0B01100110, //"4"的字形表,0x66
- 0B01101101, //"5"的字形表,0x6D
- 0B01111101, //"6"的字形表,0x7D
- 0B00000111, //"7"的字形表,0x07
- 0B01111111, //"8"的字形表,0x7F
- 0B01101111, //"9"的字形表,0x6F
- };
- //---------------------------------------
- //4位數(shù)碼管相關I/O設置
- #define U5A RB0 //4位數(shù)碼管單元的U5(74HC138)的A腳接在RB0口上
- #define U5B RB1 //4位數(shù)碼管單元的U5(74HC138)的B腳接在RB1口上
- #define U5C RB2 //4位數(shù)碼管單元的U5(74HC138)的C腳接在RB2口上
- //---------------------------------------
- void main(void) //主函數(shù),單片機開機后就是從這個函數(shù)開始運行
- {
- unsigned char c=0; //定義一個char型變量,做延時用
- unsigned char d=0; //定義一個char型變量,控制顯示位置
- unsigned char e=0; //定義一個char型變量,做延時用
- unsigned int f=9999; //定義一個int型變量,顯示內容用,顯示內容0-9999
- TRISB=0B11111000; //初始化RB7-RB0的輸入輸出方向
- TRISD=0B00000000; //初始化RD7-RD0的輸入輸出方向
- PORTB=0B00000000; //初始化RB7-RB0的數(shù)值
- PORTD=0B00000000; //初始化RD7-RD0的數(shù)值
- while(1) //死循環(huán),單片機初始化后,將一直運行這個死循環(huán)
- {
- for(c=0;c<250;c++);//做一個0-250的循環(huán),不執(zhí)行其他操作,只為延時
- if(++e>200) //做一個延時,時間到將顯示內容加1
- {
- e=0; //清零,為下一次延時做準備
- if(--f<=0) f=9999;//顯示內容加1,因為只有4位顯示,超過9999后歸零
- }
- PORTD=0; //關一次顯示,以免顯示出鬼影
- if(++d>3) d=0; //先將d加1,然后判斷是否大于3,大于3歸零
- if(d==0) //如果d=0,顯示千位
- {
- U5A=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進行顯示
- U5B=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進行顯示
- U5C=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進行顯示
- PORTD=LED[f/1000]; //將要顯示的f的千位提取出來查表后送顯示
- }
- else if(d==1) //如果d=1,顯示百位
- {
- U5A=1; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進行顯示
- U5B=0; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進行顯示
- U5C=0; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進行顯示
- PORTD=LED[(f%1000)/100]; //將要顯示的f的百位提取出來查表后送顯示
- }
- else if(d==2) //如果d=2,顯示十位
- {
- U5A=0; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進行顯示
- U5B=1; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進行顯示
- U5C=0; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進行顯示
- PORTD=LED[(f%100)/10]; //將要顯示的f的十位提取出來查表后送顯示
- }
- else if(d==3) //如果d=3,顯示個位
- {
- U5A=1; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個位進行顯示
- U5B=1; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個位進行顯示
- U5C=0; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個位進行顯示
- PORTD=LED[f%10]; //將要顯示的f的個位提取出來查表后送顯示
- }
- }
- }
復制代碼 |