rand()產生隨機數,頭文件加#include<stdlib.h> 中
下面是案例:
#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define _nops() {_nop_();_nop_();_nop_();_nop_();}
sbit K1=P1^4;
sbit BEEP=P2^7;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
void speak();
bit Busy();
uchar code biaoti [] = {"^-^99 table ^-^"}; //標題字符串
uchar data plany_num[] = {" "}; //乘法口訣表達式
void delay(uint x); //延時
void beep(); //蜂鳴器
bit BUSY(void); //測忙
void Write_cmd(uchar cmd); //寫指令
void Write_dat(uchar dat); //寫數據
void LCD_chushihua(); //初始化LCD
void display(uchar *abc,uchar lineno) //顯示函數
{
uchar k;
Write_cmd(lineno | 0x80); // 傳地址
for(k=0;k<16;k++)
Write_dat(abc[k]); //傳數字與符號過來 a.被乘數 b.乘數 c.積
}
void random_num() //隨機生成被乘數,乘數算出乘積
{
uchar a,b,c1,c2;
//---------------------------------------------------隨機數處理
a = rand()%9+1; //被乘數 rand()產生隨機數a函數
//rand()%9表示隨機產生的最大值為(9-1)就是8,因此要加1
b = rand()%9+1; //乘數
c1 = a*b/10; //十位
c2 = a*b%10; //個位
plany_num[3] = a+'0'; //0x40 + 3,放被乘數
plany_num[5] = '*'; //0x40 + 5,放被乘號
plany_num[7] = b+'0'; //0x40 + 7,放乘數
plany_num[9] = '='; //0x40 + 9,放被‘=’號
plany_num[11]= c1+'0'; //0x40 + 11或12,放結果
plany_num[12]= c2+'0';
if( c1 == 0) plany_num[11]=' ';//當乘積的十位數即數組中的第9位為0時不顯示
}
void main()
{
P0= P2=0xff;
delay(10);
LCD_chushihua(); //初始化LCD
display(biaoti,0x00);//在第一行顯示標題
while(1)
{
if(K1==0) //按鍵取隨機數
{
speak();
delay(10);
while(K1==0); //等待K1鍵釋放
random_num();
}
display(plany_num,0x40); //指定第二行放數的位置
delay(100);
}
}
//----------------------------- LCD1602七七八八-------------------------------------------
bit BUSY(void) //測忙
{
bit panmang;//定義一個位 panmang(判忙),只有0與1,丟到while(BUSY())中.
RS = 0;
RW = 1;
EN = 1;
delay(1);
panmang = (bit)(P0 & 0x80); //最高位為判忙信號位 panmang = 1為忙,反之不忙,可執行后面語句
EN = 0;
return panmang;
}
void Write_cmd(uchar cmd) //寫指令
{
while(BUSY()); //測忙
RS = 0; // RS = 0;是寫指令
RW = 0;
EN = 0;
P0 = cmd;
EN = 1;
delay(1);
EN = 0;
}
void Write_dat(uchar dat)
{
while(BUSY()); //測忙
RS = 1; // RS = 1;是寫數據
RW = 0;
EN = 0;
P0 = dat;
EN = 1;
delay(1);
EN = 0;
}
void LCD_chushihua() //LCD初始化
{
Write_cmd(0x38); //功能設置
delay(1);
Write_cmd(0x0c); //顯示開關控制
delay(1);
Write_cmd(0x06); //輸入方式設置
delay(1);
Write_cmd(0x01); //清除LCD的顯示內容
delay(1);
}
void delay(uint x) //延時
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void speak() //蜂鳴器
{
uchar i,j;
for(i=0;i<180;i++)
{
for(j=0;j<50;j++); BEEP=!BEEP;
}
delay(300);BEEP=0;
}
|