找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2672|回复: 1
收起左侧

一个点阵屏显示 和 流水灯 程序 怎么整合为只有一个main函数的程序?

[复制链接]
ID:169574 发表于 2017-3-16 15:46 | 显示全部楼层 |阅读模式
//点阵#include<reg52.h>


sbit T_STR = P2^6;       //锁存引脚,屏上标识位STR
sbit R1    = P0^4;       //数据引脚,屏上标识R1
sbit G1    = P2^4;       //数据引脚,屏上标识G1
sbit T_CLK = P2^5;       //时钟引脚,屏上标识位CLK
sbit OE    = P2^7;       //使能引脚,屏上标识EN/OE

unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移动位数,临时移动位数,大于一个字节增加字节数
unsigned int HzNum;//汉字个数
unsigned char buff[10];

/*-----------------------------------------------
             16x16汉字取模数据
------------------------------------------------*/
unsigned char code hztest[][32]=    //取模选择字节倒序 ,正序得出的字是反的,可以在软件中设置自动倒叙
{


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //前面一屏大小的空字符,不显示,这里根据屏的大小修改,这个是1个汉字屏
                                                                                 //所以写入1个汉字

0x80,0x00,0x84,0x00,0x88,0x3F,0x48,0x00,0xA1,0x1F,0x82,0x10,0x92,0x12,0x90,0x14,
0xE8,0x7F,0x88,0x10,0x47,0x12,0x44,0x14,0xC4,0x3F,0x04,0x10,0x04,0x0A,0x00,0x04,


0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0xFE,0x3F,0x12,0x24,0x22,0x22,
0xF2,0x27,0x82,0x20,0x82,0x20,0xFA,0x2F,0x82,0x20,0x82,0x20,0x82,0x28,0x02,0x10,


0x10,0x00,0xD0,0x7F,0x12,0x04,0x12,0x04,0x12,0x04,0x92,0x3F,0x92,0x24,0x92,0x24,
0x92,0x24,0x92,0x24,0x92,0x24,0x90,0x2C,0x88,0x14,0x08,0x04,0x04,0x04,0x02,0x04,


0x20,0x02,0x20,0x02,0xFF,0x7F,0x20,0x02,0x08,0x00,0x90,0x1F,0x92,0x10,0x84,0x10,
0xA4,0x10,0xA0,0x14,0x90,0x08,0x8E,0x40,0x88,0x40,0x88,0x40,0x08,0x7F,0x00,0x00,

0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,
0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,

0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
0x00,0x02,0x80,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //尾部的一屏的空字符,用于清屏,参数和屏大小有关。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


};
/*-----------------------------------------------
             向595写入一个字节 单红色
------------------------------------------------*/
void InputByte( unsigned  char DataR1) //写一个字节
{
unsigned  char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);                  
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
}
}
/*-----------------------------------------------
             向595写入两个字节 双色
------------------------------------------------*/
void Input2Byte( unsigned  char DataR1,unsigned  char DataG1) //写一个字节
{
unsigned  char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);   
G1 = !(DataG1&0x01);               
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
DataG1 = DataG1 >> 1;
}
}


