找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7731|回復(fù): 5
收起左側(cè)

單片機(jī)按鍵控制16*16LED點(diǎn)陣0-9滾動(dòng)仿真電路和源程序

[復(fù)制鏈接]
ID:268172 發(fā)表于 2018-1-24 12:17 | 顯示全部樓層 |閱讀模式
51單片機(jī)驅(qū)動(dòng)的16*16 LED 點(diǎn)陣 0-9滾動(dòng)   74HC595  74HC138  74HC04
有4個(gè)按鍵

proteus仿真原理圖如下:

0.png 0.png 0.png

單片機(jī)源程序如下:
  1. /*2個(gè)點(diǎn)陣左/右移動(dòng)顯示*/
  2. /*頭文件*/
  3. #include <reg52.h>      
  4. #include <intrins.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. #define NOP() _nop_()

  8. /*端口定義*/

  9. sbit EN_port = P1^3;
  10. sbit DA_in_port = P1^2;
  11. sbit CLK_port = P1^1;      //時(shí)鐘
  12. sbit Latch_port = P1^0;

  13. #define ABCD_port P1  //HC138 ABCD端口定義
  14. //sbit D_port = P1^7;
  15. //sbit C_port = P1^6;
  16. //sbit B_port = P1^5;
  17. //sbit A_port = P1^4;

  18. sbit S1 = P2^0;
  19. sbit S2 = P2^1;
  20. sbit S3 = P2^2;
  21. sbit S4 = P2^3;

  22. //顯示的字庫(kù)
  23. uchar code ziku_table[]={

  24. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*顯示8行空白*/
  25. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

  26. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xDF,0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,
  27. 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*/

  28. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x1F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,
  29. 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*/


  30. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFC,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xFF,0xFD,
  31. 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*/

  32. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFC,0xDF,0xFB,0xDF,0xFB,0xFF,0xFD,0x7F,0xFE,
  33. 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*/


  34. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0xFE,0xBF,0xFE,0xDF,0xFE,0xDF,0xFE,
  35. 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*/


  36. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xF8,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0x5F,0xFE,
  37. 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*/

  38. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFC,0xBF,0xFD,0xDF,0xFF,0xDF,0xFF,0x5F,0xFE,
  39. 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*/

  40. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xF8,0xDF,0xFD,0xDF,0xFD,0xFF,0xFE,0xFF,0xFE,
  41. 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*/

  42. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xFD,0xDF,0xFE,
  43. 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*/

  44. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFE,0xBF,0xFD,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,
  45. 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行空白*/
  46. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

  47. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*顯示8行空白*/
  48. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

  49. };


  50. uchar data disp_buff[64];         //64 個(gè)顯示數(shù)據(jù)緩存
  51.                                                         //數(shù)據(jù)格式為 第1級(jí)第1行高八位,低八位,第2級(jí)第1行高八位,低八位,第1級(jí)第2行高八位。。。。。。
  52. uchar data disp_han;                   //目前顯示到第幾行


  53. void T0_Set()                                         /*定義中斷方式,中斷時(shí)間*/
  54. {
  55.     TMOD = 0x01;                                  //定時(shí)0,工作在方式1
  56.     TH0  = (65536-1000)/256;
  57.     TL0  = (65536-1000)/256;
  58.     TR0  = 1;                                     //啟動(dòng)計(jì)數(shù)
  59.     EA   = 1;                                     //開總中斷
  60.     ET0  = 1;                                     //開定時(shí)器0中斷
  61.         return;
  62. }

  63. void delay_1ms(uchar x)        //延時(shí)1ms程序
  64. {
  65.     uchar j;
  66.     while(x--){
  67.         for(j=0;j<125;j++)
  68.             {;}
  69.         }   
  70. }


  71. void main()                      //主程序
  72. {
  73.         uchar i;
  74.         uint data_temp[3];
  75.         uint temp,temp1;
  76.         uchar hanzi;
  77.         uchar han;
  78.         uchar shift=1;

  79.         uchar mode=0;


  80. MM:shift=1;
  81.         mode=0;
  82. if(mode==0)
  83. {
  84.         for(i=0;i<64;i++) disp_buff[i]=0xff;
  85.         T0_Set();
  86.         while(1){
  87.                 for(hanzi=0;hanzi<10;hanzi++){        //最多顯示多少個(gè)字
  88.                         for(shift=0;shift<16;shift++){        //一個(gè)字移位16位
  89.                                 for(han=0;han<16;han++){   //一個(gè)字有16行數(shù)據(jù)                        
  90.                                         data_temp[0]=ziku_table[(hanzi*32)+(han*2)+1]*0x100 + ziku_table[(hanzi*32)+(han*2)];
  91.                                         data_temp[1]=ziku_table[((hanzi+1)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+1)*32)+(han*2)];
  92.                                         data_temp[2]=ziku_table[((hanzi+2)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+2)*32)+(han*2)];

  93. M0:            if(S2==0)
  94.         {
  95.                 delay_1ms(10);      //延時(shí)去抖動(dòng)
  96.                 mode=1; //在1 2 3中切換
  97.                  while(!S2){;}           //等待按鍵釋放
  98.                 goto M1;
  99.         }




  100.                  if(S3==0)
  101.         {
  102.                 delay_1ms(10);     //延時(shí)去抖動(dòng)
  103.         while(!S3){;}          //等待按鍵釋放
  104.                 goto MM;
  105.         }
  106.                  if(S4==0)
  107.         {
  108.                 delay_1ms(10);     //延時(shí)去抖動(dòng)
  109.         while(!S4){;}          //等待按鍵釋放
  110.                 while(1)
  111.                 {
  112.                         if(S1==0){mode=0;break;}
  113.                         if(S2==0){mode=1;break;}
  114.                         if(S3==0){mode=0;break;}
  115.                         if(S4==0){break;}
  116.                 }
  117.         }


  118.                                         //左往右移動(dòng)
  119.                                         temp = data_temp[0];
  120.                                         temp1 = data_temp[1];
  121.                                         for(i=shift;i>0;i--){
  122.                                                 temp = (temp<<1) ;
  123.                                                 if((temp1&0x8000)!=0) temp = temp + 0x0001;
  124.                                                 temp1 = (temp1<<1);
  125.                                                 }
  126.                                         disp_buff[han*4+3]=temp/0x100;
  127.                                         disp_buff[han*4+2]=temp%0x100;
  128.                                         //----------------------                                
  129.                                         temp = data_temp[1];
  130.                                         temp1 = data_temp[2];
  131.                                         for(i=shift;i>0;i--){
  132.                                                 temp = (temp<<1) ;
  133.                                                 if((temp1&0x8000)!=0) temp = temp + 0x0001;
  134.                                                 temp1 = (temp1<<1);
  135.                                                 }
  136.                                         disp_buff[han*4+1]=temp/0x100;
  137.                                         disp_buff[han*4]=temp%0x100;

  138.                         
  139.                                         }
  140.                                 delay_1ms(15); //移位速度
  141.                                 }
  142.                         }
  143. }//mode==0
  144. if(mode==1)
  145. {
  146.                 for(hanzi=0;hanzi<6;hanzi++){        //最多顯示多少個(gè)字
  147.                         for(shift=0;shift<16;shift++){        //一個(gè)字移位16位
  148.                                 for(han=0;han<16;han++){   //一個(gè)字有16行數(shù)據(jù)                        
  149.                                         data_temp[0]=ziku_table[(hanzi*32)+(han*2)+1]*0x100 + ziku_table[(hanzi*32)+(han*2)];
  150.                                         data_temp[1]=ziku_table[((hanzi+1)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+1)*32)+(han*2)];
  151.                                 data_temp[2]=ziku_table[((hanzi+2)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+2)*32)+(han*2)];
  152. M1:          if(S1==0)
  153.         {
  154.                 delay_1ms(10);           //延時(shí)去抖動(dòng)
  155.                 mode=0; //在1 2 3中切換
  156.                  while(!S1){;}                //等待按鍵釋放
  157.                 goto M0;
  158.         }         
  159.                  if(S3==0)
  160.         {
  161.                 delay_1ms(10);     //延時(shí)去抖動(dòng)
  162.         while(!S3){;}          //等待按鍵釋放
  163.                 goto MM;
  164.         }
  165.                  if(S4==0)
  166.         {
  167.                 delay_1ms(10);     //延時(shí)去抖動(dòng)
  168.         while(!S4){;}          //等待按鍵釋放
  169.                 while(1)
  170.                 {
  171.                         if(S1==0){mode=0;break;}
  172.                         if(S2==0){mode=1;break;}
  173.                         if(S3==0){mode=0;break;}
  174.                         if(S4==0){break;}
  175.                 }
  176.         }                                                        
  177.                                 
  178.                                 //右往左移動(dòng)
  179.                                         temp = data_temp[0];
  180.                                         temp1 = data_temp[1];
  181.                                         for(i=shift;i>0;i--){
  182.                                                 temp = (temp>>1) ;
  183.                                                 if((temp1&0x0001)!=0) temp = temp + 0x8000;
  184.                                                 temp1 = (temp1>>1);
  185.                                                 }
  186.                                         disp_buff[han*4+1]=temp/0x100;
  187.                                         disp_buff[han*4+0]=temp%0x100;
  188.                                         //------------------------------
  189.                                         temp = data_temp[1];
  190.                                         temp1 = data_temp[2];
  191.                                         for(i=shift;i>0;i--){
  192.                                                 temp = (temp>>1) ;
  193.                                                 if((temp1&0x0001)!=0) temp = temp + 0x8000;
  194.                                                 temp1 = (temp1>>1);
  195.                                                 }
  196.                                         disp_buff[han*4+3]=temp/0x100;
  197.                                         disp_buff[han*4+2]=temp%0x100;                                
  198.                                         }
  199.                                 delay_1ms(15); //移位速度
  200.                                 }
  201.                         }
  202.                 }
  203. }
  204. }



  205. void SLED_Disp() interrupt 1 using 3
  206. {
  207.         uchar i;
  208.         uchar data_buff;
  209.         uchar temp;
  210.         uchar zishu;
  211.         uchar code Module_Quantity=2; //模塊數(shù)量
  212.         uchar han;        
  213.     TH0  = (65536-1000)/256;
  214.     TL0  = (65536-1000)/256;
  215.         Latch_port = 0;  //HC595鎖定輸出,避免數(shù)據(jù)傳輸過(guò)程中,屏數(shù)據(jù)變化從而顯示閃爍
  216.         CLK_port = 0;
  217.         han=disp_han;
  218.         for(zishu=Module_Quantity;zishu>0;zishu--){
  219.                 temp = disp_han*Module_Quantity*2 + (zishu-1)*2+1;
  220.                 data_buff = disp_buff[temp];
  221.                 for(i=0;i<8;i++){
  222.                         if((data_buff&0x80)!=0) DA_in_port = 1;
  223.                         else DA_in_port = 0;
  224.                         CLK_port = 1;
  225.                         CLK_port = 0;
  226.                         data_buff <<= 1;
  227.                         }
  228.                 temp = disp_han*Module_Quantity*2 + (zishu-1)*2;
  229.                 data_buff = disp_buff[temp];
  230.                 for(i=0;i<8;i++){
  231.                         if((data_buff&0x80)!=0) DA_in_port = 1;
  232.                         else DA_in_port = 0;
  233.                         CLK_port = 1;
  234.                         CLK_port = 0;
  235.                         data_buff <<= 1;
  236.                         }
  237.                 }
  238.                  
  239.         EN_port = 1;    //關(guān)屏顯示,原理為使HC138輸出全為1,從而三極管截止,點(diǎn)陣不顯示
  240.         ABCD_port = (ABCD_port & 0x0f)|(han<<4);  //HC138譯碼輸出
  241.         Latch_port = 1; //允許HC595數(shù)據(jù)輸出到Q1-Q8端口
  242.         EN_port = 0;    //HC138輸出有效,打開顯示
  243.         Latch_port = 0;        //鎖定HC595數(shù)據(jù)輸出

  244.         disp_han++;        //顯示下一行數(shù)據(jù)
  245.         if(disp_han>=16) disp_han=0;
  246. ……………………

  247. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
1 滾動(dòng)0-9 仿真電路和源程序.rar (59.32 KB, 下載次數(shù): 104)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:683847 發(fā)表于 2020-1-13 12:44 | 顯示全部樓層
請(qǐng)問(wèn)應(yīng)用這個(gè)程序,我需要“應(yīng)用電子技術(shù)1班25號(hào)”這幾個(gè)字需要怎么改
回復(fù)

使用道具 舉報(bào)

ID:432653 發(fā)表于 2020-2-21 17:42 | 顯示全部樓層
左移的時(shí)候會(huì)出現(xiàn)亂碼,咋整
回復(fù)

使用道具 舉報(bào)

ID:830986 發(fā)表于 2020-10-20 14:41 | 顯示全部樓層
求硬件電路的原理分析
回復(fù)

使用道具 舉報(bào)

ID:949635 發(fā)表于 2021-7-6 14:07 | 顯示全部樓層
請(qǐng)問(wèn)這個(gè)非門是干嘛的呢
回復(fù)

使用道具 舉報(bào)

ID:874695 發(fā)表于 2021-7-13 15:21 | 顯示全部樓層
兄弟怎么用獨(dú)立按鍵控制16X16點(diǎn)陣
按下K1 出現(xiàn)漢字 “開”,10S后熄滅。
按下K2 出現(xiàn)漢字“關(guān)”,10S后熄滅。


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表