16*16點陣滾動顯示制作出來的實物圖如下:
0.jpg (74.53 KB, 下載次數: 65)
下載附件
2019-6-1 03:01 上傳
0.png (754.1 KB, 下載次數: 52)
下載附件
2019-6-1 03:00 上傳
0.png (971.59 KB, 下載次數: 66)
下載附件
2019-6-1 03:00 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (15.74 KB, 下載次數: 58)
下載附件
2019-6-1 03:01 上傳
單片機源程序如下:
- //宏定義
- #define uchar unsigned char
- #define uint unsigned int
- #define zishu 10 //漢字數,兩個字符是一個漢字,如果有單個字符,那么就加0.5
- //包含頭文件
- #include <reg51.h>
- #include <intrins.h>
- //管腳定義
- //154
- sbit A_=P0^0; //74HC154的A
- sbit B_=P0^1; //74HC154的B
- sbit C_=P0^2; //74HC154的C
- sbit D_=P0^3; //74HC154的D
- sbit G2=P0^7; //74HC154的使能 低電平有效
- //595
- sbit SI=P0^6;//數據腳
- sbit SCK=P0^5;//上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變
- sbit RCK=P0^4;//上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將
- //RCK置為低電平,當移位結束后,在RCK端產生一個正脈沖(5V時,大于幾十納秒就行了。我
- //通常都選微秒級),更新顯示數據。
- //函數聲明
- void Init595();
- void Write_byte595(uchar temp);
- void WriteS(uchar data1,uchar data2);
- void Wei_154(uchar W);
- void delay(uint z);
- //漢字數組
- uchar code HanZi[]=
- {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",1*/ //這兩行不要動改字時保留
- 0xFF,0xFF,0x80,0x00,0xBF,0xFF,0xB7,0xFF,0xB6,0x07,0xB6,0xEF,0xB6,0xEF,0xB6,0xEF,
- 0xB6,0xEF,0xB6,0xEF,0xB6,0x07,0xB7,0xFD,0xBF,0xFE,0x80,0x01,0xFF,0xFF,0xFF,0xFF,/*"同",0*/
- 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,
- 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,/*"一",1*/
- 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0xFF,0xFB,0xFF,0xF7,0xFF,0xCF,0xFF,0x38,0x01,
- 0xDF,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,0xF9,0xFF,0xFC,0xFF,0xFD,0xFF,0xFF,0xFF,/*"個",2*/
- 0xFB,0xFF,0xFB,0xFF,0xFB,0xFF,0x80,0x03,0xFB,0xFB,0xFB,0xFB,0x80,0x1B,0xFB,0xBB,
- 0xFB,0xBB,0xFB,0xBB,0xFB,0xBB,0x80,0x1B,0xFB,0xF3,0xFB,0xFB,0xFB,0xFF,0xFF,0xFF,/*"世",3*/
- 0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0x00,0xDE,0x6D,0xDD,0x6D,0xBB,0x6D,0x47,0x00,0xFF,
- 0x6C,0xFF,0x6D,0x40,0x6D,0xBF,0x6D,0xBF,0x00,0xDF,0xFF,0xCF,0xFF,0xDF,0xFF,0xFF,/*"界",4*/
- 0xFF,0xFF,0x80,0x00,0xBF,0xFF,0xB7,0xFF,0xB6,0x07,0xB6,0xEF,0xB6,0xEF,0xB6,0xEF,
- 0xB6,0xEF,0xB6,0xEF,0xB6,0x07,0xB7,0xFD,0xBF,0xFE,0x80,0x01,0xFF,0xFF,0xFF,0xFF,/*"同",5*/
- 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,
- 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,/*"一",6*/
- 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0xFF,0xFB,0xFF,0xF7,0xFF,0xCF,0xFF,0x38,0x01,
- 0xDF,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,0xF9,0xFF,0xFC,0xFF,0xFD,0xFF,0xFF,0xFF,/*"個",7*/
- 0xFD,0xFF,0xDD,0xFE,0xDB,0xEE,0xD7,0xEE,0x00,0x9D,0xD6,0x5D,0xD9,0x6B,0xFD,0x73,
- 0xDB,0x77,0xD7,0x6F,0x00,0x5F,0xCF,0x3F,0xD3,0x7F,0xD9,0xFF,0xDB,0xFF,0xFF,0xFF,/*"夢",8*/
- 0xEF,0x7F,0xEC,0xFD,0xE3,0xF1,0x00,0x7F,0xE7,0xE3,0xE9,0xFD,0xEF,0xFD,0xFF,0xDD,
- 0x80,0x65,0xAB,0x7D,0xAB,0x7D,0xAB,0x79,0xAB,0x7F,0x80,0x6F,0xFF,0xF3,0xFF,0xFF,/*"想",9*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",10*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",11*/ //這兩行不要動改字時保留
- };
- //主函數
- void main()
- {
- uchar i=1,j=0;
- uint X=0;
- //595c初始化
- Init595();
- //循環演示
- while(1) //循環
- {
- for(j=0;j<10;j++) //更改j<10為j<5,可以加速
- {
- for(i=1;i<17;i++) //一個for循環,分別選中16個列
- {
- WriteS(0xff,0xff); //消影
- Wei_154(i); //選中列數據
- WriteS(HanZi[i*2-2+2*X],HanZi[i*2-1+2*X]); //顯示內容
- Wei_154(i); //再選中列數據
- delay(7); //延時的時間就是顯示的時間
- G2=0; //打開列選
- }
- }
- X++; //顯示左移
- if(X==8*((zishu+1)*2)) //左移到最后一個字--更改字時,8*n中的n的取值為:字符數+2(一個漢字=兩個字符,字母數字為1個字符)
- X=0; //重頭開始
- }
- }
- //初始化595
- void Init595()
- {
- SI=1;
- SCK=0;
- RCK=0;
- }
- void Write_byte595(uchar temp) //寫數據到595
- {
- uchar i,data_=temp;
- G2=1; //關閉列選
- for(i=0;i<8;i++) //傳值8位
- {
- if(data_&0x01==0x01) //判斷低位為1
- {
- SI=1; //數據腳就寫入1
- }
- else //判斷低位為0
- {
- SI=0; //數據腳寫入0
- }
- //產生一個上升沿
- SCK=0;
- SCK=1;
- SCK=0;
- data_>>=1; //將要寫入的數據右移一位
- }
- RCK=0;//顯示數據
- RCK=1;
- RCK=0;
- }
- //595寫入一行的字節
- void WriteS(uchar data1,uchar data2)
- {
- Write_byte595(data2); //寫入高8位數據
- Write_byte595(data1); //寫入低8位數據 一共是一行16個數據
- }
- //154位選驅動
- void Wei_154(uchar W)
- {
- G2=0;//使能
- switch(W) //判斷W的值,選中不同的列線
- {
- case 16: //如果W=16
- {
- A_=1;
- B_=1;
- C_=1;
- D_=1; //1111:選中第16列
- break;
- }
- case 15:
- {
- A_=0;
- B_=1;
- C_=1;
- D_=1; //1110:選中第15列
- break;
- }
- case 14:
- {
- A_=1;
- B_=0;
- C_=1;
- D_=1; //1101:選中第14列
- break;
- }
- case 13:
- {
- A_=0;
- B_=0;
- C_=1;
- D_=1; //1100:選中第13列
- break;
- }
- case 12:
- {
- A_=1;
- B_=1;
- C_=0;
- D_=1; //1011:選中第12列
- break;
- }
- case 11:
- {
- A_=0;
- B_=1;
- C_=0;
- D_=1; //1010:選中第11列
- break;
- }
- case 10:
- {
- A_=1;
- B_=0;
- C_=0;
- D_=1; //1001:選中第10列
- break;
- }
- case 9:
- {
- A_=0;
- B_=0;
- C_=0;
- D_=1; //1000:選中第9列
- break;
- }
- case 8:
- {
- A_=1;
- B_=1;
- C_=1;
- D_=0; //0111:選中第8列
- break;
- }
- case 7:
- {
- A_=0;
- B_=1;
- C_=1;
- D_=0; //0110:選中第7列
- break;
- }
- case 6:
- {
- A_=1;
- B_=0;
- C_=1;
- D_=0; //0101:選中第6列
- break;
- }
- case 5:
- {
- A_=0;
- B_=0;
- C_=1;
- D_=0; //0100:選中第5列
- break;
- }
- case 4:
- {
- A_=1;
- B_=1;
- C_=0;
- D_=0; //0011:選中第4列
- break;
- }
- case 3:
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
42-16乘16點陣滾動顯示.7z
(1.04 MB, 下載次數: 70)
2019-6-1 03:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|