#include<reg51.h>
#include<stdlib.h> //随机数函数所在头文件
#include<stdio.h>
sbit LCDEN=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
sbit BF=P0^7;
unsigned char flag=0;//启动/停止
unsigned int c=0;//随机种子数
unsigned char code chr1[16];
void delay(unsigned int xms)
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
unsigned char DectectBusyBit(void)//状态判断函数(忙/闲?)
{
bit result;
P0 = 0xff; //读状态前先置高电平,防止误判
RS = 0;
delay(5);
RW = 1;
LCDEN = 1;
delay(5);
result=BF; //若LCM忙,则反复测试,在此处原地踏步;当LCM闲时,才往下继续
LCDEN = 0;
return result;
}
void WrComLCD(unsigned char ComVal)//写命令函数
{
while(DectectBusyBit()==1); //先检测LCM是否空闲
RS = 0;
delay(1);
RW = 0;
LCDEN = 1;
P0 = ComVal;
delay(1);
LCDEN = 0;
}
void WrDatLCD(unsigned char DatVal)//写数据函数
{
while(DectectBusyBit()==1);
RS = 1;
delay(1);
RW = 0;
LCDEN = 1;
P0 = DatVal;
delay(1);
LCDEN = 0;
}
void LCD_Init(void)//1602初始化函数
{
WrComLCD(0x38); // 功能设定:16*2行、5*7点阵、8位数据接口
WrComLCD(0x38);
WrComLCD(0x38);
//多次重复设定功能指令,因为LCD启动后并不知道使用的是4位数据接口还是8位的,所以开始时总是默认为4位
WrComLCD(0x01); // 清屏
WrComLCD(0x06); // 光标自增、屏幕不动
delay(1); // 延时,等待上面的指令生效,下面再显示,防止出现乱码
WrComLCD(0x0f); // 开显示、关光标
}
void main()
{ unsigned char i=0,j,k,str[10];
TMOD=0X01; //计数器T0工作方式2、软启动、定时
TH0=0;TL0=1; //计数初值
EA=1; //总中断允许
ET0=1; //允许计数器T0中断
TR0=1; //启动计数器T0
EX0=1; //允许INT0中断
IT0=1; //设置INT0中断触发方式:下降沿出发
LCD_Init(); //液晶1602初始化
delay(5); //延时,等待初始化完成
while(1)
{ if(flag==1)
{ WrComLCD(0x80); //设置显示地址第一行第一位:0X00(0x80+0x00)
srand(c);
for(j=0;j<10;j++)
{ k=rand()%5;
sprintf(str,"%bd",k);
i=0;
while(str[i]!='\0')
{
WrDatLCD(str[i]);
i++;
delay(5);
}
}
flag=0;
TR0=1; //启动计数器T0
}
}
}
void EX_INT0() interrupt 0
{
flag=1;
TR0=0; //启动计数器T0
}
void EX_INT1() interrupt 1
{
c++; //修改种子数
}
随机数
最新推荐文章于 2024-04-20 16:00:31 发布