专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机+点阵8*8上、下、左、右移显示C程序(原创)

作者:佚名   来源:本站原创   点击数:  更新时间:2012年07月06日   【字体:

 最近在研究点阵,这东西看起来简单,但是要完全掌握它,可是要花一定时间的!我现在做得8*8点阵硬件电路是这样的,行采用74HC138+三极管8550驱动,列采用74HC595驱动,这种电路是非常用的,其次的扫描原理就是,先打开第一行,然后送代码给列,即595端,像这样扫描8次行,一个字就完成了,具体原理图如下图:

 

下面我将我写得代码下载地址分享下:http://www.51hei.com/f/sxzy.rar

一、上移:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定义行线IO口,即74HC154控制端
#define shudu 50//字移动的速度
sbit DATA=P3^5;//74HC595数据端
sbit CLK=P3^7;//74HC595移位脉冲端
sbit CLKR=P3^6;//74HC595数据锁存端
uint word;//字节变量
uchar line;//字节变量
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//字模数组
void delay(uchar z)
{
 uchar x,y;
 for(x=8;x>0;x--)
 for(y=z;y>0;y--);
}
/********************************/
/**74HC595移位寄存器送数子函数***/
/********************************/
void song(uchar z)//带参数函数
{
 uchar num,hang;//定义变量
 hang=z;//将形参给变量
 for(num=0;num<8;num++)//移动8次将数据发送完毕
 {
  if(hang&0x01==1)//将高7位屏蔽掉,保留最低位判断
  DATA=1;//为1就将74HC595数据端置1
  else
  DATA=0;//否则给0
  CLK=0;//上升沿送走数据
  CLK=1;//高电平形成上升沿
  hang>>=1;//将数移走一位
 }
}
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void xian()
{
 uchar i,f;
 for(i=0;i<shudu;i++)//一字移动的速度
 { 
  word=f;//将字暂存器给计数器
  for(line=0;line<8;line++)//扫描8次,即完成一个字的移动
  {
   song(~table[word]);
   CLKR=1;//在74HC595处锁存起来
   CLKR=0;
   CLKR=1;
   word++;//将计数器加1
   LINE=line;//打开行线,即74HC138行线端
   P3=0xff;
   delay(20);
  }
 }
 f+=2;//显示完一个字后加2形成上移 
 if(word>=32)
 {
  word=0;//清0重新开始
  f=0;
 }
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
 while(1)
 {
   xian();
 }
}                                                      

二、下移

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定义行线IO口,即74HC154控制端
#define shudu 50//字移动的速度
sbit DATA=P3^5;//74HC595数据端
sbit CLK=P3^7;//74HC595移位脉冲端
sbit CLKR=P3^6;//74HC595数据锁存端
uchar f=24;//给一个初值以便下移
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,//将字码调换
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};//字模数组
void delay(uchar z)
{
 uchar x,y;
 for(x=8;x>0;x--)
 for(y=z;y>0;y--);
}
/********************************/
/**74HC595移位寄存器送数子函数***/
/********************************/
void song(uchar z)//带参数函数
{
 uchar num,hang;//定义变量
 hang=z;//将形参给变量
 for(num=0;num<8;num++)//移动8次将数据发送完毕
 {
  if(hang&0x01==1)//将高7位屏蔽掉,保留最低位判断
  DATA=1;//为1就将74HC595数据端置1
  else
  DATA=0;//否则给0
  CLK=0;//上升沿送走数据
  CLK=1;//高电平形成上升沿
  hang>>=1;//将数移走一位
 }
}
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void xian()
{
 uint word;//字节变量
 uchar line,i;//字节变量
 for(i=0;i<shudu;i++)//一字移动的速度
 { 
  word=f;//将字暂存器给计数器
  for(line=0;line<8;line++)//扫描8次,即完成一个字的移动
  {
   song(~table[word]);
   CLKR=1;//在74HC595处锁存起来
   CLKR=0;
   CLKR=1;
   word++;//将计数器加1
   LINE=line;//打开行线,即74HC138行线端
   //P3=0xff;
   delay(10);
  }
 }
 f--;//显示完一个字后减1形成下移 
 if(f==0)
 {
  f=24;//移完后给值
 }
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
 while(1)
 {
   xian();
 }
}                                                      

