找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12078|回復: 39
打印 上一主題 下一主題
收起左側

51單片機仿真搖號抽獎機源程序 12864液晶顯示

  [復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:404722 發(fā)表于 2019-2-1 22:09 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機連接12864(st7920)液晶顯示器和1個按鍵接INT0,模擬一個抽獎機。
實現(xiàn)效果:
1、液晶初始顯示“祝你好運!”;
2、按一下按鍵,液晶顯示“開始抽獎”,然后顯示“3-2-1”倒計時后,產(chǎn)生20個(0-4之間的)隨機數(shù);
3、液晶屏幕根據(jù)隨機數(shù)顯示“特等獎”、“1等獎”、“2等獎”、“3等獎”、“謝謝參與";
4、最后液晶屏顯示抽獎結果:“恭喜你獲得:XXX”。
5、再按一下按鍵,重新開始抽獎,液晶又顯示“開始抽獎”。。。。。。如此循環(huán)。
我們把抽獎過程中的不同狀態(tài)信息存儲在對應的數(shù)組里,利用定時器可以很方便簡潔寫出程序。


單片機源程序如下:
  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             //數(shù)據(jù)口
  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)         // 毫秒延時函數(shù)
  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忙狀態(tài)                                                    */
  44. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。      */
  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. /*寫指令數(shù)據(jù)到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. /*寫顯示數(shù)據(jù)到LCD                                                  */
  77. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  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的顯示內(nèi)容
  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;/*設置外部中斷觸發(fā)方式:下降沿觸發(fā)*/
  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, 下載次數(shù): 252)



評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂6 踩
回復

使用道具 舉報

沙發(fā)
ID:512569 發(fā)表于 2019-4-15 13:09 | 只看該作者
感覺挺不錯的,謝謝樓主。
回復

使用道具 舉報

板凳
ID:491506 發(fā)表于 2019-4-16 09:02 | 只看該作者
厲害厲害
回復

使用道具 舉報

地板
ID:553778 發(fā)表于 2019-6-6 14:56 | 只看該作者
謝謝兄弟,解我燃眉之急!。!
回復

使用道具 舉報

5#
ID:558331 發(fā)表于 2019-6-9 17:37 | 只看該作者
感謝樓主,強&#128077;
回復

使用道具 舉報

6#
ID:563854 發(fā)表于 2019-6-16 21:47 | 只看該作者
為啥我下的protues模擬液晶屏只亮不顯示字
回復

使用道具 舉報

7#
ID:564279 發(fā)表于 2019-6-17 10:31 | 只看該作者
感覺很不錯呀
回復

使用道具 舉報

8#
ID:404722 發(fā)表于 2019-8-5 17:58 | 只看該作者
kkyy1996 發(fā)表于 2019-6-16 21:47
為啥我下的protues模擬液晶屏只亮不顯示字

不知道啊,是不是你沒有加那個.dll的擴展程序
回復

使用道具 舉報

9#
ID:59830 發(fā)表于 2020-1-8 16:25 | 只看該作者
想看看上邊資料
回復

使用道具 舉報

10#
ID:337609 發(fā)表于 2020-3-14 01:40 | 只看該作者
#那個LCD上的000是怎么回事,一直顯示,能去掉么?#
回復

使用道具 舉報

11#
ID:700721 發(fā)表于 2020-3-15 09:49 | 只看該作者
很強,幫到我了,解決了燃眉之急
回復

使用道具 舉報

12#
ID:695233 發(fā)表于 2020-3-15 12:50 | 只看該作者
下來試試 感謝感謝
回復

使用道具 舉報

13#
ID:709387 發(fā)表于 2020-3-16 13:24 | 只看該作者
大佬666,感謝分享
回復

使用道具 舉報

14#
ID:710674 發(fā)表于 2020-3-18 11:06 | 只看該作者
特別好
回復

使用道具 舉報

15#
ID:710782 發(fā)表于 2020-3-19 13:37 | 只看該作者
感謝樓主的分享,下載試試,學習一下
回復

使用道具 舉報

16#
ID:711775 發(fā)表于 2020-3-20 14:41 | 只看該作者
很有用的資料貼,謝謝樓主的分享
回復

