欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī)仿真搖號(hào)抽獎(jiǎng)機(jī)源程序 12864液晶顯示 [打印本頁(yè)]

作者: Kansa    時(shí)間: 2019-2-1 22:09
標(biāo)題: 51單片機(jī)仿真搖號(hào)抽獎(jiǎng)機(jī)源程序 12864液晶顯示
單片機(jī)連接12864(st7920)液晶顯示器和1個(gè)按鍵接INT0,模擬一個(gè)抽獎(jiǎng)機(jī)。
實(shí)現(xiàn)效果:
1、液晶初始顯示“祝你好運(yùn)!”;
2、按一下按鍵,液晶顯示“開(kāi)始抽獎(jiǎng)”,然后顯示“3-2-1”倒計(jì)時(shí)后,產(chǎn)生20個(gè)(0-4之間的)隨機(jī)數(shù);
3、液晶屏幕根據(jù)隨機(jī)數(shù)顯示“特等獎(jiǎng)”、“1等獎(jiǎng)”、“2等獎(jiǎng)”、“3等獎(jiǎng)”、“謝謝參與";
4、最后液晶屏顯示抽獎(jiǎng)結(jié)果:“恭喜你獲得:XXX”。
5、再按一下按鍵,重新開(kāi)始抽獎(jiǎng),液晶又顯示“開(kāi)始抽獎(jiǎng)”。。。。。。如此循環(huán)。
我們把抽獎(jiǎng)過(guò)程中的不同狀態(tài)信息存儲(chǔ)在對(duì)應(yīng)的數(shù)組里,利用定時(shí)器可以很方便簡(jiǎn)潔寫(xiě)出程序。


單片機(jī)源程序如下:
  1. /*******************************************************************/
  2. /*  LCD型號(hào):TS12864A-3(帶漢字庫(kù))或兼容型號(hào)    控制器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_();};           //延時(shí)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;            //液晶讀/寫(xiě)控制
  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]={"祝你好運(yùn)!","開(kāi)始抽獎(jiǎng)","恭喜你獲得:"};
  26. uchar code award[][17]={"特等獎(jiǎng)","1等獎(jiǎng)","2等獎(jiǎng)","3等獎(jiǎng)","謝謝參與"};
  27. uchar code time[][17]={"3","2","1"};
  28. void delay(int ms)         // 毫秒延時(shí)函數(shù)
  29. {
  30.     while(ms--)
  31.         {
  32.       uchar i;
  33.           for(i=0;i<250;i++)  
  34.            {
  35.             _nop_();        //空操作,耗時(shí)1個(gè)指令周期,晶振12MHz時(shí),耗時(shí)1us                  
  36.                 _nop_();
  37.                 _nop_();
  38.                 _nop_();
  39.            }
  40.         }
  41. }               
  42. /*******************************************************************/
  43. /*檢查L(zhǎng)CD忙狀態(tài)                                                    */
  44. /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫(xiě)指令與數(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();         //延時(shí)4us
  53.     result = (bit)(P0&0x80);
  54.     LCD_EN = 0;
  55.     return(result);
  56. }
  57. /*******************************************************************/
  58. /*寫(xiě)指令數(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. /*寫(xiě)顯示數(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. //寫(xiě)字符串
  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初始化設(shè)定                                                  */
  103. /*******************************************************************/
  104. void lcd_init()
  105. {

  106.     LCD_PSB = 1;         //并口方式
  107.    
  108. //  lcd_wcmd(0x34);      //擴(kuò)充指令操作
  109. //  delay(5);
  110.     lcd_wcmd(0x30);      //基本指令操作
  111.     delay(5);
  112.     lcd_wcmd(0x0C);      //顯示開(kāi),關(guān)光標(biāo)
  113.     delay(5);
  114.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  115.     delay(5);
  116. }
  117. /*********************************************************/
  118. /* 設(shè)定顯示位置                                          */
  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;/*開(kāi)全局中斷*/
  138.         EX0=1;/*允許INT0中斷*/
  139.         IT0=1;/*設(shè)置外部中斷觸發(fā)方式:下降沿觸發(fā)*/
  140.         TMOD=0x11;
  141.         ET0=1;
  142.         ET1=1;
  143.         TR0=0;
  144.         TR1=0;
  145.         TH0=15535/256; //計(jì)時(shí)50ms
  146.         TL0=15535%256;
  147.         TH1=55535/256; //計(jì)時(shí)10ms
  148.         TL1=55535%256;       
  149. }
  150. /*********************************************************/
  151. /* 主程序                                                                                    */
  152. /*********************************************************/
  153. void  main()
  154. {       
  155.         uchar str[17]="        ";
  156.         interrupt_init();
  157.     delay(10);                 //延時(shí)
  158.     lcd_init();                //初始化LCD            
  159.           lcd_pos(1,4-strlen(dis[0])/4);            //設(shè)置顯示位置為第二行的第1個(gè)字符
  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);            //設(shè)置顯示位置為第二行的第1個(gè)字符
  194.     lcd_wstr(dis[1]);      //顯示字符
  195.         TH0=15535/256; //計(jì)時(shí)50ms
  196.         TL0=15535%256;
  197.         TR0=1;
  198.         num=2;       
  199. }
  200. void ET_IT0() interrupt 1
  201. {
  202.         TH0=15535/256; //計(jì)時(shí)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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
搖號(hào)抽獎(jiǎng)機(jī).zip (395.29 KB, 下載次數(shù): 252)




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

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

你要用Proteus7.5打開(kāi),你看我打開(kāi)了

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

51hei.png

作者: LCD128634    時(shí)間: 2021-3-2 14:54
能問(wèn)一下你的各個(gè)模塊是怎么設(shè)計(jì)的嗎?比如液晶顯示器模塊和開(kāi)關(guān)模塊
作者: 1441420751    時(shí)間: 2021-3-10 19:54
感謝大佬 太強(qiáng)了
作者: qweqwa    時(shí)間: 2021-4-8 08:12
最后顯示結(jié)果的程序是哪一段
作者: 陽(yáng)天獄    時(shí)間: 2021-11-13 12:10
Kansa 發(fā)表于 2019-8-5 17:58
不知道啊,是不是你沒(méi)有加那個(gè).dll的擴(kuò)展程序

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

感謝樓主的分享,下載試試,學(xué)習(xí)一下
作者: nanalee    時(shí)間: 2023-11-20 19:35
太棒了,很有幫助
作者: gemxie    時(shí)間: 2024-2-26 21:00
感覺(jué)挺不錯(cuò)的,謝謝樓主。
作者: kimchen009    時(shí)間: 2024-5-10 16:39
試試自己玩玩  
作者: 加油努力168    時(shí)間: 2024-5-16 09:38
樓主有沒(méi)有1602液晶顯示智能溫控風(fēng)扇的啊?研究了兩天了不成功啊T-T,哭了真的
作者: 3232090712202    時(shí)間: 2024-9-20 16:10
看起來(lái)挺有意思的,很有趣啊
作者: yujingpiaomiao    時(shí)間: 2025-4-17 08:14
感謝樓主的分享
作者: beau    時(shí)間: 2025-11-20 15:23
感謝樓主
作者: 天宇GG    時(shí)間: 2025-11-28 15:18
好資料,51黑有你更精彩!!!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1