使用51單片機編寫的簡單的16*16點陣顯示器,能顯示任意數字和字母。希望對感興趣的同學們有一定的幫助!
0.png (26.82 KB, 下載次數: 46)
下載附件
2018-3-23 15:15 上傳
0.png (23.95 KB, 下載次數: 54)
下載附件
2018-3-23 15:16 上傳
0.png (17.68 KB, 下載次數: 39)
下載附件
2018-3-23 15:13 上傳
單片機源程序如下:
- /*****************************
- 16*16點陣顯示任意數字和字母
- 移動顯示和閃屏顯示
- 用5個74HC595控制
- 制作人:秦龍標
- DATE:2014.3.9
- 如果您引用了該代碼請注明作者和出處,作者保留所有權
- ******************************/
- #include <stc/stc12c5a60s2.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define xian_gs 25 //要顯示數字的個數(實際數為xian_gs-1;因為加了一個空白數在前面)
- #define huancun 33 //顯存區大小
- sbit clk=P1^0;
- sbit di=P1^1;
- sbit cr=P1^2;
- uchar code SZ_ZM[]={0x0,0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,/*"0",0*/
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- 0xF7,0xFB,0xEF,0xE3,0xEF,0x9B,0xEF,0x7B,0xEC,0xFB,0xE3,0xFB,0xEF,0xE7,0xFF,0xFF};/*"Z",61*/
-
- uchar code duanx[]={0x0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80}; //掃描
- uchar code xian_shu[]={"1aB2c3DABCDEFGHIJKLMNOPQRSTUVWXYZ"}; //要顯示的數字和大小寫字母
- //uchar code yima[]={"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
- uchar weis=1; //數字移動位置
- bit fa=0; //兩種顯示方式的轉換標志
- uchar xiancun[huancun]; //顯示緩存區
- uchar SN; //顯示時的第幾個數字數
- void delay(uchar x)
- {uchar a,b;
- for(a=x;a<0;a--)
- for(b=1000;b<0;b--);
- }
- void send_byte(uchar num) //595發送數據函數
- {uchar a;
- for(a=0;a<8;a++)
- {
- clk=0;
- di=num&0x80;
- num<<=1;
- clk=1;
- }
- }
- /*uint yimas(uchar ma)
- {uchar a;
- uint temp;
- for(a=0;a<62;a++)
- {
- if(xian_shu[ma]==yima[a])
- {
- temp=a*16;
- }
- }
- return temp;
- }*/
- uint yimas(uchar shu) //用于判斷數字和大小字母重新譯碼并算出在SZ_ZM[]里的地址位置
- {uint sm;
-
- if((xian_shu[shu]>=0x30)&(xian_shu[shu]<=0x39)) //數字判斷 重新譯碼號:0-9 ; 數字的編碼是(0x30-0x39)
- {
- sm=(xian_shu[shu]-0x30)*16; //乘以16就是數字在SZ_ZM[]里的地址位置
- }
- if((xian_shu[shu]>=0x41)&(xian_shu[shu]<=0x5a)) //大寫字母判斷 重新譯碼號:36-61 ; 大寫字母的編碼是(0x41-0x5a)
- {
- sm=(xian_shu[shu]-0x41+36)*16;
- }
- if((xian_shu[shu]>=0x61)&(xian_shu[shu]<=0x7a)) //小寫字母判斷 重新譯碼號:10-35 ;小寫字母的編碼是(0x61-0x7a)
- {
- sm=(xian_shu[shu]-0x61+10)*16;
- }
- return sm;
- }
- void zhuan_byte(uint shu,uint shu1) //2個數字數據放進顯存
- {uchar a;
- for(a=1;a<17;a++)
- {
- xiancun[a]=SZ_ZM[shu+a];
- xiancun[16+a]=SZ_ZM[shu1+a];
- }
- }
- void display() //顯示函數顯示顯存里面的數據(16byte)
- {uchar a;
- for(a=1;a<9;a++)
- {
- cr=0;
- send_byte(xiancun[a*2-1]);
- send_byte(xiancun[a*2]);
- send_byte(xiancun[16+a*2-1]);
- send_byte(xiancun[16+a*2]);
- send_byte(duanx[a]);
- cr=1;
- delay(1);
- }
- }
- void yidond_diplay() //用向左流動顯示
- {uchar a,b;
- uchar a1=1;
- for(a=weis;a<17;a++) //要顯示第一個數字的存入顯存
- {
- xiancun[a1]=SZ_ZM[yimas(SN)+a1+weis-1]; //要顯示的數字乘以16就是該數的的數據地址
- xiancun[16+a1]=SZ_ZM[yimas(SN+1)+a1+weis-1];
- a1++;
- }
-
- for(b=1;b<weis;b++) //第一個數字顯示移動后要追加第二個要顯示的數字數據存入顯存
- {
- xiancun[a1]=SZ_ZM[yimas(SN+1)+b];
- xiancun[16+a1]=SZ_ZM[yimas(SN+2)+b];
- a1++;
- }
- if(SN==xian_gs-1) //消除最后一個數時顯示的亂碼
- {
- for(a=0;a<huancun;a++)
- xiancun[a]=0xff; //清空緩存區
- }
- weis+=2;
- if(weis>=17)
- {
- weis=1;
- SN++;
- if(SN==xian_gs)
- {
- SN=0;fa=!fa;
- }
- }
- }
- void shan_display() //閃屏顯示
- {uchar a;
- for(a=0;a<150;a++)
- zhuan_byte(yimas(SN),yimas(SN+1));
- SN+=2;if(SN>=xian_gs){SN=0;fa=!fa;}
- }
- void main()
- {
- while(1)
- {uchar a;
- if(fa==0)
- shan_display();
- if(fa)
- yidond_diplay();
- for(a=0;a<30;a++)
- {
- display();
- }
- }
- }
復制代碼
0.png (56.27 KB, 下載次數: 36)
下載附件
2018-3-23 15:17 上傳
所有資料51hei提供下載:
16 16點陣顯示(任意數字和字母).rar
(80.29 KB, 下載次數: 101)
2018-3-23 08:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|