單片機連接12864(st7920)液晶顯示器和1個按鍵接INT0,模擬一個抽獎機。 實現效果: 1、液晶初始顯示“祝你好運!”; 2、按一下按鍵,液晶顯示“開始抽獎”,然后顯示“3-2-1”倒計時后,產生20個(0-4之間的)隨機數; 3、液晶屏幕根據隨機數顯示“特等獎”、“1等獎”、“2等獎”、“3等獎”、“謝謝參與"; 4、最后液晶屏顯示抽獎結果:“恭喜你獲得:XXX”。 5、再按一下按鍵,重新開始抽獎,液晶又顯示“開始抽獎”。。。。。。如此循環。
我們把抽獎過程中的不同狀態信息存儲在對應的數組里,利用定時器可以很方便簡潔寫出程序。
單片機源程序如下:
- /*******************************************************************/
- /* 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 上傳
點擊文件名下載附件
|