久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機+點陣8*8上、下、左、右移顯示C程序(原創)

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年07月06日   【字體:

 最近在研究點陣,這東西看起來簡單,但是要完全掌握它,可是要花一定時間的!我現在做得8*8點陣硬件電路是這樣的,行采用74HC138+三極管8550驅動,列采用74HC595驅動,這種電路是非常用的,其次的掃描原理就是,先打開第一行,然后送代碼給列,即595端,像這樣掃描8次行,一個字就完成了,具體原理圖如下圖:

 

下面我將我寫得代碼下載地址分享下:http://www.zg4o1577.cn/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();
 }
}                               

 

 

關閉窗口

相關文章

主站蜘蛛池模板: 国产日韩精品视频 | 一区二区三区小视频 | 国产精品久久久久久久久久免费看 | 羞羞的视频在线观看 | 成人国产精品 | 黄在线免费观看 | 极品销魂美女一区二区 | 99久热在线精品视频观看 | 粉嫩一区二区三区国产精品 | 欧美成年网站 | 国产日韩欧美精品一区二区三区 | 91精品久久久久久久99 | 99精品99| 国产区精品在线观看 | 亚洲国产黄色av | 欧美日韩精品一区二区三区视频 | 国产精品久久久久久久久久 | 成人小视频在线观看 | 亚洲视频1区 | 在线免费观看亚洲 | 午夜影视网 | 国精产品一区二区三区 | 久久99精品久久久久久噜噜 | 手机在线一区二区三区 | 中文字幕av在线 | 亚洲精品国产偷自在线观看 | 久久精品久久精品久久精品 | 国产精品一区二区三级 | 中文字幕日韩一区 | 婷婷久久一区 | 国产精品久久久久久久粉嫩 | 久久久观看 | 96国产精品久久久久aⅴ四区 | 久久久久久免费观看 | www.青青草| 国产成人99久久亚洲综合精品 | 亚洲国产精品久久久 | 成人久草 | 成人免费视频网站 | 中文字幕在线一区 | 日本视频免费 |