|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- //-----------------------------------------------------------------
- // 名稱: 8×8LED點陣屏顯示數(shù)字
- //-----------------------------------------------------------------
- // 說明: 8×8LED點陣屏循環(huán)顯示數(shù)字0-9,刷新過程由定時器中斷完成
- //
- //-----------------------------------------------------------------
- #include <pic.h>
- #define INT8U unsigned char
- #define INT16U unsigned int
- #define _XTAL_FREQ 1000000UL
- unsigned char s,m;
- unsigned char column[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //column number select chart
- //數(shù)字0~9的8*8點陣編碼
- //const INT8U Table_OF_Digits[] =
- //{
-
- //};
- const unsigned char dot5x3[10][3] = {
- {0x07,0x77,0x07}, //0 3column for 1 digit
- {0xff,0x07,0xff}, //1
- {0x47,0x57,0x17}, //2
- {0x57,0x57,0x07}, //3
- {0x1f,0xdf,0x07}, //4
- {0x17,0x57,0x47}, //5
- {0x07,0x57,0x47}, //6
- {0x7f,0x7f,0x07}, //7
- {0x07,0x57,0x07}, //8
- {0x17,0x57,0x07}, //9
- };
- void display()
- {
- INT8U i,j;
-
- for (i=0;i<32;i++)
- {
- for (j=0;j<12;j++)
- {
- if(16>i&&i>=0)
- {
- if(i<8)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m/10][0]>>2|11000000;
- PORTC=column[i%8]; //選通第1個點陣,顯示第i列
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m/10][0]>>2|11000000;
- PORTD=column[i%8]; //選通第2個點陣,顯示第i列
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(17>i&&i>=1)
- {
- if(i<9)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m/10][1]>>2|11000000;
- PORTC=column[(i-1)%8]; //選通第1個點陣,顯示第i列
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m/10][1]>>2|11000000;
- PORTD=column[(i-1)%8]; //選通第2個點陣,顯示第i列
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(18>i&&i>=2)
- {
- if(i<10)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m/10][2]>>2|11000000;
- PORTC=column[(i-2)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m/10][2]>>2|11000000;
- PORTD=column[(i-2)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(19>i&&i>=3)
- {
- if(i<11)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTC=column[(i-3)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTD=column[(i-3)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(20>i&&i>=4)
- {
- if(i<12)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m%10][0]>>2|11000000;
- PORTC=column[(i-4)%8]; //選通左起第1個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m%10][0]>>2|11000000;
- PORTD=column[(i-4)%8]; //選通左起第1個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(21>i&&i>=5)
- {
- if(i<13)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m%10][1]>>2|11000000;
- PORTC=column[(i-5)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m%10][1]>>2|11000000;
- PORTD=column[(i-5)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(22>i&&i>=6)
- {
- if(i<14)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m%10][2]>>2|11000000;
- PORTC=column[(i-6)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[m%10][2]>>2|11000000;
- PORTD=column[(i-6)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(23>i&&i>=7)
- {
- if(i<15)
- {
- PORTB=0xff; //關(guān)閉顯示
- //RTC=column[(i-7)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- //RTD=column[(i-7)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(24>i&&i>=8)
- {
- if(i<16)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s/10][0]>>2|11000000;
- PORTC=column[(i-8)%8]; //選通左起第1個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s/10][0]>>2|11000000;
- PORTD=column[(i-8)%8]; //選通左起第1個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(25>i&&i>=9)
- {
- if(i<17)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s/10][1]>>2|11000000;
- PORTC=column[(i-9)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s/10][1]>>2|11000000;
- PORTD=column[(i-9)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(26>i&&i>=10)
- {
- if(i<18)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s/10][2]>>2|11000000;
- PORTC=column[(i-10)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s/10][2]>>2|11000000;
- PORTD=column[(i-10)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(27>i&&i>=11)
- {
- if(i<19)
- {
- PORTB=0xff; //關(guān)閉顯示
- //RTC=column[(i-11)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- //RTD=column[(i-11)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- }
- }
- if(28>i&&i>=12)
- {
- if(i<20)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s%10][0]>>2|11000000;
- PORTC=column[(i-12)%8]; //選通左起第1個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s%10][0]>>2|11000000;
- PORTD=column[(i-12)%8]; //選通左起第1個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(29>i&&i>=13)
- {
- if(i<21)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s%10][1]>>2|11000000;
- PORTC=column[(i-13)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s%10][1]>>2|11000000;
- PORTD=column[(i-13)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(30>i&&i>=14)
- {
- if(i<22)
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s%10][2]>>2|11000000;
- PORTC=column[(i-14)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- PORTB=dot5x3[s%10][2]>>2|11000000;
- PORTD=column[(i-14)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- if(31>i&&i>=15)
- {
- if(i<23)
- {
- PORTB=0xff; //關(guān)閉顯示
- //RTC=column[(i-15)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTC=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- else
- {
- PORTB=0xff; //關(guān)閉顯示
- //RTD=column[(i-15)%8]; //選通左起第2個數(shù)碼管,顯示i位
- __delay_ms(1); //顯示延時
- PORTD=0x00; //關(guān)閉顯示
- PORTB=0xff; //關(guān)閉顯示
- }
- }
- }
- //__delay_ms(40);
- }
- __delay_ms(2000); //顯示延時
- }
- //------------------------------------------------------------------
- // 主程序
- //------------------------------------------------------------------
- void main()
- {
-
- TRISB = TRISC = TRISD = 0x00; //配置端口
- //TRISB=0x00;TRISC=0x00; //PB PC PD out put
- PORTB=0xff;
- PORTC=PORTD=0x00;
- PSA=0;
- PS2=0; PS1=PS0=1;
- TMR0 = (INT8U)(256-_XTAL_FREQ/16*0.002);
- T0IF=0;
- T0CS=0;
- T0IE=1;
- GIE=1;
- s=45;m=59;
- while(1)
- {
-
- display();
- // __delay_ms(10);
- }
- }
- //-----------------------------------------------------------------
- // TMR0溢出中斷控制點陣屏刷新顯示
- //-----------------------------------------------------------------
- void interrupt TMR0_OVR_Interrupt()
- {
- //static INT8U i = 0, Num_Index = 0;
- static INT8U t = 0;
- if (T0IE & T0IF)
- {
- T0IF=0;
- t++;
- if (t==61)
- {
- t=0;s++;
-
- if (s==60)
- {
- s=0;m++;
- if (m==60)
- {m=0;}
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
2-8x8led.zip
(23.97 KB, 下載次數(shù): 40)
2020-5-26 04:10 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|