as564335sa 发表于 2014-1-2 18:37 
lcd_pos(0x40); //设置显示位置为第二行
这句话,第二行的起始地址是0x80+0x40 ...
我按照那个图,正确的图,然后写了代码,你看看,但是我不会给按键赋值,矩阵键盘,0-9数字键输入你的答案,A键随机出题,B键判断正误,正确显示succeed,错误显示error,C键清楚当前的答案,D键输显示正确的答案。我看了一下午的书都不明白,我按照数码管显示的方法来做,但是不对。。。。。。。不知道哪里做错了
#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
//sbit K1=P1^4;
sbit BEEP=P2^7;
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
void beep();
bit LCD_Busy_Check();
void LCD_Initialize();
void LCD_Set_POS(uchar);
void LCD_Write_Command(uchar);
void LCD_Write_Data(uchar);
uchar code titlt_text[]={"---99 table ---"}; //标题字符串
uchar data Multiply_str[]={" "}; //乘法口诀表达式
uchar code dis_tab[17]= {
0x30, //0在1602中的十六进制码
0x31, //1在1602中的十六进制码
0x32, //2在1602中的十六进制码
0x33, //3在1602中的十六进制码
0x34, //4在1602中的十六进制码
0x35, //5在1602中的十六进制码
0x36, //6在1602中的十六进制码
0x37, //7在1602中的十六进制码
0x38, //8在1602中的十六进制码
0x39, //9在1602中的十六进制码
0x41, //A在1602中的十六进制码
0x42, //B在1602中的十六进制码
0x43, //C在1602中的十六进制码
0x44, //D在1602中的十六进制码
0x2A, //*在1602中的十六进制码
};
//延时
void DelayMS(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
//显示函数,在LCD指定的行上显示字符串
void Display_string(uchar *str,uchar lineno)
{
uchar k;
LCD_Set_POS(lineno);
for(k=0;k<16;k++)
LCD_Write_Data(str[k]);
}
//随机生成被乘数与乘数,并得到乘积
void Get_random_Num_A_B()
{
uchar a,b,c1,c2;
a=rand()%9+1; //被乘数
b=rand()%9+1; //乘数
c1= a*b/10;
c2=a*b%10;
Multiply_str[1]=a+'0';
Multiply_str[3]='*';
Multiply_str[5]=b+'0';
Multiply_str[7]='=';
/*Multiply_str[9]=c1+'0';
Multiply_str[10]=c2+'0';
if( c1==0) Multiply_str[9]=' ';*///当乘积的十位数(即数组中的第9位)为0时不显示
}
//1602LCD显示控制函数
bit LCD_Busy_Check()
{
bit Result;
LCD_RS=0;//寄存选择
LCD_RW=1;//读的状态选择
LCD_EN=1;//开始读
DelayNOP();
Result=(bit)(P0&0x80);
LCD_EN=0;
return Result;
}
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());//忙等待
LCD_RS=0;LCD_RW=0;LCD_EN=0;
_nop_();_nop_();
P0=cmd;DelayNOP();
LCD_EN=1;DelayNOP();
LCD_EN=0;
}
//写数据
void LCD_Write_Data(uchar str)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=str;DelayNOP();
LCD_EN=1;DelayNOP();LCD_EN=0;
}
void LCD_Initialize()
{
DelayMS(5);LCD_Write_Command(0x38);
DelayMS(5);LCD_Write_Command(0x0c);
DelayMS(5);LCD_Write_Command(0x06);
DelayMS(5);LCD_Write_Command(0x01);
DelayMS(5);
}
void LCD_Set_POS(uchar Position)
{
LCD_Write_Command(Position | 0x80);
}
//蜂鸣器
void beep()
{
uchar i,j;
for(i=0;i<180;i++)
{
for(j=0;j<50;j++); BEEP=!BEEP;
}
DelayMS(300);BEEP=0;
}
void keyscan()
{
uchar temp;
//按键0~3
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayMS(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
P0=dis_tab[0]; //显示数字
break;
case 0xde:
P0=dis_tab[1];
break;
case 0xbe:
P0=dis_tab[2];
break;
case 0x7e:
P0=dis_tab[3];
break;
}
while(temp!=0xf0) //等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
}
}
//按键4~7
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayMS(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
P0=dis_tab[4]; //显示数字
break;
case 0xdd:
P0=dis_tab[5];
break;
case 0xbd:
P0=dis_tab[6];
break;
case 0x7d:
P0=dis_tab[7];
break;
}
while(temp!=0xf0) //等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
}
}
//按键8~b
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayMS(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
P0=dis_tab[8]; //显示数字
break;
case 0xdb:
P0=dis_tab[9];
break;
case 0xbb:
P0=dis_tab[10];
Get_random_Num_A_B();
break;
case 0x7b:
P0=dis_tab[11];
break;
}
while(temp!=0xf0) //等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
}
}
//按键c~f
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayMS(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
P0=dis_tab[12]; //显示数字
break;
case 0xd7:
P0=dis_tab[13];
break;
case 0xb7:
P0=dis_tab[14];
break;
case 0x77:
P0=dis_tab[15];
break;
}
while(temp!=0xf0) //等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
}
}
}
|