找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8147|回复: 35
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
单片机连接12864(st7920)液晶显示器和1个按键接INT0,模拟一个抽奖机。
实现效果:
1、液晶初始显示“祝你好运!”;
2、按一下按键,液晶显示“开始抽奖”,然后显示“3-2-1”倒计时后,产生20个(0-4之间的)随机数;
3、液晶屏幕根据随机数显示“特等奖”、“1等奖”、“2等奖”、“3等奖”、“谢谢参与";
4、最后液晶屏显示抽奖结果:“恭喜你获得:XXX”。
5、再按一下按键,重新开始抽奖,液晶又显示“开始抽奖”。。。。。。如此循环。
我们把抽奖过程中的不同状态信息存储在对应的数组里,利用定时器可以很方便简洁写出程序。


单片机源程序如下:
  1. /*******************************************************************/
  2. /*  LCD型号:TS12864A-3(带汉字库)或兼容型号    控制器ST7920      */
  3. /*  MCU:STC89S52 ,晶体频率:11.0592MHz                             */
  4. /*******************************************************************/

  5. #include <reg51.h>
  6. #include <intrins.h>
  7. #include<ctype.h>
  8. #include<stdlib.h>
  9. #include<stdio.h>
  10. #include<string.h>
  11. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};           //延时4us       
  12. #define uchar unsigned char
  13. #define uint  unsigned int
  14. /*12864端口定义*/
  15. #define LCD_data  P0             //数据口
  16. sbit LCD_RS  =  P3^5;            //寄存器选择输入
  17. sbit LCD_RW  =  P3^6;            //液晶读/写控制
  18. sbit LCD_EN  =  P3^4;            //液晶使能控制
  19. sbit LCD_PSB =  P3^7;            //串/并方式控制
  20. uint t=0;
  21. uchar num=0;
  22. uchar t_flag=0;
  23. uchar a_flag=0;
  24. uchar end_flag=0;
  25. uchar code dis[][17]={"祝你好运!","开始抽奖","恭喜你获得:"};
  26. uchar code award[][17]={"特等奖","1等奖","2等奖","3等奖","谢谢参与"};
  27. uchar code time[][17]={"3","2","1"};
  28. void delay(int ms)         // 毫秒延时函数
  29. {
  30.     while(ms--)
  31.         {
  32.       uchar i;
  33.           for(i=0;i<250;i++)  
  34.            {
  35.             _nop_();        //空操作,耗时1个指令周期,晶振12MHz时,耗时1us                  
  36.                 _nop_();
  37.                 _nop_();
  38.                 _nop_();
  39.            }
  40.         }
  41. }               
  42. /*******************************************************************/
  43. /*检查LCD忙状态                                                    */
  44. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  45. /*******************************************************************/
  46. bit lcd_busy()
  47. {                          
  48.     bit result;
  49.     LCD_RS = 0;
  50.     LCD_RW = 1;
  51.     LCD_EN = 1;
  52.     delayNOP();         //延时4us
  53.     result = (bit)(P0&0x80);
  54.     LCD_EN = 0;
  55.     return(result);
  56. }
  57. /*******************************************************************/
  58. /*写指令数据到LCD                                                  */
  59. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  60. /*******************************************************************/
  61. void lcd_wcmd(uchar cmd)
  62. {                          
  63.    while(lcd_busy());
  64.     LCD_RS = 0;
  65.     LCD_RW = 0;
  66.     LCD_EN = 0;
  67.     _nop_();
  68.     _nop_();
  69.     P0 = cmd;
  70.     delayNOP();
  71.     LCD_EN = 1;
  72.     delayNOP();
  73.     LCD_EN = 0;  
  74. }
  75. /*******************************************************************/
  76. /*写显示数据到LCD                                                  */
  77. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  78. /*******************************************************************/
  79. void lcd_wdat(uchar dat)
  80. {                          
  81.    while(lcd_busy());
  82.     LCD_RS = 1;
  83.     LCD_RW = 0;
  84.     LCD_EN = 0;
  85.     P0 = dat;
  86.     delayNOP();
  87.     LCD_EN = 1;
  88.     delayNOP();
  89.     LCD_EN = 0;
  90. }
  91. //写字符串
  92. void lcd_wstr(uchar* dat)
  93. {   
  94.         uchar i=0;                     
  95.     while(dat[i] != '\0'&&i<16)
  96.     {                         //显示字符
  97.       lcd_wdat(dat[i]);
  98.       i++;
  99.     }
  100. }
  101. /*******************************************************************/
  102. /*  LCD初始化设定                                                  */
  103. /*******************************************************************/
  104. void lcd_init()
  105. {

  106.     LCD_PSB = 1;         //并口方式
  107.    
  108. //  lcd_wcmd(0x34);      //扩充指令操作
  109. //  delay(5);
  110.     lcd_wcmd(0x30);      //基本指令操作
  111.     delay(5);
  112.     lcd_wcmd(0x0C);      //显示开,关光标
  113.     delay(5);
  114.     lcd_wcmd(0x01);      //清除LCD的显示内容
  115.     delay(5);
  116. }
  117. /*********************************************************/
  118. /* 设定显示位置                                          */
  119. /*********************************************************/
  120. void lcd_pos(uchar X,uchar Y)
  121. {                          
  122.    uchar  pos;
  123.    if (X==0)
  124.      {X=0x80;}
  125.    else if (X==1)
  126.      {X=0x90;}
  127.    else if (X==2)
  128.      {X=0x88;}
  129.    else if (X==3)
  130.      {X=0x98;}
  131.    pos = X+Y ;  
  132.    lcd_wcmd(pos);     //显示地址
  133. }
  134. //中断初始化
  135. void interrupt_init()
  136. {
  137.         EA=1;/*开全局中断*/
  138.         EX0=1;/*允许INT0中断*/
  139.         IT0=1;/*设置外部中断触发方式:下降沿触发*/
  140.         TMOD=0x11;
  141.         ET0=1;
  142.         ET1=1;
  143.         TR0=0;
  144.         TR1=0;
  145.         TH0=15535/256; //计时50ms
  146.         TL0=15535%256;
  147.         TH1=55535/256; //计时10ms
  148.         TL1=55535%256;       
  149. }
  150. /*********************************************************/
  151. /* 主程序                                                                                    */
  152. /*********************************************************/
  153. void  main()
  154. {       
  155.         uchar str[17]="        ";
  156.         interrupt_init();
  157.     delay(10);                 //延时
  158.     lcd_init();                //初始化LCD            
  159.           lcd_pos(1,4-strlen(dis[0])/4);            //设置显示位置为第二行的第1个字符
  160.     lcd_wstr(dis[0]);      //显示字符

  161.         while(1)
  162.         {
  163.                
  164.                 delay(50);
  165.                 if(t_flag==1)
  166.                 {
  167.                         t_flag=0;
  168.                         lcd_pos(2,0);
  169.                         lcd_wstr(str);      
  170.                         delay(5);
  171.                         lcd_pos(2,4-strlen(time[num])/4);
  172.                         lcd_wstr(time[num]);
  173.                 }
  174.             else if(a_flag==1)
  175.                 {
  176.                         a_flag=0;
  177.                         lcd_wcmd(0x01);
  178.                         lcd_pos(2,4-strlen(award[num])/4);
  179.                         lcd_wstr(award[num]);
  180.                         if(end_flag==1)
  181.                         {
  182.                                 end_flag=0;
  183.                                 lcd_pos(0,4-strlen(dis[2])/4);
  184.                                 lcd_wstr(dis[2]);
  185.                         }
  186.                 }
  187.                 delay(10);
  188.         }
  189. }
  190. void EX_IT0() interrupt 0
  191. {
  192.         lcd_wcmd(0x01);
  193.         lcd_pos(1,4-strlen(dis[1])/4);            //设置显示位置为第二行的第1个字符
  194.     lcd_wstr(dis[1]);      //显示字符
  195.         TH0=15535/256; //计时50ms
  196.         TL0=15535%256;
  197.         TR0=1;
  198.         num=2;       
  199. }
  200. void ET_IT0() interrupt 1
  201. {
  202.         TH0=15535/256; //计时50ms
  203.         TL0=15535%256;                                                                                                       
  204.         t++;
  205.         if(t%20==0)
  206.         {
  207.                 t_flag=1;
  208.                 num=(num+1)%3;
  209.                 if(t==60)
  210. ……………………

  211. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
摇号抽奖机.zip (395.29 KB, 下载次数: 240)



评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶5 踩
回复

使用道具 举报

沙发
ID:512569 发表于 2019-4-15 13:09 | 只看该作者
感觉挺不错的,谢谢楼主。
回复

使用道具 举报

板凳
ID:491506 发表于 2019-4-16 09:02 | 只看该作者
厉害厉害
回复

使用道具 举报

地板
ID:553778 发表于 2019-6-6 14:56 | 只看该作者
谢谢兄弟,解我燃眉之急!!!!
回复

使用道具 举报

5#
ID:558331 发表于 2019-6-9 17:37 | 只看该作者
感谢楼主,强&#128077;
回复

使用道具 举报

6#
ID:563854 发表于 2019-6-16 21:47 | 只看该作者
为啥我下的protues模拟液晶屏只亮不显示字
回复

使用道具 举报

7#
ID:564279 发表于 2019-6-17 10:31 | 只看该作者
感觉很不错呀
回复

使用道具 举报

8#
ID:404722 发表于 2019-8-5 17:58 | 只看该作者
kkyy1996 发表于 2019-6-16 21:47
为啥我下的protues模拟液晶屏只亮不显示字

不知道啊,是不是你没有加那个.dll的扩展程序
回复

使用道具 举报

9#
ID:59830 发表于 2020-1-8 16:25 | 只看该作者
想看看上边资料
回复

使用道具 举报

10#
ID:337609 发表于 2020-3-14 01:40 | 只看该作者
#那个LCD上的000是怎么回事,一直显示,能去掉么?#
回复

使用道具 举报

11#
ID:700721 发表于 2020-3-15 09:49 | 只看该作者
很强,帮到我了,解决了燃眉之急
回复

使用道具 举报

12#
ID:695233 发表于 2020-3-15 12:50 | 只看该作者
下来试试 感谢感谢
回复

使用道具 举报

13#
ID:709387 发表于 2020-3-16 13:24 | 只看该作者
大佬666,感谢分享
回复

使用道具 举报

14#
ID:710674 发表于 2020-3-18 11:06 | 只看该作者
特别好
回复

使用道具 举报

15#
ID:710782 发表于 2020-3-19 13:37 | 只看该作者
感谢楼主的分享,下载试试,学习一下
回复

使用道具 举报

16#
ID:711775 发表于 2020-3-20 14:41 | 只看该作者
很有用的资料贴,谢谢楼主的分享
回复

使用道具 举报

17#
ID:713950 发表于 2020-3-23 12:22 | 只看该作者
感谢楼主分享
回复

使用道具 举报

18#
ID:701852 发表于 2020-3-29 21:00 | 只看该作者
液晶上的000、186怎么去掉?
回复

使用道具 举报

19#
ID:359923 发表于 2020-4-25 16:04 | 只看该作者
很棒,学到很多
回复

使用道具 举报

20#
ID:656632 发表于 2020-4-29 21:05 | 只看该作者
楼主,你这里按键触发为什么要使用中断触发呢?
回复

使用道具 举报

21#
ID:656632 发表于 2020-4-29 21:08 | 只看该作者
相比于使用其它引脚作为普通按键有什么优势呢
回复

使用道具 举报

22#
ID:742667 发表于 2020-5-2 10:32 | 只看该作者
仿真错误。请问楼主。.dll文件是要加到哪里去?
回复

使用道具 举报

23#
ID:828823 发表于 2020-10-12 16:38 | 只看该作者
.dll文件在哪?
回复

使用道具 举报

24#
ID:828164 发表于 2020-10-31 21:46 | 只看该作者
谢谢楼主分享,太强了
回复

使用道具 举报

25#
ID:305762 发表于 2021-2-27 15:41 | 只看该作者
挺不错的,谢谢楼主
回复

使用道具 举报

26#
ID:887411 发表于 2021-3-1 18:46 | 只看该作者
为什么我下的文件protues是空白的,什么都没有
回复

使用道具 举报

27#
ID:328014 发表于 2021-3-1 20:54 | 只看该作者
LCD128634 发表于 2021-3-1 18:46
为什么我下的文件protues是空白的,什么都没有

你要用Proteus7.5打开,你看我打开了

51hei.png (19.56 KB, 下载次数: 66)

51hei.png
回复

使用道具 举报

28#
ID:887411 发表于 2021-3-2 14:54 | 只看该作者
能问一下你的各个模块是怎么设计的吗?比如液晶显示器模块和开关模块
回复

使用道具 举报

29#
ID:890506 发表于 2021-3-10 19:54 | 只看该作者
感谢大佬 太强了
回复

使用道具 举报

30#
ID:899053 发表于 2021-4-8 08:12 来自手机 | 只看该作者
最后显示结果的程序是哪一段
回复

使用道具 举报

31#
ID:918455 发表于 2021-11-13 12:10 | 只看该作者
Kansa 发表于 2019-8-5 17:58
不知道啊,是不是你没有加那个.dll的扩展程序

怎么加进去呢?
回复

使用道具 举报

32#
ID:1018426 发表于 2022-4-16 17:21 | 只看该作者
我要是这么厉害就好了
回复

使用道具 举报

33#
ID:1093453 发表于 2023-9-13 18:41 | 只看该作者

感谢楼主的分享,下载试试,学习一下
回复

使用道具 举报

34#
ID:1100533 发表于 2023-11-20 19:35 | 只看该作者
太棒了,很有帮助
回复

使用道具 举报

35#
ID:92810 发表于 2024-2-26 21:00 | 只看该作者
感觉挺不错的,谢谢楼主。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表