閑時就準備一些外設,編個程序練練C語言。春節是個大好時光 。
買了16X32的點陣套件,動手焊了一塊顯示屏,配合一個單片機開發板,搭了一個顯示系統。
這個系統關鍵是程序。買套件時有附了一些示范程序。感覺太復雜,自己動手編了一個。調試
成功,拿出來大家分享一下。視頻
IMG_20210220_122244.jpg (3.17 MB, 下載次數: 63)
下載附件
2021-2-20 12:31 上傳
IMG_20210220_122236.jpg (2.97 MB, 下載次數: 70)
下載附件
2021-2-20 12:31 上傳
IMG_20210220_124046.jpg (3.39 MB, 下載次數: 79)
下載附件
2021-2-20 12:42 上傳
單片機源程序如下:
- /* 白居易 長恨歌
- 標準08接口點陣屏管腳定義
- GND A ABCD是行掃描信號
- GND B
- GND C
- OE D OE是屏的使能端 低有效
- R1 G1 上半屏綠色
- R2 G2 下半屏綠色 本板由于沒有使用R2 G2,故把這兩腳改接為VCC,方便大家接線。
- GND STR 鎖存信號
- GND SCK 時鐘信號
- */
- /*接口說明*/
- //A B C D 是138行掃描信號
- // SCK 是595的移位信號
- // STR 是595的鎖存信號
- // OE 是屏的使能端 可以控制亮度
- // R 是紅色信號線
- // G 是綠色信號線
- // 本板由于沒有使用R2 G2,故把這兩腳改接為VCC,方便大家接線。
- #include<reg52.h>
- #include<intrins.h>
- #include<stdio.h>
- #define u8 unsigned char
- #define u16 unsigned int
-
- /*****************************接口定義********************************/
- sbit sck=P0^1;//595的移位信號
- sbit str=P0^2;//是595的鎖存信號
- sbit sda_r=P2^7;//紅數據
- sbit sda_g=P0^4;//綠數據
- sbit OE=P0^5;//輸出使能
- sbit sign=P0^7;//檢測用LED
- sbit IA=P2^0;//行控制線A
- sbit IB=P2^1;//行控制線B
- sbit IC=P2^2;//行控制線C
- sbit ID=P2^3;//行控制線D
- /********************************************************************/
-
- #define scan0 {IA=0;IB=0;IC=0;ID=0;}
- #define scan1 {IA=1;IB=0;IC=0;ID=0;}
- #define scan2 {IA=0;IB=1;IC=0;ID=0;}
- #define scan3 {IA=1;IB=1;IC=0;ID=0;}
- #define scan4 {IA=0;IB=0;IC=1;ID=0;}
- #define scan5 {IA=1;IB=0;IC=1;ID=0;}
- #define scan6 {IA=0;IB=1;IC=1;ID=0;}
- #define scan7 {IA=1;IB=1;IC=1;ID=0;}
- #define scan8 {IA=0;IB=0;IC=0;ID=1;}
- #define scan9 {IA=1;IB=0;IC=0;ID=1;}
- #define scan10 {IA=0;IB=1;IC=0;ID=1;}
- #define scan11 {IA=1;IB=1;IC=0;ID=1;}
- #define scan12 {IA=0;IB=0;IC=1;ID=1;}
- #define scan13 {IA=1;IB=0;IC=1;ID=1;}
- #define scan14 {IA=0;IB=1;IC=1;ID=1;}
- #define scan15 {IA=1;IB=1;IC=1;ID=1;}
- u16 adj,kk;
- u8 x,y;//
- u8 line,k; //line變量被多個函數調用
- u8 code ziku[];
- u8 buff_all[16][6];//對字庫里面的字重新排序緩存,
- u8 buff[4]; //行緩存
- u8 buff_1[6];//數據移位緩存
- /******************************************************/
- u16 zishu=977;// 輸入目前字庫中字的個數!!!!!!!!!!!!!!!!!!!!!!!!!
- /********************************************************/
- void rxd_data(); // 發送數據
- void load_data();
- void scan(u8 Value)
- {switch(Value)
- {case 0: scan0;break;
- case 1: scan1;break;
- case 2: scan2;break;
- case 3: scan3;break;
- case 4: scan4;break;
- case 5: scan5;break;
- case 6: scan6;break;
- case 7: scan7;break;
- case 8: scan8;break;
- case 9: scan9;break;
- case 10:scan10;break;
- case 11:scan11;break;
- case 12:scan12;break;
- case 13:scan13;break;
- case 14:scan14;break;
- case 15:scan15;break;
- default:break;
- }
- }
- /*******************************************************************************
- * 函 數 名 : delay
- * 函數功能 : 延時函數,i=1時,大約延時10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /****************字庫字按顯示順序調序放入2維數組緩存中,便于顯示時調取 */
- void adj_ziku()
- {
- u8 w,v;
- v=zishu*2;
- for(y=0;y<16;y++)
- {
- for(x=0;x<6;x++) //zhuang 3 ge zi
- {
- w=x/2;//除2取整
- buff_all[y][x]=ziku[adj*32+2*y+32*w+x%2];
- }
- }
-
- } //ok
-
- /*主函數*/
- void main()
- {
- u8 del;
- u16 count ;//字庫輸入后要更改,循環次數=(zishu/2-1 )*16
-
- while(1)
- {
- adj=0;//這個很重要,否則不會從0開始??原因不明
- count=zishu*16+1-32 ;
- delay(50000);
- delay(50000);
- for(kk=0;kk<zishu-2;kk++)
- {
- for(k=0;k<16;k++) //走完一個字
- {
- for(del=0;del<1;del++) //一幀停留時間控制
- {
- adj_ziku();
- for(line=0;line<16;line++)
- {
- load_data();
- rxd_data();
- scan(line);
- str=1; //595鎖存
- str=0;
- OE=0; //各相應位輸出
- delay(15); //數值大,亮度高,但會閃爍
- OE=1;//關閉595輸出(都為HIGH)
- }
- }
- // delay(501);
- }
- adj++;
- }
- adj=0;
- }
- }
- /**********************************************************/
- void load_data(void) //裝每行的4個字節到緩存buff中
- { u8 q1,q3,q4,n;
- q3=k/8; q4=k%8;
- for(q1=0;q1<6;q1++) //預裝3個字
- {
- buff_1[q1]=buff_all[line][q3+q1];
- }
- if(q4==0)
- {
- for(n=0;n<4;n++)
- {buff[n]=buff_1[n]; }
- }
- else
- {
- for(n=0;n<4;n++)
- {
- buff[n]=(buff_1[n]<<q4)|(buff_1[n+1]>>(8-q4));
- }
- }
- }
- /***********************發送數據****************************/
- void rxd_data(void) //串行發送數據
- {
- u8 s;
- u8 temp,k;
-
- for(s=0;s<4;s++) //發送4字節數據
- {
- temp=buff[s];
- temp=~temp;//取反才能字亮背景暗
- for(k=0;k<8;k++)//一個字節8位 發送給595
- {
- sck=0; //上升沿移位595
- sda_g=temp>>7; //先送最高位,
- temp<<=1;
- sck=1;
- }
- }
- }
- //字庫
- u8 code ziku[]={
- /*-- 文字: 《 --*/
- /*-- 新宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x10,0x00,0x24,0x00,0x48,0x00,0x90,0x01,0x20,0x02,0x40,0x04,0x80,0x09,0x00,
- 0x04,0x80,0x02,0x40,0x01,0x20,0x00,0x90,0x00,0x48,0x00,0x24,0x00,0x10,0x00,0x00,
- /*-- 文字: 長 --*/
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (2.36 KB, 下載次數: 65)
下載附件
2021-2-20 16:48 上傳
所有程序51hei提供下載:
多字左移測試.rar
(19.4 KB, 下載次數: 20)
2021-2-20 12:43 上傳
點擊文件名下載附件
c文件,copy后KEIL重新編譯一下 下載積分: 黑幣 -5
|