/*-----------------------------------------------
                    延时程序
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}


/*-----------------------------------------------
                      主程序
------------------------------------------------*/
main()
{
unsigned char count;//16行扫描数据,范围0-15
unsigned int i,  j;
unsigned char temp;

while(1)
{


i++;
if(i==100)//更改流动速度,1T单片机和12T单片机速度大约5-8倍,注意更改参数
   {
   i=0;
   MoveBitNum++;
if(MoveBitNum==16)//每次移动完一个汉字大小后循环
    {
      MoveBitNum=0;
          HzNum+=1;    //调用下一个汉字
          if(HzNum>=50)//需要显示的汉字个数,包括前面的一屏空字符的个数,后面清屏的空字符不包含在内,这里是(汉字个数+1)
             HzNum=0;   //完全显示完后循环调用
    }
  }


Delay(1);//控制扫描频率
for(j=0;j<2;j++) //取每个汉字的前2个字节,
        {             //汉字个数+1
         buff[j+j]=hztest[HzNum+j][count+count];  //每次移动完一个汉字后,选择下一个汉字
         buff[j+j+1]=hztest[HzNum+j][count+count+1];
        }

  if(MoveBitNum<8)                   //  判读移动距离是大于一个字节还是小于一个字节,因为一个字节左移右移最大只能8位
          { IncNum=0; MoveBitNumtemp=MoveBitNum; }
  else
          { IncNum=1; MoveBitNumtemp=MoveBitNum-8;}//大于8就减去8得到的数值还是小于8

T_STR=0;       //锁存无效
  for(j=0;j<2;j++)          //按bit的方式移动缓冲区的内容,然后输出到595,即取出的数值每个字节左移一定的位数,
          {                                     //后面左移出的数据整合到前面的字节中,保持数据的连续性            
           temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//这句比较重要,需要自行拿出2个字节的数据模拟分析
       InputByte(temp);//输出到595
          }//8个字节传输完锁存输出
  OE  = 1;
  P0=15-count;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描16行
  T_STR=1;      //锁存有效,此时一行的数据显示到屏上
  OE = 0;


count++;
if(count==16)
    count=0;
}
}


//流水灯
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit shcp=P2^0;         // 移位寄存时钟 1有效
sbit ds=P2^1;        // 输入
sbit stcp=P2^2;          //  输出时钟 1有效
sbit k1=P3^2;
sbit k2=P3^3;
uchar n=100;

//彩灯循环
uchar data_s[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //        逆时针流水灯
                                 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,                                         //        闪烁
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, // 顺时针流水灯
                                0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
uchar data_s1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
                0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
                                0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};

void delay(int x)
{
         unsigned a,b;
         for(a=x;a>0;a--)
         for(b=250;b>0;b--)        ;
}

void send(uchar aa)        // 74hc595控制
{               
        uchar c;
        for(c=0;c<8;c++) // 扫描每一个字节 0x01为1个 在内部左移
        {
                ds=aa>>7;
                aa<<=1;
                 shcp=0;         // 高电平有效  先赋0 再取1

                shcp=1;
                 }
        
         stcp=0;  //  高电平有效  先赋0 再取1

         stcp=1;
         
}         
void main()
{        uchar z;
        EA=1;
        EX0=1;EX1=1;
        IT0=1;IT1=1;
        while(1)
        {        for(z=0;z<48;z++){

                send(data_s[z]);
                send(data_s1[z]);

                delay(n);        

                        }}
        
}


void dis_1() interrupt 0
{        

        if(n<240&&k1==0)
        n=n+20;        
}

void dis_2() interrupt 2
{        

        if(n>0&&k2==0)
        n=n-10;        
}

回复

使用道具 举报

