资料下载地址:51单片机仿真摇号抽奖机源程序12864液晶显示仿真+程序
一、功能介绍
单片机连接12864(st7920)液晶显示器和1个按键接INT0,模拟一个抽奖机。
实现效果:
1、液晶初始显示"祝你好运!";
2、按一下按键,液晶显示"开始抽奖",然后显示"3-2-1"倒计时后,产生20个(0-4之间的)随机数;
3、液晶屏幕根据随机数显示"特等奖"、"1等奖"、"2等奖"、"3等奖"、"谢谢参与";
4、最后液晶屏显示抽奖结果:"恭喜你获得:XXX"。
5、再按一下按键,重新开始抽奖,液晶又显示"开始抽奖"。。。。。。如此循环。
二、仿真图片
三、程序
cpp
void delay(int ms) // 毫秒延时函数
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_(); //空操作,耗时1个指令周期,晶振12MHz时,耗时1us
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP(); //延时4us
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//写字符串
void lcd_wstr(uchar* dat)
{
uchar i=0;
while(dat[i] != '\0'&&i<16)
{ //显示字符
lcd_wdat(dat[i]);
i++;
}
}
/*******************************************************************/
/* LCD初始化设定 */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
// lcd_wcmd(0x34); //扩充指令操作
// delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* 设定显示位置 */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
//中断初始化
void interrupt_init()
{
EA=1;/*开全局中断*/
EX0=1;/*允许INT0中断*/
IT0=1;/*设置外部中断触发方式:下降沿触发*/
TMOD=0x11;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
TH0=15535/256; //计时50ms
TL0=15535%256;
TH1=55535/256; //计时10ms
TL1=55535%256;
}
/*********************************************************/
/* 主程序 */
/*********************************************************/
void main()
{
uchar str[17]=" ";
interrupt_init();
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(1,4-strlen(dis[0])/4); //设置显示位置为第二行的第1个字符
lcd_wstr(dis[0]); //显示字符
while(1)
{
delay(50);
if(t_flag==1)
{
t_flag=0;
lcd_pos(2,0);
lcd_wstr(str);
delay(5);
lcd_pos(2,4-strlen(time[num])/4);
lcd_wstr(time[num]);
}
else if(a_flag==1)
{
a_flag=0;
lcd_wcmd(0x01);
lcd_pos(2,4-strlen(award[num])/4);
lcd_wstr(award[num]);
if(end_flag==1)
{
end_flag=0;
lcd_pos(0,4-strlen(dis[2])/4);
lcd_wstr(dis[2]);
}
}
delay(10);
}
}
void EX_IT0() interrupt 0
{
lcd_wcmd(0x01);
lcd_pos(1,4-strlen(dis[1])/4); //设置显示位置为第二行的第1个字符
lcd_wstr(dis[1]); //显示字符
TH0=15535/256; //计时50ms
TL0=15535%256;
TR0=1;
num=2;
}
void ET_IT0() interrupt 1
{
TH0=15535/256; //计时50ms
TL0=15535%256;
t++;
if(t%20==0)
{
t_flag=1;
num=(num+1)%3;
if(t==60)