標(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ě)出程序。
0.png (147.21 KB, 下載次數(shù): 118)
下載附件
2019-2-1 22:06 上傳
0.png (44.85 KB, 下載次數(shù): 122)
下載附件
2019-2-2 02:46 上傳
單片機(jī)源程序如下:
- /*******************************************************************/
- /* LCD型號(hào):TS12864A-3(帶漢字庫(kù))或兼容型號(hào) 控制器ST7920 */
- /* MCU:STC89S52 ,晶體頻率:11.0592MHz */
- /*******************************************************************/
- #include <reg51.h>
- #include <intrins.h>
- #include<ctype.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //延時(shí)4us
- #define uchar unsigned char
- #define uint unsigned int
- /*12864端口定義*/
- #define LCD_data P0 //數(shù)據(jù)口
- sbit LCD_RS = P3^5; //寄存器選擇輸入
- sbit LCD_RW = P3^6; //液晶讀/寫(xiě)控制
- sbit LCD_EN = P3^4; //液晶使能控制
- sbit LCD_PSB = P3^7; //串/并方式控制
- uint t=0;
- uchar num=0;
- uchar t_flag=0;
- uchar a_flag=0;
- uchar end_flag=0;
- uchar code dis[][17]={"祝你好運(yùn)!","開(kāi)始抽獎(jiǎng)","恭喜你獲得:"};
- uchar code award[][17]={"特等獎(jiǎng)","1等獎(jiǎng)","2等獎(jiǎng)","3等獎(jiǎng)","謝謝參與"};
- uchar code time[][17]={"3","2","1"};
- void delay(int ms) // 毫秒延時(shí)函數(shù)
- {
- while(ms--)
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- _nop_(); //空操作,耗時(shí)1個(gè)指令周期,晶振12MHz時(shí),耗時(shí)1us
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*******************************************************************/
- /*檢查L(zhǎng)CD忙狀態(tài) */
- /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫(xiě)指令與數(shù)據(jù)。 */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP(); //延時(shí)4us
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /*寫(xiě)指令數(shù)據(jù)到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /*******************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /*寫(xiě)顯示數(shù)據(jù)到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
- /*******************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- //寫(xiě)字符串
- void lcd_wstr(uchar* dat)
- {
- uchar i=0;
- while(dat[i] != '\0'&&i<16)
- { //顯示字符
- lcd_wdat(dat[i]);
- i++;
- }
- }
- /*******************************************************************/
- /* LCD初始化設(shè)定 */
- /*******************************************************************/
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
-
- // lcd_wcmd(0x34); //擴(kuò)充指令操作
- // delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //顯示開(kāi),關(guān)光標(biāo)
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
- delay(5);
- }
- /*********************************************************/
- /* 設(shè)定顯示位置 */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- lcd_wcmd(pos); //顯示地址
- }
- //中斷初始化
- void interrupt_init()
- {
- EA=1;/*開(kāi)全局中斷*/
- EX0=1;/*允許INT0中斷*/
- IT0=1;/*設(shè)置外部中斷觸發(fā)方式:下降沿觸發(fā)*/
- TMOD=0x11;
- ET0=1;
- ET1=1;
- TR0=0;
- TR1=0;
- TH0=15535/256; //計(jì)時(shí)50ms
- TL0=15535%256;
- TH1=55535/256; //計(jì)時(shí)10ms
- TL1=55535%256;
- }
- /*********************************************************/
- /* 主程序 */
- /*********************************************************/
- void main()
- {
- uchar str[17]=" ";
- interrupt_init();
- delay(10); //延時(shí)
- lcd_init(); //初始化LCD
- lcd_pos(1,4-strlen(dis[0])/4); //設(shè)置顯示位置為第二行的第1個(gè)字符
- lcd_wstr(dis[0]); //顯示字符
- while(1)
- {
-
- delay(50);
- if(t_flag==1)
- {
- t_flag=0;
- lcd_pos(2,0);
- lcd_wstr(str);
- delay(5);
- lcd_pos(2,4-strlen(time[num])/4);
- lcd_wstr(time[num]);
- }
- else if(a_flag==1)
- {
- a_flag=0;
- lcd_wcmd(0x01);
- lcd_pos(2,4-strlen(award[num])/4);
- lcd_wstr(award[num]);
- if(end_flag==1)
- {
- end_flag=0;
- lcd_pos(0,4-strlen(dis[2])/4);
- lcd_wstr(dis[2]);
- }
- }
- delay(10);
- }
- }
- void EX_IT0() interrupt 0
- {
- lcd_wcmd(0x01);
- lcd_pos(1,4-strlen(dis[1])/4); //設(shè)置顯示位置為第二行的第1個(gè)字符
- lcd_wstr(dis[1]); //顯示字符
- TH0=15535/256; //計(jì)時(shí)50ms
- TL0=15535%256;
- TR0=1;
- num=2;
- }
- void ET_IT0() interrupt 1
- {
- TH0=15535/256; //計(jì)時(shí)50ms
- TL0=15535%256;
- t++;
- if(t%20==0)
- {
- t_flag=1;
- num=(num+1)%3;
- if(t==60)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
搖號(hào)抽獎(jiǎng)機(jī).zip
(395.29 KB, 下載次數(shù): 252)
2019-2-1 22:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 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)👍
作者: 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
不知道啊,是不是你沒(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
你要用Proteus7.5打開(kāi),你看我打開(kāi)了
-
51hei.png
(19.56 KB, 下載次數(shù): 104)
下載附件
2021-3-1 20:54 上傳
作者: 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
怎么加進(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 |