⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 up-move.c

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 C
字号:
/*******************************************************************
*                                                                  *
* ME500单片机开发系统演示程序 - 向上滚动显示伟纳电子               *
*                                                                  *
* 16×16LED点阵显示                                                 
*                                                                  *
* 版本: V1.0 (2006/11/20)                                         *
* 作者: gguoqing (Email: gguoqing@willar.com)                     *
* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界)  *
* 邮箱: support@willar.com                                        *
*                                                                  *
*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved  *
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!        *
*                                                                  *
*******************************************************************/

#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>	 //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

#define BLKN 2          //列锁存器数

sbit  SDATA_595=P0^0;   //串行数据输入
sbit  SCLK_595 =P2^7;   //移位时钟脉冲
sbit  RCK_595  =P0^2;   //输出锁存器控制脉冲
sbit  G_74138  =P2^4;   //显示允许控制信号端口

uchar data  dispram[32];  //显示缓存
uchar temp;

void  delay(uint );

uchar code Bmp[][32]=          
  {
   {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},

   {0xf7,0xbf,0xf7,0xbf,0xf7,0xbb,0xe8,0x1,0xef,0xbf,0xcf,0xb7,
    0xa8,0x3,0x6f,0xbf,0xef,0xbb,0xe0,0x1,0xef,0xbb,0xef,0xbb,
	0xef,0xab,0xef,0xb7,0xef,0xbf,0xef,0xbf},//伟
 
   {0xef,0xbf,0xef,0xbf,0xdf,0xbb,0xdc,0x1,0xb5,0xbb,0x5,0xbb,
    0xed,0xbb,0xdd,0xbb,0xbd,0x5b,0x5,0x6b,0xfc,0xeb,0xfd,0xfb,
    0xe5,0xfb,0x1d,0xfb,0xbd,0xeb,0xfd,0xf7},//纳
  
   {0xfd,0xff,0xfd,0xff,0xfd,0xef,0x80,0x7,0xbd,0xef,0xbd,0xef,
    0x80,0xf,0xbd,0xef,0xbd,0xef,0x80,0xf,0xbd,0xef,0xfd,0xff,
	0xfd,0xfb,0xfd,0xfb,0xfe,0x3,0xff,0xff},//电
  
   {0xff,0xff,0xc0,0xf,0xff,0xef,0xff,0xdf,0xff,0xbf,0xfe,0x7f,
    0xfe,0xfb,0x0,0x1,0xfe,0xff,0xfe,0xff,0xfe,0xff,0xfe,0xff,
	0xfe,0xff,0xfe,0xff,0xfa,0xff,0xfd,0xff}//子  
  };

/********************************************************/
/*                                                      */
/* 主函数                                               */
/*                                                      */
/********************************************************/
void  main(void)
{
  uchar i,j,k;
  TMOD = 0x01;          //定时器T0工作方式1
  TH0 = 0xFC;           //1ms定时常数
  TL0 = 0x66;
  G_74138 = 1;          //关闭显示
  RCK_595=0;
  P2 =0xF0;             //

  IE = 0x82;            //允许定时器T0中断
  TR0 = 1;              //启动定时器T0
  while(1)
  {
     for(i=0;i<32;i++)         //黑屏
  	 {
  	   dispram[i]= Bmp[0][i];
     }
  	 delay(1000);

     for(i=0;i<5;i++)         //上滚屏显示效果
 	  {
	   for(j=0;j<16;j++)
	    {
		  for(k=0;k<15;k++) 
		    {
			  dispram[k*BLKN]=dispram[(k+1)*BLKN];
              dispram[k*BLKN+1]=dispram[(k+1)*BLKN+1];
			}
              dispram[30]=Bmp[i][j*BLKN];
			  dispram[31]=Bmp[i][j*BLKN+1];
              delay(100);
         }
       }
	   delay(2000);
   }// end of while(1)
}// end of main()

/********************************************************/
/*                                                      */
/* 延时函数                                             */
/*                                                      */
/********************************************************/
void  delay(uint dt)
{
   uchar bt;
   for(;dt;dt--)
   for(bt=0;bt<255;bt++);
}
 
/********************************************************/
/*                                                      */
/*将显示数据送入74HC595内部移位寄存器                   */
/*                                                      */
/********************************************************/

void WR_595(void)
{
     uchar x;
      for (x=0;x<8;x++)
     {
      temp=temp<<1; 
      SDATA_595=CY;
      SCLK_595=1;        //上升沿发生移位
       _nop_();
       _nop_();
      SCLK_595=0;
     }        
}
 
/********************************************************/
/*                                                      */
/* 中断服务函数                                         */
/*                                                      */
/********************************************************/ 
void  leddisplay(void) interrupt 1 using 1
{
   register unsigned char i,j=BLKN;
   TH0 = 0xFC;          //1ms定时常数
   TL0 = 0x66;
   i=P2;                //读取当前显示的行号
   i=++i & 0x0f;        //行号加1,屏蔽高4位
   do{
   	  j--;
      temp = dispram[i*BLKN+j];
      WR_595();
     }while(j);
   
   G_74138=1;          //关闭显示
   P2 &= 0xf0;         //行号端口清零
   RCK_595 = 1;        //上升沿将数据送到输出锁存器
   P2 |=i;             //写入行号
   RCK_595 = 0;        //锁存显示数据
   G_74138=0;          //打开显示
}

/********************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -