【C51单片机】LED胸牌设计(仿真)
生活随笔
收集整理的這篇文章主要介紹了
【C51单片机】LED胸牌设计(仿真)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、功能描述
設計16*64LED點陣屏,制作胸牌,顯示如下效果,并且讓字體有滾動效果(字體從下到上、從上到下、從左到右、從右到左顯示)
2、PROTEUS中設計的電路圖
3、源代碼(代碼中有詳細注釋)
#include <reg51.h> #include <intrins.h> sbit OE=P1^0;//鎖存 sbit EN=P1^1;//行選輸出允許 //陰碼,按行取模,低位在前 unsigned char code font[][32]={ {0x00,0x03,0x00,0x03,0x00,0x0F,0x00,0x0F,0x00,0x3C,0x00,0x3C,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x00,0x3C,0x00,0x0F,0x00,0x0F,0x00,0x03,0x00,0x03},/*"C:\Users\FUTURE\Desktop\箭頭.bmp",0*/{0x40,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x20,0x00,0x20,0x00,0x20,0x00,0xE0,0x0F, 0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x08,0x10,0x08,0x08,0x08,0x04,0x05,0x02,0x02},/*"方",0*/{0x00,0x00,0x3C,0x1E,0x7E,0x3F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x3F, 0xFC,0x1F,0xF8,0x1F,0xF0,0x0F,0xE0,0x07,0xC0,0x03,0xC0,0x01,0x80,0x00,0x00,0x00},/*"C:\Users\FUTURE\Desktop\心.bmp",0*/{0x08,0x00,0x10,0x20,0xFE,0x1E,0x00,0x02,0x44,0x02,0x28,0x02,0xFF,0x7E,0x10,0x12, 0x10,0x12,0xFE,0x12,0x10,0x12,0x54,0x12,0x92,0x12,0x11,0x11,0x14,0x11,0x88,0x10},/*"新",0*/{0xC0,0x00,0xE0,0x00,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0xFE,0x7F,0xFF,0xFF, 0xFF,0xFF,0xFE,0x7F,0x3E,0x00,0x7C,0x00,0xF8,0x00,0xF0,0x00,0xE0,0x00,0xC0,0x00},/*"C:\Users\FUTURE\Desktop\箭頭(反).bmp",0*/ }; void delay(unsigned int xms) {int i,j;for(i=0;i<=xms;i++)for(j=0;j<=110;j++); }//從下往上 void downtoup() { unsigned char i=0,k,m,j,x,y;for(i=0;i<16;i++) //i:16幀for(x=0;x<15;x++) //x:一幀重復顯示20次,實際上控制的是上下滾動的速度for(k=15-i,m=0;k<16;k++,m++) //k:第一幀從第15行開始顯示,第二幀從第14行開始顯示。。。。。。//m:總是從第0行開始送字模{ EN=1;//行選輸出禁止for(j=0,y=0;j<5;j++) //j:共5個字,一次送一個字的一行//y:總是從第0列點陣屏開始{ P0=font[j][2*m]; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存P0=font[j][2*m+1]; //一行的高8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存}P2=k; //設置行選信號EN=0; //行選輸出允許delay(1);} }//從上往下 void uptodown() { unsigned char i=0,k,m,j,x,y;for(i=0;i<16;i++) //i:16幀for(x=0;x<15;x++) //x:一幀重復顯示20次,實際上控制的是上下滾動的速度for(k=0,m=15-i;k<=i;k++,m++) //k:每幀都是從第0行開始顯示,第i幀共顯示i行//m:第一幀從第15行開始送字模,第二幀從第14行開始送字模{ EN=1;//行選輸出禁止for(j=0,y=0;j<5;j++) //j:共8個字,一次送一個字的一行//y:總是從第0列點陣屏開始{ P0=font[j][2*m]; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存P0=font[j][2*m+1]; //一行的高8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存}P2=k; //設置行選信號EN=0; //行選輸出允許delay(1);} }//從右往左,一次移動一個字 void righttoleft() { unsigned char i,k,j,x,y;for(i=0;i<6;i++) //i:5幀,,第6幀是讓最后顯示空白for(x=0;x<20;x++) //x:一幀重復顯示20次,實際上控制的是上下滾動的速度for(k=0;k<16;k++) //k:每幀16行都要顯示{ EN=1;//行選輸出禁止for(j=i,y=0;j<5;j++) //j:一幀顯示i~7這幾個字{ P0=font[j][2*k]; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存P0=font[j][2*k+1]; //一行的高8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存}while(y<10) //一幀顯示i~7這幾個字后,剩下的送字模0x00,即:不顯示{ P0=0x00; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存P0=0x00; //一行的高8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存} P2=k; //設置行選信號EN=0; //行選輸出允許delay(1);} }//從左往右,一次移動一個字 void lefttoright() { unsigned char i,k,j,x,y;for(i=0;i<6;i++) //i:5幀,,第6幀是讓最后顯示空白for(x=0;x<15;x++) //x:一幀重復顯示20次,實際上控制的是上下滾動的速度for(k=0;k<16;k++) //k:每幀16行都要顯示{ EN=1;//行選輸出禁止y=0;while(y<2*i) //一幀先0~i-1這幾個字不顯示,所以送字模0x00{ P0=0x00; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存P0=0x00; //一行的高8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存} for(j=0;j<5-i;j++) //j:一幀顯示0~8-i這幾個字{ P0=font[j][2*k]; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存P0=font[j][2*k+1]; //一行的高8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存}P2=k; //設置行選信號EN=0; //行選輸出允許delay(1);} }//從右往左,一次移動半個字 void righttoleft_half() { unsigned char i,k,j,x,y;for(i=0;i<11;i++) //i:16幀for(x=0;x<15;x++) //x:一幀重復顯示20次,實際上控制的是上下滾動的速度for(k=0;k<16;k++) //k:每幀16行都要顯示{ EN=1;//行選輸出禁止for(j=i,y=0;j<10;j++) //j:一幀顯示16-i個半字{ P0=font[j/2][2*k+j%2]; //送半字P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存}while(y<11) //剩下的i個半字送0x00,即:不顯示{ P0=0x00; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存// P0=0x00; //一行的高8位// P3=y++; //指定哪個點陣// OE=0; //更新// OE=1; //鎖存} P2=k; //設置行選信號EN=0; //行選輸出允許delay(1);} }//從左往右,一次移動半個字 void lefttoright_half() { unsigned char i,k,j,x,y;for(i=0;i<11;i++) //i:10幀 16for(x=0;x<15;x++) //x:一幀重復顯示20次,實際上控制的是上下滾動的速度for(k=0;k<16;k++) //k:每幀16行都要顯示{ EN=1;//行選輸出禁止y=0;while(y<i) //先送i個0x00,即:不顯示{ P0=0x00; //一行的低8位P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存} for(j=0;j<10-i;j++) //j:一幀顯示16-i個半字{ P0=font[j/2][2*k+j%2]; //送半字P3=y++; //指定哪個點陣OE=0; //更新OE=1; //鎖存}P2=k; //設置行選信號EN=0; //行選輸出允許delay(1);} }void bink(){unsigned char i,j,k,n=0;while(n<15){for(i=0;i<16;i++) //按行,共16行,一次點亮所有8個字的一行{ EN=1;//行選輸出禁止for(j=0,k=0;j<5;j++) //共8個字,一次送一個字的一行{ P0=font[j][2*i]; //一行的低8位P3=k++; //指定哪個字OE=0; //更新OE=1; //鎖存P0=font[j][2*i+1]; //一行的高8位P3=k++; //指定哪個字OE=0; //更新OE=1; //鎖存} P2=i; //設置行選信號EN=0; //行選輸出允許delay(1);}n++;}} void main() {int i=0; while(1){downtoup();while(i<3){bink();delay(400);i++; }i=0; uptodown();righttoleft();lefttoright(); righttoleft_half();lefttoright_half();while(i<3){bink();delay(400);i++; }} }4、實驗效果??
由于不能上傳視頻,所以我將效果視頻上傳至優酷,請點擊觀看------->LED胸牌效果視頻
問題咨詢及項目源碼請加群:
QQ群
名稱:IT項目交流群
群號:245022761
總結
以上是生活随笔為你收集整理的【C51单片机】LED胸牌设计(仿真)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网方面用哪种计算机语言,物联网学习及
- 下一篇: Ubuntu中常用的解/压缩命令