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

標題: 51單片機仿真搖號抽獎機源程序 12864液晶顯示 [打印本頁]

作者: Kansa    時間: 2019-2-1 22:09
標題: 51單片機仿真搖號抽獎機源程序 12864液晶顯示
單片機連接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, 下載次數: 252)




作者: hodonishiki    時間: 2019-4-15 13:09
感覺挺不錯的,謝謝樓主。
作者: 宏宏宏1    時間: 2019-4-16 09:02
厲害厲害
作者: xiehua    時間: 2019-6-6 14:56
謝謝兄弟,解我燃眉之急!!!!
作者: 1464672157    時間: 2019-6-9 17:37
感謝樓主,強&#128077;
作者: kkyy1996    時間: 2019-6-16 21:47
為啥我下的protues模擬液晶屏只亮不顯示字
作者: 一夢盡    時間: 2019-6-17 10:31
感覺很不錯呀
作者: Kansa    時間: 2019-8-5 17:58
kkyy1996 發表于 2019-6-16 21:47
為啥我下的protues模擬液晶屏只亮不顯示字

不知道啊,是不是你沒有加那個.dll的擴展程序
作者: yygdzjs    時間: 2020-1-8 16:25
想看看上邊資料
作者: 984055    時間: 2020-3-14 01:40
#那個LCD上的000是怎么回事,一直顯示,能去掉么?#
作者: PEPSI苦影    時間: 2020-3-15 09:49
很強,幫到我了,解決了燃眉之急
作者: pluto^n    時間: 2020-3-15 12:50
下來試試 感謝感謝
作者: wjm926    時間: 2020-3-16 13:24
大佬666,感謝分享
作者: 清歡堵    時間: 2020-3-18 11:06
特別好
作者: shuxue    時間: 2020-3-19 13:37
感謝樓主的分享,下載試試,學習一下
作者: 1308930976    時間: 2020-3-20 14:41
很有用的資料貼,謝謝樓主的分享
作者: AT89C51學習    時間: 2020-3-23 12:22
感謝樓主分享
作者: 13487086265    時間: 2020-3-29 21:00
液晶上的000、186怎么去掉?
作者: kurosawayuki    時間: 2020-4-25 16:04
很棒,學到很多
作者: liuhong213218    時間: 2020-4-29 21:05
樓主,你這里按鍵觸發為什么要使用中斷觸發呢?
作者: liuhong213218    時間: 2020-4-29 21:08
相比于使用其它引腳作為普通按鍵有什么優勢呢
作者: 阿迪H    時間: 2020-5-2 10:32
仿真錯誤。請問樓主。.dll文件是要加到哪里去?
作者: 楊忻楠    時間: 2020-10-12 16:38
.dll文件在哪?
作者: ly132806    時間: 2020-10-31 21:46
謝謝樓主分享,太強了
作者: 單片機mcu    時間: 2021-2-27 15:41
挺不錯的,謝謝樓主
作者: LCD128634    時間: 2021-3-1 18:46
為什么我下的文件protues是空白的,什么都沒有
作者: 51hei團團    時間: 2021-3-1 20:54
LCD128634 發表于 2021-3-1 18:46
為什么我下的文件protues是空白的,什么都沒有

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

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

51hei.png

作者: LCD128634    時間: 2021-3-2 14:54
能問一下你的各個模塊是怎么設計的嗎?比如液晶顯示器模塊和開關模塊
作者: 1441420751    時間: 2021-3-10 19:54
感謝大佬 太強了
作者: qweqwa    時間: 2021-4-8 08:12
最后顯示結果的程序是哪一段
作者: 陽天獄    時間: 2021-11-13 12:10
Kansa 發表于 2019-8-5 17:58
不知道啊,是不是你沒有加那個.dll的擴展程序

怎么加進去呢?
作者: 林信遼    時間: 2022-4-16 17:21
我要是這么厲害就好了
作者: figjdkfgdfkgdfg    時間: 2023-9-13 18:41

感謝樓主的分享,下載試試,學習一下
作者: nanalee    時間: 2023-11-20 19:35
太棒了,很有幫助
作者: gemxie    時間: 2024-2-26 21:00
感覺挺不錯的,謝謝樓主。
作者: kimchen009    時間: 2024-5-10 16:39
試試自己玩玩  
作者: 加油努力168    時間: 2024-5-16 09:38
樓主有沒有1602液晶顯示智能溫控風扇的啊?研究了兩天了不成功啊T-T,哭了真的
作者: 3232090712202    時間: 2024-9-20 16:10
看起來挺有意思的,很有趣啊
作者: yujingpiaomiao    時間: 2025-4-17 08:14
感謝樓主的分享




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www.久久久 | 欧美xxxx在线| 亚洲一区二区视频 | 国产精品成人一区 | 亚洲一区二区精品视频 | 欧美色综合一区二区三区 | 99re| 欧美黄色性生活视频 | 中文字幕av一区 | 久久不卡| 成人国产午夜在线观看 | 日本精品视频一区二区 | 免费一区二区三区 | 91久久国产综合久久 | 中文字幕一区在线观看视频 | 在线成人免费视频 | 久久国内精品 | 久久久久国产精品人 | 99精品久久久国产一区二区三 | 日本不卡一区二区三区 | 日韩一区二区黄色片 | 一区二区三区中文字幕 | 免费看黄色片 | 国产中文在线观看 | 久久99久久| 艹逼网 | 亚洲一区视频在线 | 日韩成人精品在线 | 亚洲电影一区二区三区 | 一区二区三区亚洲精品国 | 国产精品久久国产精品 | 五月天天色 | 亚洲国产成人精品女人久久久 | 妖精视频一区二区三区 | 黑人中文字幕一区二区三区 | 亚洲一区二区中文字幕 | 九九久久国产 | 色久影院 | www久久久| 人人做人人澡人人爽欧美 | 九九热热九九 |