标题: 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、再按一下按键,重新开始抽奖,液晶又显示“开始抽奖”。。。。。。如此循环。
我们把抽奖过程中的不同状态信息存储在对应的数组里,利用定时器可以很方便简洁写出程序。
单片机源程序如下:
- /*******************************************************************/
- /* 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)
作者: 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)
作者: 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.51hei.com/bbs/) |
Powered by Discuz! X3.1 |