//该程序将实现液晶屏显示随机数的效果
#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 ++; } } }
希望得到高人指点,能对程序加以优化^^
|