用
proteus进行
仿真编译也成功了,可是就是实现不了功能。 程序也检查不出什么问题。 求解大神怎么破
#include<reg51.h>
#define CLEARSCREEN LCD_write_command(0x01)
#define uint unsigned int
#define uchar unsigned char
/**************定义接口************************/
#define LCDIO P0
#define KEYBOARD P1//保留
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_EN=P2^2;
/************************************************/
code uchar mayuan[16]={'0','1','2','3','4','5','6','7','8','9','0','/','*','-','+','='};//不错,这个比较明了
unsigned char code keycode[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,
0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//键盘编码值()
int i,j,k=1,s;//
int t,t1,t2,a[];//
void delay(uchar);//延时
/**************定义函数************************/
void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
void delay_10ms();
ini
tial();
uchar keyscan();//键盘扫描函数
calc(uchar);//计算函数
uchar num,temp,key,keynum;
void main()//主函数
{
LCD_init();
delay_nms(100);
while(1)
{
initial();//有中断
KEYBOARD =0xf0;//键盘的列值全置高电平
}
}
/**********************************开中断***************************************/
initial()
{
EA=1;//总开关
EX0=1;//中断方式0开启
IT0=0;
}
/*******************************************************************************/
/*********************************中断函数************************************/
void inter0() interrupt 0
{
unsigned char n;
delay_10ms();//延时
if(INT0==0)//没键按下
{
EX0=0;//关中断
n=keyscan();
calc(n);
EX0=1;//开中断
KEYBOARD=0xf0;//键盘的列值全置高电平
}
}
/************************************************************************/
calc(uchar n)
{
if(n<10)//键值小于10
{
t1=t1*10+n;
LCD_write_command(0x00);//写命令语句
LCD_write_dat(mayuan[n]);//写数据函数
}
else
{
if(n==10){LCD_init();t1=0;t2=0,t=0;k=1;}
else{
if(n<15){
t2=t1;t1=0;j=n;
LCD_write_command(0x00);
LCD_write_dat(mayuan[n]);}
else{
LCD_write_command(0x00);
LCD_write_dat(mayuan[n]);
switch(j){
case 11:
t=t2/t1;
break;
case 12:
t=t2*t1;
break;
case 13:
t=t2-t1;
break;
case 14:
t=t2+t1;
break;
}
if(t<=9){ LCD_write_command(0x00);
LCD_write_dat(t+48);}
if(t>9)
{
while(t>9)
{
s=t%10;
t=t/10;
a[k]=s;
k++;
}
if(t<=9){
LCD_write_command(0x00);
LCD_write_dat(t+48);}
for(i=k-1;i>=1;i--)
{
LCD_write_command(0x00);
LCD_write_dat(a[i]+48);
}
}
}
}
}
}
/*****************************************键盘扫描函数************************************/
uchar keyscan()//键盘扫描
{
KEYBOARD=0xf0;//键盘的列值全置高电平
delay_10ms();//延时
if(KEYBOARD!=0xf0)//有键按下
{
temp=KEYBOARD;//保存键盘此刻的键植
delay_10ms();//延时
if(KEYBOARD==temp)//再次确认键盘是否被按下
{
uchar i;
KEYBOARD=0x0f;//键盘的行值全置高电平
delay_10ms();//10MS时间延时
keynum=temp | KEYBOARD;//保存键盘的行值
while(KEYBOARD!=0x0f);//松手检测
for(i=0;i<16;i++)
if(keycode[i]==~keynum)
return (i);
}
}
return -1;
}
/******************************************************************************/
/********** 延时**********************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<10;j++);
}
void delay_10ms()//10MS延时
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<120;j++);
}
-
一周热门 更多>