找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3195|回复: 0
收起左侧

单片机16×16点阵滚动显示Proteus仿真+代码 带按键暂停按键

[复制链接]
ID:466588 发表于 2019-1-11 17:17 | 显示全部楼层 |阅读模式
16×16点阵模块仿真-按键暂停版仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

取模方式:
0.jpg

单片机源程序如下:
  1. #include "main.h"
  2. #include <intrins.h>

  3. #define Display_Num_Word 1                                //液晶能显示的汉字个数

  4. unsigned char Display_Buffer[2];
  5. unsigned char Display_Swap_Buffer[Display_Num_Word][32]={0};                                        //显示缓冲区
  6. bit Shift_Bit = 0;
  7. bit Flag_Shift = 0;
  8. #define Shift_Speed 5                                                                                        //移动速度
  9. unsigned char Timer0_Count = 0;
  10. unsigned char temp = 0x80;
  11. unsigned char Shift_Count = 0;
  12. unsigned char Display_Word_Count = 0;
  13. sbit Pause=P3^7;
  14. #define Num_Of_Word 8
  15. unsigned char code Word[Num_Of_Word][32] =
  16. {


  17. 0xDF,0xEC,0xED,0x05,0xF5,0xED,0xEC,0xC7,0xAB,0x6B,0xEF,0xEE,0xEE,0xED,0xEB,0xE7,
  18. 0xFF,0x03,0xFB,0xFB,0xFB,0xFB,0x03,0x6F,0x6F,0x6F,0x6F,0xED,0xED,0xED,0xF1,0xFF,/*"祝",0*/

  19. 0xFD,0xFD,0xC0,0xFD,0xFD,0x00,0xFE,0xFD,0xF3,0xE7,0xD0,0xB7,0x77,0xF7,0xF8,0xFF,
  20. 0xFF,0xF7,0x2F,0xDF,0xBF,0x01,0xFF,0xFF,0xEF,0x1F,0xFF,0xF7,0xF7,0xF7,0x07,0xFF,/*"老",1*/

  21. 0xF7,0xF4,0xB7,0xB7,0xB7,0xB6,0xB6,0xB6,0xB6,0xB6,0xB6,0xF6,0xEE,0xEF,0xDF,0xBF,
  22. 0xFF,0x01,0xDF,0xDF,0xDF,0x03,0xDB,0xDB,0xDB,0xDB,0xDB,0xCB,0xD7,0xDF,0xDF,0xDF,/*"师",2*/

  23. 0xEF,0xF7,0x80,0xFF,0xDD,0xEB,0x00,0xF7,0xF7,0x80,0xF7,0xD5,0xB6,0x77,0xD7,0xEE,
  24. 0xFF,0xFB,0x87,0xBF,0xBF,0xBF,0x81,0xB7,0xB7,0xB7,0xB7,0xB7,0xB7,0x77,0x77,0xF7,/*"新",3*/

  25. 0xEF,0xEF,0xE0,0xDF,0xDF,0xBF,0xE0,0xEF,0xEF,0xEF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,
  26. 0xFF,0xFF,0x03,0x7F,0x7F,0x7F,0x07,0x7F,0x7F,0x7F,0x01,0x7F,0x7F,0x7F,0x7F,0x7F,/*"年",4*/

  27. 0xEF,0xEF,0xEF,0xEC,0xE7,0xAB,0xAF,0xAF,0x68,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xEB,
  28. 0xBF,0xBF,0xBF,0x07,0xB7,0xB7,0xB7,0xB7,0x01,0xBF,0x5F,0x5F,0xEF,0xEF,0xF7,0xF9,/*"快",5*/

  29. 0xFF,0xFF,0xE0,0xEF,0xEE,0xDE,0xDE,0xC0,0xFE,0xF6,0xF6,0xEE,0xDE,0xBE,0xFA,0xFD,
  30. 0xDF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xDF,0xEF,0xF7,0xFB,0xFB,0xFF,0xFF,/*"乐",6*/

  31. 0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,
  32. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"!",7*/
  33. };

  34. //************************************************************
  35. //主函数
  36. //************************************************************
  37. void delay(unsigned int z)               
  38. {
  39.         unsigned int i,j;
  40.         for(i=0; i<z; i++)
  41.                 for(j = 0; j < 110; j++);
  42. }



  43. void main()
  44. {
  45.         Init_Timer0();
  46.         Clear_Display();
  47.         while(1)
  48.         {

  49.             if(Pause==0)                                   //暂停键
  50.                 {       
  51.                     delay(10);
  52.                         if(Pause==0)
  53.                     {
  54.                        TR0=~TR0;
  55.                     }while(Pause==0);                         
  56.                 }
  57.                 Display(Display_Swap_Buffer);
  58.                 if(Flag_Shift == 1)
  59.                 {
  60.                         Flag_Shift = 0;
  61.                         Display_Word_Count = Shift_Count/16;                                //计算当前显示第几个字
  62.                         Calc_Shift();                                                                               
  63.                        
  64.                         Shift_Count++;
  65.                        
  66.                         if(Shift_Count == (Num_Of_Word+1)*16 )                                //移动次数
  67.                         {
  68.                                 Shift_Count = 0;                               
  69.                         }                       
  70.                 }                                                                       
  71.         }
  72. }

  73. //****************************************************
  74. //初始化定时器0
  75. //****************************************************
  76. void Init_Timer0()
  77. {
  78.         TMOD = 0X01;                        //T0, 工作模式1

  79.         TH0 = (65536 - 50000)/256;
  80.         TL0 = (65536 - 50000)%256;

  81.         TR0 = 1;                                //开启定时器
  82.         ET0 = 1;                            //开启定时器中断
  83.         EA = 1;                                        //开启总中断               
  84. }

  85. //****************************************************
  86. //中断函数
  87. //****************************************************
  88. void Timer0() interrupt 1
  89. {
  90.         TH0 = (65536 - 50000)/256;
  91.         TL0 = (65536 - 50000)%256;
  92.        
  93.         TF0 = 0;
  94.         Timer0_Count++;
  95.         if(Timer0_Count >= Shift_Speed)
  96.         {
  97.                 Timer0_Count = 0;
  98.                 Flag_Shift = 1;
  99.         }

  100. }

  101. //************************************************************
  102. //计算移动数据,存在在缓冲器
  103. //************************************************************
  104. void Calc_Shift()
  105. {
  106.         unsigned char i;

  107.         for(i = 0;i < 16;i++)
  108.         {
  109.                 if((Display_Swap_Buffer[0][16+i]&0x80) == 0)                                                                        //前8位        移位
  110.                 {
  111.                         Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe;                         //最低位清零       
  112.                 }
  113.                 else
  114.                 {
  115.                         Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01;                        //最低位置一        
  116.                 }

  117.                 if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
  118.                 {
  119.                         Shift_Bit = Word[Display_Word_Count][i]&temp;
  120.                 }
  121.                 else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
  122.                 {
  123.                         Shift_Bit = Word[Display_Word_Count][16+i]&temp;
  124.                 }
  125.                 else
  126.                 {
  127.                         Shift_Bit = 1;                                                //把字移出缓冲区
  128.                 }

  129.                 if( Shift_Bit == 0)                                                                                                                //后8位移位
  130.                 {
  131.                         Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe;                 //最低位清零
  132.                 }
  133.                 else
  134.                 {
  135.                         Shift_Bit =        1;
  136.                         Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01;                //最低位置一                        
  137.                 }
  138.                
  139.         }
  140.         temp = (temp>>1)&0x7f;
  141.         if(temp == 0x00)
  142.         {
  143.                 temp = 0x80;
  144.         }
  145. }

  146. //************************************************************
  147. //清空缓冲区
  148. //************************************************************
  149. void Clear_Display()
  150. {
  151.         unsigned char i,j;
  152.         for(j = 0 ; j < Display_Num_Word; j++)
  153.         {
  154.                 for(i = 0 ; i < 32 ;i++)
  155.                 {
  156.                         Display_Swap_Buffer[j][i] = 0xff;                                //0=显示  1=不显示        
  157.                 }
  158.         }
  159. }

  160. //************************************************************
  161. //num为字数  dat[][32]为字模的名称
  162. //*************************************************************
  163. void Display(unsigned char dat[][32])                                       
  164. {
  165.         unsigned char i,j;

  166.         for( i = 0 ; i < 16 ; i++ )
  167.         {
  168.                 LEDARRAY_G = 1;                        //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。

  169.                 Display_Buffer[0] = dat[0][i];               
  170.                 Display_Buffer[1] = dat[0][i+16];

  171.                 Send(Display_Buffer[1]);
  172.                 Send(Display_Buffer[0]);

  173.                 LEDARRAY_LAT = 1;                                        //锁存数据
  174.                 _nop_();
  175.        
  176.                 LEDARRAY_LAT = 0;
  177.                 _nop_();

  178.                 Scan_Line(i);                                                //选择第i行

  179.                 LEDARRAY_G = 0;
  180.                
  181.                 for( j = 0 ; j < 100 ; j++);                //延时一段时间,让LED亮起来。                               
  182.         }       
  183. }

  184. //****************************************************
  185. //扫描某一行
  186. //****************************************************
  187. void Scan_Line( unsigned char m)
  188. {       
  189.         switch(m)
  190.         {
  191.                 case 0:                       
  192.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;                                        
  193.                         break;
  194.                 case 1:                                       
  195.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  196.                         break;
  197.                 case 2:                                       
  198.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  199.                         break;
  200.                 case 3:                                       
  201.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  202.                         break;
  203.                 case 4:
  204.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  205.                         break;
  206.                 case 5:
  207.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  208.                         break;
  209.                 case 6:
  210.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  211.                         break;
  212.                 case 7:
  213.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  214.                         break;
  215.                 case 8:
  216.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  217.                         break;
  218.                 case 9:
  219.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  220.                         break;       
  221.                 case 10:
  222.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  223.                         break;
  224.                 case 11:
  225.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  226.                         break;
  227.                 case 12:
  228.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  229.                         break;
  230.                 case 13:
  231.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  232.                         break;
  233.                 case 14:
  234.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  235.                         break;
  236.                 case 15:
  237.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  238.                         break;
  239.                 default : break;       
  240.         }
  241. }

  242. ……………………

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

所有资料51hei提供下载:
16×16点阵模块仿真-按键暂停版.rar (1.79 MB, 下载次数: 57)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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