51单片机仿真摇号抽奖机源程序 12864液晶显示

资料下载地址: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)
相关推荐
wenchm1 小时前
细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV
stm32·单片机·嵌入式硬件
委员1 小时前
基于NodeMCU的物联网电灯控制系统设计
单片机·物联网·嵌入式·nodemcu··lu_asr01·gy-302
北国无红豆1 小时前
【CAN总线】STM32的CAN外设
c语言·stm32·嵌入式硬件
单片机学习之路1 小时前
【C语言】结构
c语言·开发语言·stm32·单片机·51单片机
m0_748254093 小时前
STM32--超声波模块(HC—SR04)(标准库+HAL库)
stm32·单片机·嵌入式硬件
南城花随雪。3 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
逝灮3 小时前
【蓝桥杯——物联网设计与开发】基础模块8 - RTC
stm32·单片机·嵌入式硬件·mcu·物联网·蓝桥杯·rtc
LXL_244 小时前
模拟——郑益慧_笔记1_绪论
嵌入式硬件
weixin_452600699 小时前
串行时钟保持芯片D1380/D1381,低功耗工作方式自带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节
科技·单片机·嵌入式硬件·时钟·白色家电电源·微机串行时钟