分享

在1602液晶屏上显示随机数

 户外驴行 2012-03-23

//该程序将实现液晶屏显示随机数的效果

#include <reg52.h>
#include <stdio.h>            
#include <stdlib.h>           //包含了随机数产生函数rand();
#include <intrins.h>          //包涵了空操作_nop_函数

#define uchar unsigned char
#define Data P0

sbit WEI = P2^7;
sbit DUAN = P2^6;
sbit RS = P2^1;
sbit RW = P1^5;
sbit E = P1^6;
sbit BF = P0^7;

//用到的函数声明
void Delay(uchar);      //延时函数
void Busy();            //忙时检测
void Init();            //初始化函数
void Write(uchar, bit); //写数据/指令函数
void ShowData(uchar, bit, uchar);   //显示字符
void ShowString(uchar, bit, uchar *ptr);    //显示字符串

uchar code Digit[] = {"0123456789"};


void main()
{
    uchar i, d1, d2, d3, d4, d5;
    unsigned int num;            //定义随机数的范围:32767
    //关闭数码管
    Data = 0x0;
    WEI = 1;
    WEI = 0;
    Data = 0xff;
    DUAN = 1;
    DUAN = 0;
///////////////////////////////////
///////////////////////////////////

    Init();
    ShowString(2, 0, "Test Random");

    while(1)
    {
        num = rand();   //产生随机数
        d1 = num % 10;        //个位
        d2 = num % 100 / 10;  //十位
        d3 = num % 1000 / 100;//百位
        d4 = num % 10000 / 1000; //千位
        d5 = num / 10000;        //万位
        ShowData(5, 1, Digit[d1]);
        ShowData(6, 1, Digit[d2]);
        ShowData(7, 1, Digit[d3]);
        ShowData(8, 1, Digit[d4]);
        ShowData(9, 1, Digit[d5]);
        for(i = 20; i > 0; i --)
            Delay(200);
    }
}


void Delay(uchar i)
{
    uchar j;
    for(; i > 0; i --)
        for(j = 155; j > 0; j --);     //最少延时1ms
}

void Busy()
{
    Delay(5);
    RS = 0;       //根据规定:只有当RS = 0; RW = 1;才能进行指令读取
    RW = 1;
    E = 1;        //只有当E = 1;才能进行读写操作
    _nop_();
    _nop_();      //两个空操作,给硬件一定的反应时间
    while(BF);    //忙时检测
    _nop_();
    _nop_();      //两个空操作,给硬件一定的反应时间
    E = 0;        //当E由1跳至0时,执行指令
}

void Write(uchar msg, bit flag)
{
    Busy();        //只有不再忙时,才能进行读写操作
    RS = flag;     //flag的值决定操作对象是数据/指令
    RW = 0;        //操作的方式:写
    E = 0;         //规定在进行读写操作时,E处于高脉冲,就是将E从0跳变到1
    _nop_();
    _nop_();
    _nop_();
    _nop_();       //四个空操作给硬件一定的反应时间
    E = 1;
    Data = msg;    //给数据端口赋值
    _nop_();
    _nop_();
    E = 0;         //当E从1跳至0时,执行指令
}

void Init()    
{
    Delay(15);     //第一次操作,给硬件较长的延时
    Busy();        //只有在闲时才能进行操作
    Write(0x01, 0);  //清屏指令
    Delay(5);
    Write(0x06, 0);  //【输入方式设置】光标从左向右移动,内容不移动
    Delay(5);
    Write(0x0c, 0);  //【显示开关设置】显示开,光标不显示,字符不闪烁
    Delay(5);
    Write(0x38, 0);  //【功能设置】8位数,双行显示,5*7点阵
    Delay(5);
}

void ShowData(uchar i, bit j, uchar d)     //i表示要显示的地址,j表示显示在第几行,d表示要显示的字符内容
{
    if(j == 1)
    {
        Write((i | 0xc0), 0);         //在第二行显示
        Write(d, 1);
    }
    else
    {
        Write((i | 0x80), 0);         //在第一行显示
        Write(d, 1);
    }
}

void ShowString(uchar i, bit j, uchar *ptr)    //i表示要显示的地址,j表示显示在第几行,d表示要显示的字符串内容
{
    if(j == 1)
    {
        Write((i | 0xc0), 0);         //在第二行显示
        while(*ptr)         //检测是否显示完了所有的字符串,若没有,则继续显示
        {
            Write(*ptr, 1);
            ptr ++;
        }
    }
    else
    {
        Write((i | 0x80), 0);         //在第一行显示
        while(*ptr)
        {
            Write(*ptr, 1);
            ptr ++;
        }
    }
}

希望得到高人指点,能对程序加以优化^^

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多