標題: 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、再按一下按鍵,重新開始抽獎,液晶又顯示“開始抽獎”。。。。。。如此循環。
我們把抽獎過程中的不同狀態信息存儲在對應的數組里,利用定時器可以很方便簡潔寫出程序。
0.png (147.21 KB, 下載次數: 118)
下載附件
2019-2-1 22:06 上傳
0.png (44.85 KB, 下載次數: 122)
下載附件
2019-2-2 02:46 上傳
單片機源程序如下:
- /*******************************************************************/
- /* LCD型號:TS12864A-3(帶漢字庫)或兼容型號 控制器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_();}; //延時4us
- #define uchar unsigned char
- #define uint unsigned int
- /*12864端口定義*/
- #define LCD_data P0 //數據口
- sbit LCD_RS = P3^5; //寄存器選擇輸入
- sbit LCD_RW = P3^6; //液晶讀/寫控制
- 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]={"祝你好運!","開始抽獎","恭喜你獲得:"};
- uchar code award[][17]={"特等獎","1等獎","2等獎","3等獎","謝謝參與"};
- uchar code time[][17]={"3","2","1"};
- void delay(int ms) // 毫秒延時函數
- {
- while(ms--)
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- _nop_(); //空操作,耗時1個指令周期,晶振12MHz時,耗時1us
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*******************************************************************/
- /*檢查LCD忙狀態 */
- /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP(); //延時4us
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /*寫指令數據到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;
- }
- /*******************************************************************/
- /*寫顯示數據到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
- /*******************************************************************/
- 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;
- }
- //寫字符串
- void lcd_wstr(uchar* dat)
- {
- uchar i=0;
- while(dat[i] != '\0'&&i<16)
- { //顯示字符
- lcd_wdat(dat[i]);
- i++;
- }
- }
- /*******************************************************************/
- /* LCD初始化設定 */
- /*******************************************************************/
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
-
- // lcd_wcmd(0x34); //擴充指令操作
- // delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //顯示開,關光標
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delay(5);
- }
- /*********************************************************/
- /* 設定顯示位置 */
- /*********************************************************/
- 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;/*開全局中斷*/
- EX0=1;/*允許INT0中斷*/
- IT0=1;/*設置外部中斷觸發方式:下降沿觸發*/
- TMOD=0x11;
- ET0=1;
- ET1=1;
- TR0=0;
- TR1=0;
- TH0=15535/256; //計時50ms
- TL0=15535%256;
- TH1=55535/256; //計時10ms
- TL1=55535%256;
- }
- /*********************************************************/
- /* 主程序 */
- /*********************************************************/
- void main()
- {
- uchar str[17]=" ";
- interrupt_init();
- delay(10); //延時
- lcd_init(); //初始化LCD
- lcd_pos(1,4-strlen(dis[0])/4); //設置顯示位置為第二行的第1個字符
- 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); //設置顯示位置為第二行的第1個字符
- lcd_wstr(dis[1]); //顯示字符
- TH0=15535/256; //計時50ms
- TL0=15535%256;
- TR0=1;
- num=2;
- }
- void ET_IT0() interrupt 1
- {
- TH0=15535/256; //計時50ms
- TL0=15535%256;
- t++;
- if(t%20==0)
- {
- t_flag=1;
- num=(num+1)%3;
- if(t==60)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
搖號抽獎機.zip
(395.29 KB, 下載次數: 252)
2019-2-1 22:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: hodonishiki 時間: 2019-4-15 13:09
感覺挺不錯的,謝謝樓主。
作者: 宏宏宏1 時間: 2019-4-16 09:02
厲害厲害
作者: xiehua 時間: 2019-6-6 14:56
謝謝兄弟,解我燃眉之急!!!!
作者: 1464672157 時間: 2019-6-9 17:37
感謝樓主,強👍
作者: kkyy1996 時間: 2019-6-16 21:47
為啥我下的protues模擬液晶屏只亮不顯示字
作者: 一夢盡 時間: 2019-6-17 10:31
感覺很不錯呀
作者: Kansa 時間: 2019-8-5 17:58
不知道啊,是不是你沒有加那個.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
你要用Proteus7.5打開,你看我打開了
-
51hei.png
(19.56 KB, 下載次數: 104)
下載附件
2021-3-1 20:54 上傳
作者: LCD128634 時間: 2021-3-2 14:54
能問一下你的各個模塊是怎么設計的嗎?比如液晶顯示器模塊和開關模塊
作者: 1441420751 時間: 2021-3-10 19:54
感謝大佬 太強了
作者: qweqwa 時間: 2021-4-8 08:12
最后顯示結果的程序是哪一段
作者: 陽天獄 時間: 2021-11-13 12:10
怎么加進去呢?
作者: 林信遼 時間: 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久久久|
人人做人人澡人人爽欧美
|
九九热热九九
|