双色点阵显示特定图形

/*-----------------------------------------------
  名称:双色点阵
  论坛:www.doflye.net
  编写:shifang
  修改:无
  内容:使用hc595驱动双色点阵 
------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h> 


//unsigned char  segout[8]={0,1,2,3,4,5,6,7}; //8列
unsigned char  segout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列
unsigned char code tab[]={
                        0x08,0x1C,0x3E,0x7F,0x1C,0x1C,0x1C,0x1C,
                        };


/*------------------------------------------------
                硬件端口定义
------------------------------------------------*/
sbit LATCH = P1^0; 
sbit SRCLK= P1^1;
sbit SER  = P1^2;




sbit LATCH_B = P2^2;
sbit SRCLK_B= P2^1;
sbit SER_B= P2^0;


/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
DelayUs2x(245);
 }
}
/*------------------------------------------------
                发送字节程序
------------------------------------------------*/
void SendByte(unsigned char dat)
{    
  unsigned char i; 
        
   for(i=0;i<8;i++)
        {
         SRCLK=0;
         SER=dat&0x80;
         dat<<=1;
         SRCLK=1;
         }
         
}
/*------------------------------------------------
                发送双字节程序
     595级联,n个595,就需要发送n字节后锁存
------------------------------------------------*/
void Send2Byte(unsigned char dat1,unsigned char dat2)
{    
   SendByte(dat1);
   SendByte(dat2);      
}
/*------------------------------------------------
                   595锁存程序
 595级联发送数据后,锁存有效
------------------------------------------------*/
void Out595(void)
{
        LATCH=1;
        _nop_();
        LATCH=0;
}


/*------------------------------------------------
                发送位码字节程序
               使用另外一片单独595
------------------------------------------------*/
void SendSeg(unsigned char dat)
{    
unsigned char i; 
        
   for(i=0;i<8;i++)  //发送字节
        {
         SRCLK_B=0;
         SER_B=dat&0x80;
         dat<<=1;
         SRCLK_B=1;
         }
      LATCH_B=1;    //锁存
      _nop_();
      LATCH_B=0;
         
         
}
/*------------------------------------------------
                   主程序
------------------------------------------------*/
void main()
{
unsigned char i,j,k;
while(1)
{


              for(i=0;i<8;i++) //8列显示
                  {
                     SendSeg(segout[i]);

Send2Byte(~tab[i],0xff);//固定位置显示箭头图形
Out595();
                     DelayMs(1);

Send2Byte(0xff,0xff);//delay(10); //防止重影
Out595();
                  }
          
        }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双色点阵发光二极管(LED)是一种显示器件,它由很多发光二极管组成。这些发光二极管通常会以矩阵的形式排列在一起,以便在其上显示文字、数字和图形等信息。在这个实验中,我们将学习如何使用Arduino控制双色点阵发光二极管的显示。 材料: - Arduino开发板 - 双色点阵发光二极管 - 220欧姆电阻 - 杜邦线 - 面包板 步骤: 1. 将双色点阵发光二极管插入面包板中。 2. 将220欧姆电阻连接到每个发光二极管的阳极。 3. 将杜邦线连接到每个电阻的末端。 4. 将另一端的杜邦线连接到Arduino的数字引脚上。 5. 使用以下代码进行编程: ```C++ const int latchPin = 8; //锁存器引脚 const int clockPin = 12; //时钟引脚 const int dataPin = 11; //数据引脚 byte leds[4][8] = { //定义点阵中每个LED的状态 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}, {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}, {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}, {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000} }; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(latchPin, LOW); for (int row = 0; row < 4; row++) { shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][0]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][1]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][2]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][3]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][4]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][5]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][6]); shiftOut(dataPin, clockPin, MSBFIRST, ~leds[row][7]); Serial.println(leds[row][0]); } digitalWrite(latchPin, HIGH); delay(5); } ``` 6. 将Arduino连接到电脑,并上传代码。 7. 打开串口监视器,设置波特率为9600,以查看每一行点阵的状态。 8. 现在,您可以尝试更改代码中的LED状态,以显示所需的数字、字母或符号。 注意事项: - 点阵发光二极管的排列可能不同,具体取决于您使用的型号。 - 点阵发光二极管的阳极必须连接到电阻上。 - 代码中的数字引脚可以更改,具体取决于您使用的Arduino型号和点阵发光二极管的排列方式。 - 在上传代码之前,确保选中了正确的Arduino型号和串口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值