单片机89S52小游戏1602显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
百度贴吧,中国南车1985编写
C程序源码:
/*********************************************
猜图案小游戏,通过4*4矩阵键盘下注,键值按从上
到下,从左到右依次为0~16。
**********************************************/
#include
#include "stdlib.h" //后面ran()随机函数调用,必须先声明
#include
#include
#define uint unsigned int
sbit key_a=P1^0;
sbit key_b=P1^1;
sbit key_c=P1^2;
sbit key_d=P1^3;
sbit key_1=P1^4;
sbit key_2=P1^5;
sbit key_3=P1^6;
sbit key_4=P1^7;
sbit rs=P2^5;
sbit rw=P2^6;
sbit ep=P2^7;
unsigned char code dis_num[]={"0123456789abcdef"};
unsigned char code dis2[]={'7','4','1','.','8','5','2','0','9','6','3','=','/','*','-','+','\0'};//键盘按键值
unsigned char a[8];
uchar code zf1[8][8]={
//自定义字符字模表1
0x04,0x0e,0x0f,0x1f,0x1e,0x0e,0x04,0x00, //方块
0x04,0x0e,0x1f,0x1f,0x1f,0x04,0x0e,0x00,
0x0e,0x0e,0x1f,0x1f,0x1f,0x04,0x0e,0x00,
0x00,0x0a,0x1f,0x1f,0x1f,0x0e,0x04,0x00,
0x04,0x04,0x0e,0x1f,0x0e,0x04,0x04,0x00,
0x1b,0x1b,0x00,0x1b,0x00,0x1b,0x1b,0x00,
0x04,0x04,0x1b,0x04,0x1b,0x04,0x04,0x00,
0x04,0x0c,0x1c,0x1e,0x0f,0x06,0x04,0x00
};
uchar code zf2[8][8]={
//自定义字符字模表2
0x04,0x0e,0x1e,0x1b,0x0f,0x0e,0x04,0x00,
0x09,0x1b,0x1f,0x0e,0x1f,0x1b,0x12,0x00,
0x0e,0x1f,0x1f,0x1f,0x1f,0x1f,0x0e,0x00,
0x1f,0x1f,0x15,0x1f,0x15,0x1f,0x1f,0x00,
0x0e,0x0a,0x04,0x15,0x15,0x0e,0x04,0x00,
0x04,0x1f,0x15,0x04,0x0e,0x1b,0x0e,0x00,
0x00,0x00,0x0a,0x00,0x11,0x0e,0x00,0x00,
0x0e,0x11,0x1b,0x11,0x15,0x1b,0x0e,0x00
};
void delay(unsigned char ms) //延时函数
{
unsigned char i;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_bz() //测忙函数
{
bit result;
rs=0; //1602的HD44780芯片时序表:R=L,W=H,E=H为读状态,且由D7位输出状态:H为忙,L为不忙
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80); //判断D7位状态并赋给result返回
ep=0;
return result;
}
void lcd_wcmd(unsigned char cmd) //写指令函数
{
while(lcd_bz());//判断LCD是否忙碌每次读写指令必须先测忙
rs=0; //S=L,W=L,e为高脉冲(即L-H——L)。为写指令 rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
void lcd_pos(unsigned char row,pos) //光标位置设定函数,因高定光标必须要求D7=1;
{
if(row==1)
lcd_wcmd(pos-1|0x80); //光标第一行位置设定函数0x00位开始,
else
lcd_wcmd(pos-1|0xc0); //光标第二行位置设定函数起始位0x40,
}
void lcd_wdat(unsigned char dat) //写数据函数
{
while(lcd_bz());//判断LCD是否忙碌
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}