使用道具 舉報

17#
ID:713950 發(fā)表于 2020-3-23 12:22 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

18#
ID:701852 發(fā)表于 2020-3-29 21:00 | 只看該作者
液晶上的000、186怎么去掉?
回復

使用道具 舉報

19#
ID:359923 發(fā)表于 2020-4-25 16:04 | 只看該作者
很棒,學到很多
回復

使用道具 舉報

20#
ID:656632 發(fā)表于 2020-4-29 21:05 | 只看該作者
樓主,你這里按鍵觸發(fā)為什么要使用中斷觸發(fā)呢?
回復

使用道具 舉報

21#
ID:656632 發(fā)表于 2020-4-29 21:08 | 只看該作者
相比于使用其它引腳作為普通按鍵有什么優(yōu)勢呢
回復

使用道具 舉報

22#
ID:742667 發(fā)表于 2020-5-2 10:32 | 只看該作者
仿真錯誤。請問樓主。.dll文件是要加到哪里去?
回復

使用道具 舉報

23#
ID:828823 發(fā)表于 2020-10-12 16:38 | 只看該作者
.dll文件在哪?
回復

使用道具 舉報

24#
ID:828164 發(fā)表于 2020-10-31 21:46 | 只看該作者
謝謝樓主分享,太強了
回復

使用道具 舉報

25#
ID:305762 發(fā)表于 2021-2-27 15:41 | 只看該作者
挺不錯的,謝謝樓主
回復

使用道具 舉報

26#
ID:887411 發(fā)表于 2021-3-1 18:46 | 只看該作者
為什么我下的文件protues是空白的,什么都沒有
回復

使用道具 舉報

27#
ID:328014 發(fā)表于 2021-3-1 20:54 | 只看該作者
LCD128634 發(fā)表于 2021-3-1 18:46
為什么我下的文件protues是空白的,什么都沒有

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

51hei.png (19.56 KB, 下載次數(shù): 104)

51hei.png
回復

使用道具 舉報

28#
ID:887411 發(fā)表于 2021-3-2 14:54 | 只看該作者
能問一下你的各個模塊是怎么設計的嗎?比如液晶顯示器模塊和開關模塊
回復

使用道具 舉報

29#
ID:890506 發(fā)表于 2021-3-10 19:54 | 只看該作者
感謝大佬 太強了
回復

使用道具 舉報

30#
ID:899053 發(fā)表于 2021-4-8 08:12 來自手機 | 只看該作者
最后顯示結果的程序是哪一段
回復

使用道具 舉報

31#
ID:918455 發(fā)表于 2021-11-13 12:10 | 只看該作者
Kansa 發(fā)表于 2019-8-5 17:58
不知道啊,是不是你沒有加那個.dll的擴展程序

怎么加進去呢?
回復

使用道具 舉報

32#
ID:1018426 發(fā)表于 2022-4-16 17:21 | 只看該作者
我要是這么厲害就好了
回復

使用道具 舉報

33#
ID:1093453 發(fā)表于 2023-9-13 18:41 | 只看該作者

感謝樓主的分享,下載試試,學習一下
回復

使用道具 舉報

34#
ID:1100533 發(fā)表于 2023-11-20 19:35 | 只看該作者
太棒了,很有幫助
回復

使用道具 舉報

35#
ID:92810 發(fā)表于 2024-2-26 21:00 | 只看該作者
感覺挺不錯的,謝謝樓主。
回復

使用道具 舉報

36#
ID:1069806 發(fā)表于 2024-5-10 16:39 | 只看該作者
試試自己玩玩  
回復

使用道具 舉報

37#
ID:1120970 發(fā)表于 2024-5-16 09:38 | 只看該作者
樓主有沒有1602液晶顯示智能溫控風扇的。垦芯苛藘商炝瞬怀晒Π-T,哭了真的
回復

使用道具 舉報

38#
ID:1132273 發(fā)表于 2024-9-20 16:10 | 只看該作者
看起來挺有意思的,很有趣啊
回復

使用道具 舉報

39#
ID:1148235 發(fā)表于 2025-4-17 08:14 | 只看該作者
感謝樓主的分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表