找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6671|回复: 5
打印 上一主题 下一主题
收起左侧

单片机按键控制16*16LED点阵0-9滚动仿真电路和源程序

[复制链接]
跳转到指定楼层
楼主
51单片机驱动的16*16 LED 点阵 0-9滚动   74HC595  74HC138  74HC04
有4个按键

proteus仿真原理图如下:



单片机源程序如下:
  1. /*2个点阵左/右移动显示*/
  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;      //时钟
  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. //显示的字库
  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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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\点阵16x16陕显示数字\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 个显示数据缓存
  51.                                                         //数据格式为 第1级第1行高八位,低八位,第2级第1行高八位,低八位,第1级第2行高八位。。。。。。
  52. uchar data disp_han;                   //目前显示到第几行


  53. void T0_Set()                                         /*定义中断方式,中断时间*/
  54. {
  55.     TMOD = 0x01;                                  //定时0,工作在方式1
  56.     TH0  = (65536-1000)/256;
  57.     TL0  = (65536-1000)/256;
  58.     TR0  = 1;                                     //启动计数
  59.     EA   = 1;                                     //开总中断
  60.     ET0  = 1;                                     //开定时器0中断
  61.         return;
  62. }

  63. void delay_1ms(uchar x)        //延时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++){        //最多显示多少个字
  88.                         for(shift=0;shift<16;shift++){        //一个字移位16位
  89.                                 for(han=0;han<16;han++){   //一个字有16行数据                        
  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);      //延时去抖动
  96.                 mode=1; //在1 2 3中切换
  97.                  while(!S2){;}           //等待按键释放
  98.                 goto M1;
  99.         }




  100.                  if(S3==0)
  101.         {
  102.                 delay_1ms(10);     //延时去抖动
  103.         while(!S3){;}          //等待按键释放
  104.                 goto MM;
  105.         }
  106.                  if(S4==0)
  107.         {
  108.                 delay_1ms(10);     //延时去抖动
  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.                                         //左往右移动
  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++){        //最多显示多少个字
  147.                         for(shift=0;shift<16;shift++){        //一个字移位16位
  148.                                 for(han=0;han<16;han++){   //一个字有16行数据                        
  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);           //延时去抖动
  155.                 mode=0; //在1 2 3中切换
  156.                  while(!S1){;}                //等待按键释放
  157.                 goto M0;
  158.         }         
  159.                  if(S3==0)
  160.         {
  161.                 delay_1ms(10);     //延时去抖动
  162.         while(!S3){;}          //等待按键释放
  163.                 goto MM;
  164.         }
  165.                  if(S4==0)
  166.         {
  167.                 delay_1ms(10);     //延时去抖动
  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.                                 //右往左移动
  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; //模块数量
  212.         uchar han;        
  213.     TH0  = (65536-1000)/256;
  214.     TL0  = (65536-1000)/256;
  215.         Latch_port = 0;  //HC595锁定输出,避免数据传输过程中,屏数据变化从而显示闪烁
  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;    //关屏显示,原理为使HC138输出全为1,从而三极管截止,点阵不显示
  240.         ABCD_port = (ABCD_port & 0x0f)|(han<<4);  //HC138译码输出
  241.         Latch_port = 1; //允许HC595数据输出到Q1-Q8端口
  242.         EN_port = 0;    //HC138输出有效,打开显示
  243.         Latch_port = 0;        //锁定HC595数据输出

  244.         disp_han++;        //显示下一行数据
  245.         if(disp_han>=16) disp_han=0;
  246. ……………………

  247. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
1 滚动0-9 仿真电路和源程序.rar (59.32 KB, 下载次数: 104)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:683847 发表于 2020-1-13 12:44 | 只看该作者
请问应用这个程序,我需要“应用电子技术1班25号”这几个字需要怎么改
回复

使用道具 举报

板凳
ID:432653 发表于 2020-2-21 17:42 | 只看该作者
左移的时候会出现乱码,咋整
回复

使用道具 举报

地板
ID:830986 发表于 2020-10-20 14:41 | 只看该作者
求硬件电路的原理分析
回复

使用道具 举报

5#
ID:949635 发表于 2021-7-6 14:07 | 只看该作者
请问这个非门是干嘛的呢
回复

使用道具 举报

6#
ID:874695 发表于 2021-7-13 15:21 | 只看该作者
兄弟怎么用独立按键控制16X16点阵
按下K1 出现汉字 “开”,10S后熄灭。
按下K2 出现汉字“关”,10S后熄灭。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表