📄 up-move.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 + -