51单片机LED16*16点阵滚动显示
2012-09-05
edifier1111

以下为C语言程序:

/*
功能:LED16*16点阵滚动显示
说明:74LS164用作发送数据,P0,P2口用来列选
看本程序最好的工具最好旁边有标号和语法着色,推荐keil或UltraEdit
懒人提示:要改成自己所要的显示内容,要怎么改?
1.要改显示内容改第23~92行代码,还有第119行代码,具体改法见下面注释
2.要改滚动速度改第102行代码
*/
/*头文件*/
#include <reg52.h>
#include <intrins.h>

/*宏定义*/
#define uchar unsigned char
#define uint  unsigned int

/*函数声明*/
void delay(void);

/*全局变量*/
uint lie; //列选标志
/** 字模:反显,纵向取模,开头和结尾均加入32个0xFF,用于改善屏滚动显示时循环的连贯性   **/
/** 杭州市公交公司K316路,开往武林广场,发车时间20:30,欢迎大家乘坐!  --  **  宋体, 12  **/
/** 当前所选字体下一个汉字对应的点阵为:  宽度x高度=496x16,  调整后为: 496x16          **/
uchar code text[1056] = {  //这里的数据为你要显示的内容的数据量+64(前后各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, 0xFF,
    //改显示内容以上两行别改
    0xEF, 0xDF, 0xEF, 0x3F, 0xE8, 0xFF, 0x00, 0x00, 0xED, 0xFF, 0xFE, 0xFD, 0xEF, 0xF3, 0xEC, 0x0F,
    0x6D, 0xFF, 0x8D, 0xFF, 0xED, 0xFF, 0xEC, 0x03, 0xEF, 0xFD, 0xEF, 0xFD, 0xEF, 0xE1, 0xFF, 0xFF,
    0xFF, 0x7F, 0xF8, 0xFE, 0xFF, 0xF9, 0xFF, 0xE7, 0x00, 0x1F, 0xFB, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
    0x80, 0x01, 0xF7, 0xFF, 0xF9, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
    0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xD8, 0x03, 0xDB, 0xFF, 0xDB, 0xFF, 0x5B, 0xFF, 0x80, 0x00,
    0xDB, 0xFF, 0xDB, 0xFF, 0xDB, 0xF7, 0xDB, 0xFB, 0xD8, 0x07, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xFB, 0xFD, 0xF1, 0xF3, 0xEB, 0x8F, 0xDB, 0xDE, 0x3B, 0xFF, 0x73,
    0xFF, 0xF7, 0x8F, 0xF7, 0xF7, 0xD7, 0xF9, 0xE1, 0xFC, 0xF3, 0xFE, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xEF, 0xFE, 0xEE, 0xFE, 0xED, 0xFD, 0xE3, 0x7D, 0xEB, 0xBB, 0x6F, 0xD7, 0x8F, 0xE7,
    0xCF, 0xCF, 0xEF, 0x97, 0xE6, 0x3B, 0xEB, 0x79, 0xE9, 0xFC, 0xED, 0xFD, 0xEF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xFB, 0xFD, 0xF1, 0xF3, 0xEB, 0x8F, 0xDB, 0xDE, 0x3B, 0xFF, 0x73,
    0xFF, 0xF7, 0x8F, 0xF7, 0xF7, 0xD7, 0xF9, 0xE1, 0xFC, 0xF3, 0xFE, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF7, 0xFF, 0xB6, 0x07, 0xB6, 0xDF, 0xB6, 0xDF, 0xB6, 0xDF, 0xB6, 0xDF, 0xB6, 0xDF,
    0xB6, 0xDF, 0xB6, 0x0F, 0xB7, 0xFF, 0xBF, 0xFB, 0xBF, 0xFD, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
    0xEF, 0xFB, 0xE0, 0x03, 0xEE, 0xFB, 0xFC, 0x7F, 0xEB, 0x9B, 0xE7, 0xE3, 0xEF, 0xFB, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF3, 0xE7, 0xEF, 0xFB, 0xEE, 0xFB, 0xEE, 0xFB, 0xED, 0x77, 0xF3, 0x8F, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF7, 0xFB, 0xF7, 0xFB, 0xE0, 0x03, 0xFF, 0xFB, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF8, 0x0F, 0xF7, 0x77, 0xEE, 0xFB, 0xEE, 0xFB, 0xE7, 0x77, 0xFF, 0x8F, 0xFF, 0xFF,
    0xFF, 0xFB, 0x81, 0x03, 0xBB, 0xFB, 0xB8, 0x07, 0x83, 0x77, 0xFB, 0x77, 0xF7, 0xBF, 0xEF, 0x01,
    0x0F, 0x3B, 0xD2, 0xBB, 0xDD, 0xBB, 0xDA, 0xBB, 0xC6, 0x81, 0xDF, 0x3F, 0xFF, 0x7F, 0xFF, 0xFF,
    0xFF, 0xFE, 0xFF, 0xF2, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFD, 0xFF, 0xBD, 0xFD, 0xBD, 0xFB, 0xBD, 0xF7, 0xBD, 0xCF, 0x80, 0x3F, 0xBD, 0xFF, 0xBD, 0xFF,
    0xBD, 0xFF, 0xBD, 0xFF, 0x80, 0x01, 0xBD, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xFF, 0xFF,
    0xFB, 0xBF, 0xF7, 0x7F, 0xEE, 0xFF, 0x10, 0x00, 0xBB, 0xFF, 0xEF, 0xFD, 0xEF, 0x7D, 0xEF, 0x7D,
    0x6F, 0x7D, 0x80, 0x01, 0xAF, 0x7D, 0xEF, 0x7D, 0xEF, 0x7D, 0xEF, 0x7D, 0xEF, 0xFD, 0xFF, 0xFF,
    0xF7, 0xFD, 0xF7, 0xFD, 0xD7, 0x01, 0xD7, 0xFB, 0xD7, 0xFB, 0xD4, 0x07, 0xD7, 0x77, 0xD7, 0x77,
    0xF7, 0x7F, 0x01, 0xFF, 0xF6, 0x1F, 0xB7, 0xE7, 0xD7, 0xFB, 0xF7, 0xFD, 0xF7, 0xF0, 0xFF, 0xFF,
    0xF7, 0xEF, 0xF7, 0x9F, 0xF6, 0x7F, 0x00, 0x00, 0xF6, 0xFF, 0xF7, 0x37, 0xFF, 0xEF, 0xF7, 0xDF,
    0xF7, 0x3F, 0xF4, 0xFF, 0x00, 0x00, 0xF6, 0x7F, 0xF7, 0x9F, 0xF7, 0xE7, 0xF7, 0xEF, 0xFF, 0xFF,
    0xFF, 0xFD, 0xFF, 0xF3, 0xC0, 0x0F, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0x5F, 0xFF,
    0x9F, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF,
    0xF7, 0xEF, 0xF7, 0xE7, 0xF7, 0xEF, 0x00, 0x1F, 0xF7, 0xDF, 0xF7, 0xBF, 0xBF, 0xAD, 0xBD, 0xDB,
    0xB9, 0xB7, 0xB4, 0x6F, 0xAD, 0x9F, 0x9C, 0x7D, 0xBD, 0xFE, 0xF8, 0x01, 0xFD, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFE, 0xFF, 0xF2, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFD, 0xF7, 0xFB, 0x83, 0xF7, 0xF7, 0xEE, 0xF7, 0x1E, 0xF0, 0x7D, 0x06, 0x9D, 0xF6, 0xEB,
    0xF6, 0xF7, 0xB6, 0xEB, 0xD6, 0x1B, 0xC7, 0xFD, 0xF7, 0xFC, 0xF7, 0xFD, 0xF7, 0xFF, 0xFF, 0xFF,
    0xFF, 0xDF, 0xDF, 0xDF, 0xDE, 0xDF, 0xDC, 0xDF, 0xDA, 0xDF, 0xC6, 0xDF, 0x1E, 0xDF, 0xDE, 0xDF,
    0xD0, 0x00, 0xDE, 0xDF, 0xDE, 0xDF, 0xDE, 0xDF, 0xDE, 0xDF, 0xDE, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xC0, 0x1F, 0xDD, 0xDF, 0xDD, 0xDF, 0xDD, 0xDF, 0xC0, 0x1F, 0xF7, 0xFF, 0xF6, 0xFF,
    0xF7, 0x3F, 0xF7, 0xFD, 0xF7, 0xFE, 0x00, 0x01, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0xB6, 0xDF, 0xB6, 0xDF,
    0xB6, 0xDF, 0xB6, 0xDF, 0xB0, 0x1F, 0xBF, 0xFD, 0xBF, 0xFE, 0x80, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF1, 0xF3, 0xEF, 0xEB, 0xEF, 0xDB, 0xEF, 0xBB, 0xEE, 0x7B, 0xF1, 0xF3, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF8, 0x0F, 0xF7, 0xF7, 0xEF, 0xFB, 0xEF, 0xFB, 0xF7, 0xF7, 0xF8, 0x0F, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF3, 0xFC, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF3, 0xE7, 0xEF, 0xFB, 0xEE, 0xFB, 0xEE, 0xFB, 0xED, 0x77, 0xF3, 0x8F, 0xFF, 0xFF,
    0xFF, 0xFF, 0xF8, 0x0F, 0xF7, 0xF7, 0xEF, 0xFB, 0xEF, 0xFB, 0xF7, 0xF7, 0xF8, 0x0F, 0xFF, 0xFF,
    0xFF, 0xFE, 0xFF, 0xF2, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xD7, 0xFB, 0xDB, 0xF7, 0xDD, 0xCD, 0xDE, 0x3D, 0xD9, 0x3D, 0xC7, 0xCB, 0xFB, 0xFB, 0xE7, 0xF7,
    0x0F, 0xCF, 0xE8, 0x3F, 0xEF, 0x9F, 0xEF, 0xE7, 0xEB, 0xF3, 0xE7, 0xF9, 0xEF, 0xFB, 0xFF, 0xFF,
    0xFD, 0xFD, 0x7D, 0xFB, 0x8C, 0x07, 0xDF, 0xFB, 0xFF, 0xFD, 0xC0, 0x1D, 0xDF, 0xBD, 0xBF, 0x7D,
    0xBF, 0xFD, 0xC0, 0x05, 0xDF, 0xFD, 0xDF, 0xBD, 0xDF, 0xDD, 0xC0, 0x3D, 0xFF, 0xFD, 0xFF, 0xFF,
    0xFB, 0xFF, 0xFB, 0xFE, 0xFB, 0xFD, 0xFB, 0xFB, 0xFB, 0xF7, 0xFB, 0xCF, 0xFA, 0x3F, 0x01, 0xFF,
    0xFA, 0x7F, 0xFB, 0x9F, 0xFB, 0xEF, 0xFB, 0xF3, 0xFB, 0xF9, 0xFB, 0xFC, 0xFB, 0xFD, 0xFF, 0xFF,
    0xFF, 0xFF, 0xE7, 0x6B, 0xDF, 0x6B, 0xD7, 0x57, 0xD6, 0xD7, 0xD6, 0xAD, 0x54, 0x6E, 0x92, 0xDD,
    0xD7, 0x03, 0xD7, 0x9F, 0xD6, 0x6F, 0xDF, 0x6F, 0xD7, 0xF7, 0xCF, 0xF3, 0xDF, 0xF7, 0xFF, 0xFF,
    0xEF, 0xBB, 0xEB, 0xBB, 0xAB, 0x77, 0xAB, 0x77, 0xA0, 0x2F, 0xAF, 0xCF, 0xAF, 0x9F, 0x80, 0x01,
    0xAF, 0xBF, 0x6F, 0xDF, 0x60, 0x4F, 0x6D, 0x67, 0x6B, 0x73, 0xCB, 0x77, 0xEE, 0x7F, 0xFF, 0xFF,
    0xFF, 0x7D, 0xFE, 0xFD, 0xF9, 0xDD, 0xC7, 0xDD, 0xFB, 0xDD, 0xFC, 0xDD, 0xFF, 0xDD, 0x00, 0x01,
    0xFF, 0x5D, 0xFE, 0xDD, 0xFD, 0xDD, 0xC3, 0xDD, 0xFD, 0xDD, 0xFE, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x05, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

/*主函数*/
void main()
{
    uchar i, j;
    uint m = 0; //m是从字模数组里向后取数据时的计数器,用以改变显示文字的内容,及滚动显示效果
    SCON = 0;

//初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)
    lie = 0x7fff; //列选标志初始化
    while (1) {
        //重复循环显示
        for (j = 0; j < 10; j++) { //j用来控制屏上1帧显示内容停留的时间,即用来控制滚动速度
            for (i = 1; i <= 31; i += 2) {
                P0 = 0xff; //先关显示,以免164内数据移动过程中在屏上产生不良影响,大家可以把这两句去掉比较下显示效果
                P2 = 0xff;
                SBUF = text[i + m]; //从串口发送字模数据(为什么要先发后一个数据,看下电路应该会明白吧:)
                while (TI == 0);
                //等待发送完毕
                TI = 0;
                SBUF = text[i + m - 1]; //从串口发送数据,补全整一列数据
                while (TI == 0);
                TI = 0;
                P0 = lie % 256; //选中要显示的那列,同时等于打开了那列的显示
                P2 = lie / 256;
                delay();
                //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象,略知生理的人应该都知道吧。
                lie = _iror_(lie, 1);
                //列选标志移位,准备用来选中下一列
            }
        }//返回显示下一列,直到16列都显示完成
        m += 2; //显示内容向后移一列
        if (m > 1024) { //这个数据为你的字模数组的大小-32,我的是1056-32=1024
            m = 0;
        }
    }
}

/*延时子程序*/
void delay()
{
    uint n;
    for (n = 0; n < 90; n++)
    {;}
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号