很久以前寫P10的程序用51單片機寫的!作為紀念分享給更多需要的人!
單片機源程序如下:
- /******************************************************************
- * *
- * P10 Moving LED Demo Program 2012/2/2 *
- * *
- * 作者: DSL *
- * *
- ******************************************************************/
- #include <reg51.h>
- #include <intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- /***********************字點陣碼*************************/
- uchar code CharTable[]=
- {
- //0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"黑屏"*/
- 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"0"*/
-
- 0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,/*"1"*/
- 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0xFF,0xFF,/*"2"*/
- 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"3"*/
- 0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1,0xFF,0xFF,/*"4"*/
- 0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"5"*/
- 0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"6"*/
- 0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,/*"7"*/
- 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,/*"8"*/
- 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF,/*"9"*/
- };
- sbit RCK_595 = P2^0; //輸出鎖存器控制脈沖(L)
- sbit SCLK_595 = P2^1; //移位時鐘脈沖(S)
- sbit Sdata_Red = P2^2; //串行數據輸入(RED)
- sbit G_74138 = P2^4; //顯示允許控制信號端口(EN)
- uint col;
- uchar code CharTable[];
- uchar Word, DispRow;
- uchar CharBuf[40];
- /**********************************************************
- 將顯示數據送入74HC595內部移位寄存器
- **********************************************************/
- void WR_595(uchar buf)
- {
- uchar x;
-
- for (x=0; x<8; x++)
- {
- Sdata_Red=buf&0x80;
- buf = buf << 1; //數據左移一位
-
- SCLK_595 = 1; //上升沿發生移位
- _nop_();
- SCLK_595 = 0;
- }
- }
- /** Combine two byte to one byte to form shifting byte **/
- uchar two_onebyte(uchar h1,uchar h2)
- {
- uchar temp;
- temp=(h1<<col)|(h2>>(8-col)); //left shift
- return (temp);
- }
- /***************發送一線點陣數據*******************/
- void sendoneline()
- {
- uchar s,buf;
- for(s=0; s<16; s++) //need to be 16 for 1/4 scan time
- {
- G_74138 = 1; //打開顯示
- buf=two_onebyte(CharBuf[s],CharBuf[s+4]);
- WR_595(buf); //load 8 bit into shift register LS595
- }
- P1 = P1&0xf0;
- RCK_595 = 1; //鎖存數據
- _nop_();
-
- RCK_595 = 0;
- G_74138 = 0; //打開顯示
- }
- /**************裝載一線點陣數據****************/
- void loadoneline()
- {
- uchar s; //panel max display char plus 1, for 16x32 numeric display, s=4+1
- for(s=0;s<5;s++)
- {
- CharBuf[4*s+0] = CharTable[Word+(16*s+3*4)+DispRow];
- CharBuf[4*s+1] = CharTable[Word+(16*s+2*4)+DispRow];
- CharBuf[4*s+2] = CharTable[Word+(16*s+1*4)+DispRow];
- CharBuf[4*s+3] = CharTable[Word+(16*s+0*4)+DispRow];
- }
- }
- /**********************************************************
- 主函數
- **********************************************************/
- void main()
- {
- uchar i,SPEED;
- G_74138 = 0;
- col=0;
- Word=0;
- SPEED=20;
- P1=0;
-
- while(1)
- {
- while(col<8) //Already load max display char + 1, this routine is to shift one char
- //Total display will be max display char + 1, for 16x32, display char=5
- //After display total shifting char, it will point to next char
- {
- for(i=0;i<SPEED;i++)//漢字在屏幕上的停留時間(即移動速度快慢)
- {
- for (DispRow=0;DispRow<4;DispRow++) //掃描4行
- {
- loadoneline(); //裝載一線點陣數據
- sendoneline(); //發送一線點陣數據
- P1=DispRow;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
P10 Moving LED.rar
(1.65 KB, 下載次數: 66)
2017-7-8 23:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|