当前位置: 首页 > article >正文

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

资料下载地址:51单片机仿真摇号抽奖机源程序12864液晶显示仿真+程序

一、功能介绍

单片机连接12864(st7920)液晶显示器和1个按键接INT0,模拟一个抽奖机。
实现效果:
1、液晶初始显示“祝你好运!”;
2、按一下按键,液晶显示“开始抽奖”,然后显示“3-2-1”倒计时后,产生20个(0-4之间的)随机数;
3、液晶屏幕根据随机数显示“特等奖”、“1等奖”、“2等奖”、“3等奖”、“谢谢参与";
4、最后液晶屏显示抽奖结果:“恭喜你获得:XXX”。
5、再按一下按键,重新开始抽奖,液晶又显示“开始抽奖”。。。。。。如此循环。

二、仿真图片

三、程序

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)


http://www.kler.cn/a/449788.html

相关文章:

  • webrtc音频模块(三) windows Core Audio API及声音的播放
  • v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。
  • springboot481基于springboot社区老人健康信息管理系统(论文+源码)_kaic
  • Docker搭建kafka环境
  • Linux快速入门-Linux文件系统管理
  • 基于Spring Boot的九州美食城商户一体化系统
  • Flink集群批作业实践:七析BI批作业执行
  • 【源码阅读系列】(六) Android 中的进程和线程
  • kubevirt网络
  • Jmeter测试脚本编写技巧
  • 从零开始学前端之HTML(三)
  • 咸虾米壁纸微信小程序下载图片到相册saveImageToPhotosAlbum功能修改
  • PLSQL 客户端连接 Oracle 数据库配置
  • 算法day_3数组中的单一元素和二进制位颠倒
  • autMan奥特曼机器人-相关命令
  • 【漏洞复现】F5 BIG-IP Next Central Manager SQL注入漏洞(CVE-2024-26026)
  • (10)YOLOv8算法基本原理
  • EasyPlayer.js播放器在React项目中应如何使用?
  • Jenkins Api Token 访问问题
  • MySQL 数据备份与恢复详解
  • 压缩为zip和gzip工具类
  • MySQL快速扫描
  • ios按键精灵脚本开发:ios悬浮窗命令
  • PHP中替换某个包或某个类
  • Linux 软硬链接详解:深入理解与实践
  • Ubuntu下ESP32-IDF开发环境搭建