三、左移

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定义行线IO口,即74HC154控制端
#define shudu 120//字移动的速度
sbit DATA=P3^5;//74HC595数据端
sbit CLK=P3^7;//74HC595移位脉冲端
sbit CLKR=P3^6;//74HC595数据锁存端
uchar move;//移动几位变量
uchar line;//行变量
uint word;//字节变量
uchar BUF[2];//2组缓存数组以便动态更改数据
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//字模数组
/********************************/
/**74HC595移位寄存器送数子函数***/
/********************************/
void song(uchar z)//带参数函数
{
 uchar num,hang;//定义变量
 hang=z;//将形参给变量
 for(num=0;num<8;num++)//移动8次将数据发送完毕
 {
  if(hang&0x01==1)//将高7位屏蔽掉,保留最低位判断
  DATA=1;//为1就将74HC595数据端置1
  else
  DATA=0;//否则给0
  CLK=0;//上升沿送走数据
  CLK=1;//高电平形成上升沿
  hang>>=1;//将数移走一位
 }
}
/********************************/
/*装一线数据子函数(即一行数据)*/
/********************************/
void yixian()
{
 BUF[0]=table[word+line];//第1个字代码装入缓存数组0,line表示行数,word表示字数
 BUF[1]=table[word+8+line];//第2个字代码装入缓存数组1 
}
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai()
{
 uchar temp,yi;//定义两个变量
 yi=move;//将要移多少位给变量yi
 temp=(BUF[0]<<yi)|(BUF[1]>>(8-yi));/*将第1个字即数组0左移yi(yi只是代号,比如1位)位
 ,然后将第下一个字即数组1右移8-yi位,然后或一下,这样就会得到要发送的数*/
 song(~temp);//发送给74HC595 
}
void xian()
{
 uchar i;
 while(word<24)//需要显示3个字,公式=8*N个字,比如四个字就是4*8=32
 {
  for(move=0;move<8;move++)//要移多少位?
  {
   for(i=0;i<shudu;i++)//一字移动的速度
   {
    for(line=0;line<8;line++)//扫描8次,即完成一个字的移动
    {
     yixian();//调用一线子程序
     yipai();//调用数据转换子程序
     LINE=line;//打开行线,即74HC138行线端
     CLKR=1;//在74HC595处锁存起来
     CLKR=0;
     CLKR=1;
    }
   }
  }
  word=word+8;//一个字显示完了,就显示下一个字
 }
 word=0;//清0重新开始
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
 while(1)
 {
   xian();
 }
}                                                      

四、右移

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定义行线IO口,即74HC154控制端
#define shudu 120//字移动的速度
sbit DATA=P3^5;//74HC595数据端
sbit CLK=P3^7;//74HC595移位脉冲端
sbit CLKR=P3^6;//74HC595数据锁存端
uchar move;//移动几位变量
uchar line;//行变量
uint word;//字节变量
uchar BUF[2];//2组缓存数组以便动态更改数据
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//字模数组
/********************************/
/**74HC595移位寄存器送数子函数***/
/********************************/
void song(uchar z)//带参数函数
{
 uchar num,hang;//定义变量
 hang=z;//将形参给变量
 for(num=0;num<8;num++)//移动8次将数据发送完毕
 {
  if(hang&0x01==1)//将高7位屏蔽掉,保留最低位判断
  DATA=1;//为1就将74HC595数据端置1
  else
  DATA=0;//否则给0
  CLK=0;//上升沿送走数据
  CLK=1;//高电平形成上升沿
  hang>>=1;//将数移走一位
 }
}
/********************************/
/*装一线数据子函数(即一行数据)*/
/********************************/
void yixian()
{
 BUF[0]=table[word+line];//第1个字代码装入缓存数组0,line表示行数,word表示字数
 BUF[1]=table[word+8+line];//第2个字代码装入缓存数组1 
}
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai()
{
 uchar temp,yi;//定义两个变量
 yi=move;//将要移多少位给变量yi
 temp=(BUF[1]<<(8-yi))|(BUF[0]>>yi);/*将第1个字即数组0左移yi(yi只是代号,比如1位)位
 ,然后将第下一个字即数组1右移8-yi位,然后或一下,这样就会得到要发送的数*/
 song(~temp);//发送给74HC595 
}
void xian()
{
 uchar i;
 while(word<24)//需要显示3个字,公式=8*N个字,比如四个字就是4*8=32
 {
  for(move=0;move<8;move++)//要移多少位?
  {
   for(i=0;i<shudu;i++)//一字移动的速度
   {
    for(line=0;line<8;line++)//扫描8次,即完成一个字的移动
    {
     yixian();//调用一线子程序
     yipai();//调用数据转换子程序
     LINE=line;//打开行线,即74HC138行线端
     CLKR=1;//在74HC595处锁存起来
     CLKR=0;
     CLKR=1;
    }
   }
  }
  word=word+8;//一个字显示完了,就显示下一个字
 }
 word=0;//清0重新开始
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
 while(1)
 {
   xian();
 }
}                               

 

 

关闭窗口

相关文章