单片机连接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)
|