51單片機(jī)驅(qū)動(dòng)的16*16 LED 點(diǎn)陣 0-9滾動(dòng) 74HC595 74HC138 74HC04
有4個(gè)按鍵
proteus仿真原理圖如下:
0.png (26.81 KB, 下載次數(shù): 72)
下載附件
2018-1-24 19:55 上傳
0.png (20.89 KB, 下載次數(shù): 76)
下載附件
2018-1-24 19:56 上傳
0.png (50.64 KB, 下載次數(shù): 70)
下載附件
2018-1-24 19:55 上傳
單片機(jī)源程序如下:
- /*2個(gè)點(diǎn)陣左/右移動(dòng)顯示*/
- /*頭文件*/
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define NOP() _nop_()
- /*端口定義*/
- sbit EN_port = P1^3;
- sbit DA_in_port = P1^2;
- sbit CLK_port = P1^1; //時(shí)鐘
- sbit Latch_port = P1^0;
- #define ABCD_port P1 //HC138 ABCD端口定義
- //sbit D_port = P1^7;
- //sbit C_port = P1^6;
- //sbit B_port = P1^5;
- //sbit A_port = P1^4;
- sbit S1 = P2^0;
- sbit S2 = P2^1;
- sbit S3 = P2^2;
- sbit S4 = P2^3;
- //顯示的字庫(kù)
- uchar code ziku_table[]={
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*顯示8行空白*/
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xDF,0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,
- 0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,0xDF,0xFE,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\0.BMP.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x1F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,
- 0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x1F,0xFC,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\1.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFC,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xFF,0xFD,
- 0xFF,0xFD,0xFF,0xFE,0x7F,0xFF,0xBF,0xFF,0xDF,0xFB,0x1F,0xF8,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\2.BMP.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFC,0xDF,0xFB,0xDF,0xFB,0xFF,0xFD,0x7F,0xFE,
- 0xFF,0xFD,0xFF,0xFB,0xFF,0xFB,0xDF,0xFB,0xDF,0xFD,0x3F,0xFE,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\3.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0xFE,0xBF,0xFE,0xDF,0xFE,0xDF,0xFE,
- 0xEF,0xFE,0xEF,0xFE,0x0F,0xFC,0xFF,0xFE,0xFF,0xFE,0x3F,0xFC,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\4.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xF8,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0x5F,0xFE,
- 0x9F,0xFD,0xFF,0xFB,0xFF,0xFB,0xDF,0xFB,0xDF,0xFD,0x3F,0xFE,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\5.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFC,0xBF,0xFD,0xDF,0xFF,0xDF,0xFF,0x5F,0xFE,
- 0x9F,0xFD,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xBF,0xFD,0x7F,0xFE,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\6.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xF8,0xDF,0xFD,0xDF,0xFD,0xFF,0xFE,0xFF,0xFE,
- 0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\7.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,0xDF,0xFE,
- 0x3F,0xFF,0xDF,0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,0x1F,0xFE,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\8.BMP",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFE,0xBF,0xFD,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,
- 0xBF,0xF9,0x7F,0xFA,0xFF,0xFB,0xFF,0xFB,0xBF,0xFD,0x3F,0xFE,0xFF,0xFF,0xFF,0xFF,/*"C:\Users\Administrator\Desktop\點(diǎn)陣16x16陜顯示數(shù)字\9.BMP",0*/0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*顯示8行空白*/
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*顯示8行空白*/
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- };
- uchar data disp_buff[64]; //64 個(gè)顯示數(shù)據(jù)緩存
- //數(shù)據(jù)格式為 第1級(jí)第1行高八位,低八位,第2級(jí)第1行高八位,低八位,第1級(jí)第2行高八位。。。。。。
- uchar data disp_han; //目前顯示到第幾行
- void T0_Set() /*定義中斷方式,中斷時(shí)間*/
- {
- TMOD = 0x01; //定時(shí)0,工作在方式1
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)/256;
- TR0 = 1; //啟動(dòng)計(jì)數(shù)
- EA = 1; //開(kāi)總中斷
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- return;
- }
- void delay_1ms(uchar x) //延時(shí)1ms程序
- {
- uchar j;
- while(x--){
- for(j=0;j<125;j++)
- {;}
- }
- }
- void main() //主程序
- {
- uchar i;
- uint data_temp[3];
- uint temp,temp1;
- uchar hanzi;
- uchar han;
- uchar shift=1;
- uchar mode=0;
- MM:shift=1;
- mode=0;
- if(mode==0)
- {
- for(i=0;i<64;i++) disp_buff[i]=0xff;
- T0_Set();
- while(1){
- for(hanzi=0;hanzi<10;hanzi++){ //最多顯示多少個(gè)字
- for(shift=0;shift<16;shift++){ //一個(gè)字移位16位
- for(han=0;han<16;han++){ //一個(gè)字有16行數(shù)據(jù)
- data_temp[0]=ziku_table[(hanzi*32)+(han*2)+1]*0x100 + ziku_table[(hanzi*32)+(han*2)];
- data_temp[1]=ziku_table[((hanzi+1)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+1)*32)+(han*2)];
- data_temp[2]=ziku_table[((hanzi+2)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+2)*32)+(han*2)];
- M0: if(S2==0)
- {
- delay_1ms(10); //延時(shí)去抖動(dòng)
- mode=1; //在1 2 3中切換
- while(!S2){;} //等待按鍵釋放
- goto M1;
- }
- if(S3==0)
- {
- delay_1ms(10); //延時(shí)去抖動(dòng)
- while(!S3){;} //等待按鍵釋放
- goto MM;
- }
- if(S4==0)
- {
- delay_1ms(10); //延時(shí)去抖動(dòng)
- while(!S4){;} //等待按鍵釋放
- while(1)
- {
- if(S1==0){mode=0;break;}
- if(S2==0){mode=1;break;}
- if(S3==0){mode=0;break;}
- if(S4==0){break;}
- }
- }
- //左往右移動(dòng)
- temp = data_temp[0];
- temp1 = data_temp[1];
- for(i=shift;i>0;i--){
- temp = (temp<<1) ;
- if((temp1&0x8000)!=0) temp = temp + 0x0001;
- temp1 = (temp1<<1);
- }
- disp_buff[han*4+3]=temp/0x100;
- disp_buff[han*4+2]=temp%0x100;
- //----------------------
- temp = data_temp[1];
- temp1 = data_temp[2];
- for(i=shift;i>0;i--){
- temp = (temp<<1) ;
- if((temp1&0x8000)!=0) temp = temp + 0x0001;
- temp1 = (temp1<<1);
- }
- disp_buff[han*4+1]=temp/0x100;
- disp_buff[han*4]=temp%0x100;
-
- }
- delay_1ms(15); //移位速度
- }
- }
- }//mode==0
- if(mode==1)
- {
- for(hanzi=0;hanzi<6;hanzi++){ //最多顯示多少個(gè)字
- for(shift=0;shift<16;shift++){ //一個(gè)字移位16位
- for(han=0;han<16;han++){ //一個(gè)字有16行數(shù)據(jù)
- data_temp[0]=ziku_table[(hanzi*32)+(han*2)+1]*0x100 + ziku_table[(hanzi*32)+(han*2)];
- data_temp[1]=ziku_table[((hanzi+1)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+1)*32)+(han*2)];
- data_temp[2]=ziku_table[((hanzi+2)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+2)*32)+(han*2)];
- M1: if(S1==0)
- {
- delay_1ms(10); //延時(shí)去抖動(dòng)
- mode=0; //在1 2 3中切換
- while(!S1){;} //等待按鍵釋放
- goto M0;
- }
- if(S3==0)
- {
- delay_1ms(10); //延時(shí)去抖動(dòng)
- while(!S3){;} //等待按鍵釋放
- goto MM;
- }
- if(S4==0)
- {
- delay_1ms(10); //延時(shí)去抖動(dòng)
- while(!S4){;} //等待按鍵釋放
- while(1)
- {
- if(S1==0){mode=0;break;}
- if(S2==0){mode=1;break;}
- if(S3==0){mode=0;break;}
- if(S4==0){break;}
- }
- }
-
- //右往左移動(dòng)
- temp = data_temp[0];
- temp1 = data_temp[1];
- for(i=shift;i>0;i--){
- temp = (temp>>1) ;
- if((temp1&0x0001)!=0) temp = temp + 0x8000;
- temp1 = (temp1>>1);
- }
- disp_buff[han*4+1]=temp/0x100;
- disp_buff[han*4+0]=temp%0x100;
- //------------------------------
- temp = data_temp[1];
- temp1 = data_temp[2];
- for(i=shift;i>0;i--){
- temp = (temp>>1) ;
- if((temp1&0x0001)!=0) temp = temp + 0x8000;
- temp1 = (temp1>>1);
- }
- disp_buff[han*4+3]=temp/0x100;
- disp_buff[han*4+2]=temp%0x100;
- }
- delay_1ms(15); //移位速度
- }
- }
- }
- }
- }
- void SLED_Disp() interrupt 1 using 3
- {
- uchar i;
- uchar data_buff;
- uchar temp;
- uchar zishu;
- uchar code Module_Quantity=2; //模塊數(shù)量
- uchar han;
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)/256;
- Latch_port = 0; //HC595鎖定輸出,避免數(shù)據(jù)傳輸過(guò)程中,屏數(shù)據(jù)變化從而顯示閃爍
- CLK_port = 0;
- han=disp_han;
- for(zishu=Module_Quantity;zishu>0;zishu--){
- temp = disp_han*Module_Quantity*2 + (zishu-1)*2+1;
- data_buff = disp_buff[temp];
- for(i=0;i<8;i++){
- if((data_buff&0x80)!=0) DA_in_port = 1;
- else DA_in_port = 0;
- CLK_port = 1;
- CLK_port = 0;
- data_buff <<= 1;
- }
- temp = disp_han*Module_Quantity*2 + (zishu-1)*2;
- data_buff = disp_buff[temp];
- for(i=0;i<8;i++){
- if((data_buff&0x80)!=0) DA_in_port = 1;
- else DA_in_port = 0;
- CLK_port = 1;
- CLK_port = 0;
- data_buff <<= 1;
- }
- }
-
- EN_port = 1; //關(guān)屏顯示,原理為使HC138輸出全為1,從而三極管截止,點(diǎn)陣不顯示
- ABCD_port = (ABCD_port & 0x0f)|(han<<4); //HC138譯碼輸出
- Latch_port = 1; //允許HC595數(shù)據(jù)輸出到Q1-Q8端口
- EN_port = 0; //HC138輸出有效,打開(kāi)顯示
- Latch_port = 0; //鎖定HC595數(shù)據(jù)輸出
- disp_han++; //顯示下一行數(shù)據(jù)
- if(disp_han>=16) disp_han=0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
1 滾動(dòng)0-9 仿真電路和源程序.rar
(59.32 KB, 下載次數(shù): 104)
2018-1-24 12:16 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|