/* *************************************************************************** * (C) Copyright 2008,单片机初学者园地 * All Rights reserved. * *项目名称: 51单片机学习开发系统 *本文件名称:caipiao.c * * 完成作者 : 单片机初学者(QQ:50501160) * 当前版本 : V1.0 * 完成日期 : 2008年5月27日 * 描 述 : * 此程序实现,30选7的福利彩票机选程序,单片机选的号能中大奖品啊,呵呵 * **************************************************************************** */
#include <reg52.h> //调用头文件(单片机内部的寄存器定义) #include <stdlib.h>
/*从一组n项的数组中随机抽了不同的m项(m<=n)*/
#define n 30 #define m 7 /******本段为硬件I/O口定义********/ sbit KEY0 = P0 ^ 0; //KEY和发光管复用,请将4个跳线插到KEY端 sbit KEY1 = P0 ^ 1; sbit KEY2 = P0 ^ 2; sbit KEY3 = P0 ^ 3; sbit DIG0 = P0 ^ 4; //数码管位0 sbit DIG1 = P0 ^ 5; //数码管位1 sbit BUZZ = P3 ^ 3; //蜂鸣器 sbit LCD_RW = P3 ^ 6; sbit LCD_RS = P3 ^ 7; sbit LCD_E = P3 ^ 4; #define LED_SEG P1 //数码管 #define LCD_DATA P2 //LCD #define LCD_BUSY 0x80 // 用于检测LCD的BUSY标识 void lcd_init(void); void display_string(unsigned char x,unsigned char y,unsigned char *s); void display_char(unsigned char x,unsigned char y,unsigned char dat);
//函数声明 /************************************************** ** 函数名称: dellay ** 入口参数:h(unsigned int型) ** 出口参数:无 ** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS ****************************************************/ void dellay(unsigned int h) { while(h--); //0.01MS } bit start_stop;
/************主程序**************/ main() { int i, j, k,logic, a[ m ]; /*把随机数保存到a[m]*/ IT0=1; //外部中断0下降沿触发 EX0=1; //开外部中断0 EA=1; //开所有中断 lcd_init(); display_string(0,0,"30-7:"); start_stop=1; while(1) { if(start_stop==1) {for ( i = 0; i < m; i++ ) { do { /*新产生的随机数与a[m]中的每项进行比较*/ logic = 0; k= rand( ); a[ i ] = k % n + 1; /*产生1~n范围的随机数*/ for( j = 0; j < i ; j++) { if( a[ j ] == a[ i ] ) { logic = 1; /*随机数与a[m]中的相同*/ break; } } /* end for */ }while( logic ); }/* end for*/ { display_char(6,0,a[ 0 ]/10+0x30); display_char(7,0,a[ 0 ]%10+0x30); display_char(9,0,a[ 1 ]/10+0x30); display_char(10,0,a[ 1 ]%10+0x30); display_char(12,0,a[ 2 ]/10+0x30); display_char(13,0,a[ 2 ]%10+0x30); display_char(4,1,a[ 3 ]/10+0x30); display_char(5,1,a[ 3 ]%10+0x30); display_char(7,1,a[ 4 ]/10+0x30); display_char(8,1,a[ 4 ]%10+0x30); display_char(10,1,a[ 5 ]/10+0x30); display_char(11,1,a[ 5 ]%10+0x30); display_char(13,1,a[ 6 ]/10+0x30); display_char(14,1,a[ 6 ]%10+0x30); } dellay(1000); } } } /* end main */ void int0_ISR (void) interrupt 0 { EA=0; dellay(1000); //软件去抖 start_stop=!start_stop; if(!start_stop) { BUZZ = 0; dellay(500); BUZZ = 1; } EA=1; } //写数据 void WriteDataLcd(unsigned char wdata) { LCD_DATA=wdata; LCD_RS=1; LCD_RW=0; LCD_E=0; dellay(100); //短暂延时 LCD_E=1; } //写命令 void WriteCommandLcd(unsigned char wdata) { LCD_DATA=wdata; LCD_RS=0; LCD_RW=0; LCD_E=0; dellay(100); //短暂延时 LCD_E=1; } //LCD初始化 void lcd_init(void) { LCD_DATA=0; WriteCommandLcd(0x38); dellay(1000); WriteCommandLcd(0x38); dellay(1000); WriteCommandLcd(0x38); //显示模式设置 WriteCommandLcd(0x08); //关闭显示 WriteCommandLcd(0x01); //显示清屏 WriteCommandLcd(0x06); //显示光标移动设置 WriteCommandLcd(0x0c); //显示开及光标移动设置 } //设置光标 void display_xy(unsigned char x,unsigned char y) { if(y==1) x+=0x40; x+=0x80; WriteCommandLcd(x); } //显示单个字符 void display_char(unsigned char x,unsigned char y,unsigned char dat) { display_xy(x,y); WriteDataLcd(dat); } //显示字符串 void display_string(unsigned char x,unsigned char y,unsigned char *s) { display_xy(x,y); while(*s) { WriteDataLcd(*s); s++; } } 相关链接:http://blog.**/ahai0306/119263/message.aspx |