久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11856|回復: 38
收起左側

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

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

單片機源程序如下:
  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, 下載次數: 252)

評分

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

查看全部評分

回復

使用道具 舉報

ID:512569 發表于 2019-4-15 13:09 | 顯示全部樓層
感覺挺不錯的,謝謝樓主。
回復

使用道具 舉報

ID:491506 發表于 2019-4-16 09:02 | 顯示全部樓層
厲害厲害
回復

使用道具 舉報

ID:553778 發表于 2019-6-6 14:56 | 顯示全部樓層
謝謝兄弟,解我燃眉之急!!!!
回復

使用道具 舉報

ID:558331 發表于 2019-6-9 17:37 | 顯示全部樓層
感謝樓主,強&#128077;
回復

使用道具 舉報

ID:563854 發表于 2019-6-16 21:47 | 顯示全部樓層
為啥我下的protues模擬液晶屏只亮不顯示字
回復

使用道具 舉報

ID:564279 發表于 2019-6-17 10:31 | 顯示全部樓層
感覺很不錯呀
回復

使用道具 舉報

ID:404722 發表于 2019-8-5 17:58 | 顯示全部樓層
kkyy1996 發表于 2019-6-16 21:47
為啥我下的protues模擬液晶屏只亮不顯示字

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

使用道具 舉報

ID:59830 發表于 2020-1-8 16:25 | 顯示全部樓層
想看看上邊資料
回復

使用道具 舉報

ID:337609 發表于 2020-3-14 01:40 | 顯示全部樓層
#那個LCD上的000是怎么回事,一直顯示,能去掉么?#
回復

使用道具 舉報

ID:700721 發表于 2020-3-15 09:49 | 顯示全部樓層
很強,幫到我了,解決了燃眉之急
回復

使用道具 舉報

ID:695233 發表于 2020-3-15 12:50 | 顯示全部樓層
下來試試 感謝感謝
回復

使用道具 舉報

ID:709387 發表于 2020-3-16 13:24 | 顯示全部樓層
大佬666,感謝分享
回復

使用道具 舉報

ID:710674 發表于 2020-3-18 11:06 | 顯示全部樓層
特別好
回復

使用道具 舉報

ID:710782 發表于 2020-3-19 13:37 | 顯示全部樓層
感謝樓主的分享,下載試試,學習一下
回復

使用道具 舉報

ID:711775 發表于 2020-3-20 14:41 | 顯示全部樓層
很有用的資料貼,謝謝樓主的分享
回復

使用道具 舉報

ID:713950 發表于 2020-3-23 12:22 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:701852 發表于 2020-3-29 21:00 | 顯示全部樓層
液晶上的000、186怎么去掉?
回復

使用道具 舉報

ID:359923 發表于 2020-4-25 16:04 | 顯示全部樓層
很棒,學到很多
回復

使用道具 舉報

ID:656632 發表于 2020-4-29 21:05 | 顯示全部樓層
樓主,你這里按鍵觸發為什么要使用中斷觸發呢?
回復

使用道具 舉報

ID:656632 發表于 2020-4-29 21:08 | 顯示全部樓層
相比于使用其它引腳作為普通按鍵有什么優勢呢
回復

使用道具 舉報

ID:742667 發表于 2020-5-2 10:32 | 顯示全部樓層
仿真錯誤。請問樓主。.dll文件是要加到哪里去?
回復

使用道具 舉報

ID:828823 發表于 2020-10-12 16:38 | 顯示全部樓層
.dll文件在哪?
回復

使用道具 舉報

ID:828164 發表于 2020-10-31 21:46 | 顯示全部樓層
謝謝樓主分享,太強了
回復

使用道具 舉報

ID:305762 發表于 2021-2-27 15:41 | 顯示全部樓層
挺不錯的,謝謝樓主
回復

使用道具 舉報

ID:887411 發表于 2021-3-1 18:46 | 顯示全部樓層
為什么我下的文件protues是空白的,什么都沒有
回復

使用道具 舉報

ID:328014 發表于 2021-3-1 20:54 | 顯示全部樓層
LCD128634 發表于 2021-3-1 18:46
為什么我下的文件protues是空白的,什么都沒有

你要用Proteus7.5打開,你看我打開了
51hei.png
回復

使用道具 舉報

ID:887411 發表于 2021-3-2 14:54 | 顯示全部樓層
能問一下你的各個模塊是怎么設計的嗎?比如液晶顯示器模塊和開關模塊
回復

使用道具 舉報

ID:890506 發表于 2021-3-10 19:54 | 顯示全部樓層
感謝大佬 太強了
回復

使用道具 舉報

ID:899053 發表于 2021-4-8 08:12 來自手機 | 顯示全部樓層
最后顯示結果的程序是哪一段
回復

使用道具 舉報

ID:918455 發表于 2021-11-13 12:10 | 顯示全部樓層
Kansa 發表于 2019-8-5 17:58
不知道啊,是不是你沒有加那個.dll的擴展程序

怎么加進去呢?
回復

使用道具 舉報

ID:1018426 發表于 2022-4-16 17:21 | 顯示全部樓層
我要是這么厲害就好了
回復

使用道具 舉報

ID:1093453 發表于 2023-9-13 18:41 | 顯示全部樓層

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

使用道具 舉報

ID:1100533 發表于 2023-11-20 19:35 | 顯示全部樓層
太棒了,很有幫助
回復

使用道具 舉報

ID:92810 發表于 2024-2-26 21:00 | 顯示全部樓層
感覺挺不錯的,謝謝樓主。
回復

使用道具 舉報

ID:1069806 發表于 2024-5-10 16:39 | 顯示全部樓層
試試自己玩玩  
回復

使用道具 舉報

ID:1120970 發表于 2024-5-16 09:38 | 顯示全部樓層
樓主有沒有1602液晶顯示智能溫控風扇的啊?研究了兩天了不成功啊T-T,哭了真的
回復

使用道具 舉報

ID:1132273 發表于 2024-9-20 16:10 | 顯示全部樓層
看起來挺有意思的,很有趣啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕乱码视频32 | 性欧美精品一区二区三区在线播放 | 午夜精品久久久久久久久久久久 | 久久精品久久精品久久精品 | av免费在线播放 | 欧美成人a | 伊人网站| 日日干夜夜操天天操 | 亚洲国产精品久久久久秋霞不卡 | 国产精品一区久久久 | 精品综合久久久 | 91九色麻豆| 一区二区中文字幕 | 国产一区二区三区四区三区四 | 久久久久国产精品一区二区 | 亚洲视频中文字幕 | 毛片免费视频 | 色综合天天天天做夜夜夜夜做 | 逼逼视频| 超碰97免费观看 | 狠狠ri| 国产片侵犯亲女视频播放 | 成人免费一区二区 | 国产精品www | 久久久久一区二区 | 精品一区二区视频 | 欧美一区二区三区在线播放 | 一区二区三区精品 | 国产精品一区二区无线 | 久久99精品国产麻豆婷婷 | 日本三级电影在线免费观看 | 亚洲精品日韩在线 | 久久久婷婷 | 国产激情免费视频 | 欧美三级三级三级爽爽爽 | 国产精品99久久久久久宅男 | 日韩在线h | 欧美日韩视频网站 | 久久久免费在线观看 | 亚洲国产精品美女 | 桃花av在线|