ID:155507 发表于 2017-3-16 19:00 | 显示全部楼层

  1. //点阵
  2. //#include<reg52.h>
  3. //流水灯
  4. #include <reg51.h>
  5. #include <intrins.h>
  6. #define uchar unsigned char

  7. sbit T_STR = P2^6;       //锁存引脚,屏上标识位STR
  8. sbit R1    = P0^4;       //数据引脚,屏上标识R1
  9. sbit G1    = P2^4;       //数据引脚,屏上标识G1
  10. sbit T_CLK = P2^5;       //时钟引脚,屏上标识位CLK
  11. sbit OE    = P2^7;       //使能引脚,屏上标识EN/OE


  12. sbit shcp=P2^0;       // 移位寄存时钟 1有效
  13. sbit ds=P2^1;        // 输入
  14. sbit stcp=P2^2;       //  输出时钟 1有效
  15. sbit k1=P3^2;
  16. sbit k2=P3^3;
  17. uchar n=100;
  18. unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移动位数,临时移动位数,大于一个字节增加字节数
  19. unsigned int HzNum;//汉字个数
  20. unsigned char buff[10];

  21. /*-----------------------------------------------
  22.                         16x16汉字取模数据
  23. ------------------------------------------------*/
  24. unsigned char code hztest[][32]=    //取模选择字节倒序 ,正序得出的字是反的,可以在软件中设置自动倒叙
  25. {

  26.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  27.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //前面一屏大小的空字符,不显示,这里根据屏的大小修改,这个是1个汉字屏
  28.         //所以写入1个汉字

  29.         0x80,0x00,0x84,0x00,0x88,0x3F,0x48,0x00,0xA1,0x1F,0x82,0x10,0x92,0x12,0x90,0x14,
  30.         0xE8,0x7F,0x88,0x10,0x47,0x12,0x44,0x14,0xC4,0x3F,0x04,0x10,0x04,0x0A,0x00,0x04,


  31.         0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0xFE,0x3F,0x12,0x24,0x22,0x22,
  32.         0xF2,0x27,0x82,0x20,0x82,0x20,0xFA,0x2F,0x82,0x20,0x82,0x20,0x82,0x28,0x02,0x10,


  33.         0x10,0x00,0xD0,0x7F,0x12,0x04,0x12,0x04,0x12,0x04,0x92,0x3F,0x92,0x24,0x92,0x24,
  34.         0x92,0x24,0x92,0x24,0x92,0x24,0x90,0x2C,0x88,0x14,0x08,0x04,0x04,0x04,0x02,0x04,


  35.         0x20,0x02,0x20,0x02,0xFF,0x7F,0x20,0x02,0x08,0x00,0x90,0x1F,0x92,0x10,0x84,0x10,
  36.         0xA4,0x10,0xA0,0x14,0x90,0x08,0x8E,0x40,0x88,0x40,0x88,0x40,0x08,0x7F,0x00,0x00,

  37.         0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,
  38.         0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,

  39.         0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
  40.         0x00,0x02,0x80,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,

  41.         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //尾部的一屏的空字符,用于清屏,参数和屏大小有关。
  43.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  44. };


  45. //彩灯循环
  46. uchar data_s[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //        逆时针流水灯
  47.         0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,                                         //        闪烁
  48.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, // 顺时针流水灯
  49.         0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
  50. uchar data_s1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
  51.         0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
  52.         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  53.         0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};


  54. /*-----------------------------------------------
  55.                         向595写入一个字节 单红色
  56. ------------------------------------------------*/
  57. void InputByte( unsigned  char DataR1) //写一个字节
  58. {
  59.         unsigned  char i;
  60.         for(i=8; i>0; i--)
  61.         {
  62.                 R1 = !(DataR1&0x01);                  
  63.                 T_CLK = 0;
  64.                 T_CLK = 1;
  65.                 DataR1 = DataR1 >> 1;
  66.         }
  67. }
  68. /*-----------------------------------------------
  69.                         向595写入两个字节 双色
  70. ------------------------------------------------*/
  71. void Input2Byte( unsigned  char DataR1,unsigned  char DataG1) //写一个字节
  72. {
  73.         unsigned  char i;
  74.         for(i=8; i>0; i--)
  75.         {
  76.                 R1 = !(DataR1&0x01);   
  77.                 G1 = !(DataG1&0x01);               
  78.                 T_CLK = 0;
  79.                 T_CLK = 1;
  80.                 DataR1 = DataR1 >> 1;
  81.                 DataG1 = DataG1 >> 1;
  82.         }
  83. }


  84. /*-----------------------------------------------
  85.                                         延时程序
  86. ------------------------------------------------*/
  87. void Delay(unsigned int t)
  88. {
  89.         while(--t);
  90. }

  91. void delayLED(int x)
  92. {
  93.         unsigned a,b;
  94.         for(a=x;a>0;a--)
  95.         for(b=250;b>0;b--)        ;
  96. }

  97. void send(uchar aa)        // 74hc595控制
  98. {               
  99.         uchar c;
  100.         for(c=0;c<8;c++) // 扫描每一个字节 0x01为1个 在内部左移
  101.         {
  102.                 ds=aa>>7;
  103.                 aa<<=1;
  104.                 shcp=0;         // 高电平有效  先赋0 再取1

  105.                 shcp=1;
  106.         }
  107.        
  108.         stcp=0;  //  高电平有效  先赋0 再取1

  109.         stcp=1;       
  110. }
  111. /*-----------------------------------------------
  112.                                         主程序
  113. ------------------------------------------------*/
  114. main()
  115. {
  116.         unsigned char count;//16行扫描数据,范围0-15
  117.         unsigned int i,  j;
  118.         unsigned char temp;
  119.         uchar z;
  120.         EA=1;
  121.         EX0=1;EX1=1;
  122.         IT0=1;IT1=1;

  123.         while(1)
  124.         {


  125.                 i++;
  126.                 if(i==100)//更改流动速度,1T单片机和12T单片机速度大约5-8倍,注意更改参数
  127.                 {
  128.                         i=0;
  129.                         MoveBitNum++;
  130.                         if(MoveBitNum==16)//每次移动完一个汉字大小后循环
  131.                         {
  132.                                 MoveBitNum=0;
  133.                                 HzNum+=1;    //调用下一个汉字
  134.                                 if(HzNum>=50)//需要显示的汉字个数,包括前面的一屏空字符的个数,后面清屏的空字符不包含在内,这里是(汉字个数+1)
  135.                                 HzNum=0;   //完全显示完后循环调用
  136.                         }
  137.                 }


  138.                 Delay(1);//控制扫描频率
  139.                 for(j=0;j<2;j++) //取每个汉字的前2个字节,
  140.                 {             //汉字个数+1
  141.                         buff[j+j]=hztest[HzNum+j][count+count];  //每次移动完一个汉字后,选择下一个汉字
  142.                         buff[j+j+1]=hztest[HzNum+j][count+count+1];
  143.                 }

  144.                 if(MoveBitNum<8)                   //  判读移动距离是大于一个字节还是小于一个字节,因为一个字节左移右移最大只能8位
  145.                 { IncNum=0; MoveBitNumtemp=MoveBitNum; }
  146.                 else
  147.                 { IncNum=1; MoveBitNumtemp=MoveBitNum-8;}//大于8就减去8得到的数值还是小于8

  148.                 T_STR=0;       //锁存无效
  149.                 for(j=0;j<2;j++)          //按bit的方式移动缓冲区的内容,然后输出到595,即取出的数值每个字节左移一定的位数,
  150.                 {                                     //后面左移出的数据整合到前面的字节中,保持数据的连续性            
  151.                         temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//这句比较重要,需要自行拿出2个字节的数据模拟分析
  152.                         InputByte(temp);//输出到595
  153.                 }//8个字节传输完锁存输出
  154.                 OE  = 1;
  155.                 P0=15-count;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描16行
  156.                 T_STR=1;      //锁存有效,此时一行的数据显示到屏上
  157.                 OE = 0;


  158.                 count++;
  159.                 if(count==16)
  160.                 count=0;
  161.                 // 流水灯
  162.                 for(z=0;z<48;z++){

  163.                         send(data_s[z]);
  164.                         send(data_s1[z]);

  165.                         delayLED(n);        
  166.                 }

  167.         }
  168. }

  169. /*        
  170. void main()
  171. {   
  172.         while(1)
  173.         {        
  174.         }
  175.        
  176. }
  177. */

  178. void dis_1() interrupt 0
  179. {        

  180.         if(n<240&&k1==0)
  181.         n=n+20;        
  182. }

  183. void dis_2() interrupt 2
  184. {        

  185.         if(n>0&&k2==0)
  186.         n=n-10;        
  187. }

复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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