久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1940|回復: 0
打印 上一主題 下一主題
收起左側

計算器LCD

[復制鏈接]
跳轉到指定樓層
樓主
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
sbit pinRS=P2^0;
sbit pinRW=P2^1;
sbit pinE=P2^2;
#define pindata P0
#define clearscreen() writeinstruc(0x01)
#define cursorreturn() writeinstruc(0x02)
#define inputmode(temp) writeinstruc(temp)
//temp取值如下:
//0x04:減量方式,不移位
//0x05:減量方式,移位
//0x06:增量方式,不移位
//0x07:增量方式,移位
#define dispcontrol(temp) writeinstruc(temp)
//temp取值如下:
//0x08:顯示關,光標關,閃爍關
//0x0c:顯示關,光標關,閃爍關
//0x0d:顯示開,光標關,閃爍開
//0x0e:顯示開,光標開,閃爍關
//0x0f:顯示開,光標開,閃爍開
#define dispshift(temp) writeinstruc(temp)
//temp取值如下:
//0x10:光標左移
//0x14:光標右移
//0x18:顯示整體左移
//0x1c:顯示整體右移
#define functionset(temp) writeinstruc(temp)
//temp取值如下:
//0x20:4位,1行,5*7
//0x24:4位,1行,5*10
//0x28:4位,2行,5*7
//0x2c:4位,2行,5*10
//0x30:8位,1行,5*7
//0x34:8位,1行,5*10
//0x38:8位,2行,5*7
//0x3c:8位,2行,5*10
#define setCGRAM_Add(address) writeinstruc(0x40|address)
#define setDDRAM_Add(address) writeinstruc(0x80|address)//短延時
//void shortdelay(uchar i);
//長延時
//void longdelay(uint i);
//P2口初始化
//void initP2(bit i);
//寄存器選擇信號
//void setRS(bit i);
//讀寫操作控制
//void setRW(bit i);
//使能信號
//void setE(bit i);
//讀BF以及AC的值
//uint read_BF_AC();
//判忙
//bit statuscheck();
//寫指令函數
//void writeinstruc(uint instruc);
//寫數據到RAM
//void writedata(uint data1);
//從RAM中讀數據函數
//uint readdata(void);
//顯示程序 X為行號,Y為列號,date為要顯示的數據
//void dispcharacter(int x,uint y,uint data1);
//LCD復位函數
//void LCDreset();
#define uchar unsigned char
uchar k=0,result1;
void shortdelay(uchar i)//短延時
{
for(;i>0;i--);
}
//長延時
void longdelay(uint i)
{
uint j;
for(;i>0;i--)
{for(j=100;j>0;j--);}
}
//延時程序
void delay(int i)
{int j;
for(;i>0;i--)
   for(j=0;j<100;j++);
}
//初試狀態
void io_init()
{P1=0xff;
}
//?---------------------------鍵盤掃描部分-----------------------------//
unsigned char key_scan()
{ unsigned char key;
  unsigned char temp;
  uint flag;
  io_init();
   P1=0xf0;
   flag=0;
loop: temp=P1^0xf0;
   while(temp)
    {
     P1=0xfe;
     delay(1);
     if((P1&0xfe)!=0xfe)
     switch(P1)
     {
     case 0xee: key=0x11;flag=1;break;//讀7鍵和值
     case 0xde: key=0x12;flag=1;break;
     case 0xbe: key=0x13;flag=1;break;
     case 0x7e: key=0x14;flag=1;break;//讀除鍵的值
     }
  if(flag)
  goto exit;
  else
     P1=0xfd;
     delay(1);
     if((P1&0xfd)!=0xfd)
     switch(P1)
     {
     case 0xed: key=0x21;flag=1;break;
     case 0xdd: key=0x22;flag=1;break;
     case 0xbd: key=0x23;flag=1;break;
     case 0x7d: key=0x24;flag=1;break; //讀4到乘的鍵值
     }
     if(flag)
  goto exit;
  else
     P1=0xfb;
     delay(1);
     if((P1&0xfb)!=0xfb)
     switch(P1)
     {
     case 0xeb: key=0x31;flag=1;break;
     case 0xdb: key=0x32;flag=1;break;
     case 0xbb: key=0x33;flag=1;break;
     case 0x7b: key=0x34;flag=1;break;//讀1到減的鍵值
     }
     if(flag)
  goto exit;
  else
  P1=0xf7;
     delay(1);
     if((P1&0xf7)!=0xf7)
     switch(P1)
     {
     case 0xe7: key=0x41;flag=1;break;//后退
     case 0xd7: key=0x42;flag=1;break;//0
     case 0xb7: key=0x43;flag=1;break;//等于
     case 0x77: key=0x44;flag=1;break;//加
     }

exit: return key;
   }
  if(temp==0)
  goto loop;
  }
//---------------------------------鍵盤掃描完--------------------------------------------//
//---------------------------------顯示初始化?----------------------------------------//
//P0口初始化
void initpindata(bit i)
{
if(i==1) pindata=0xff;
else pindata=0X00;
}
//寄存器選擇信號
void setRS(bit i)
{
if(i==1) pinRS=1;
else pinRS=0;
}
//讀寫操作控制
void setRW(bit i)
{
if(i==1) pinRW=1;
else pinRW=0;
}
//使能信號
void setE(bit i)
{
if(i==1) pinE=1;
else pinE=0;
}
//讀BF以及AC的值
uint read_BF_AC()
{
uint temp;
initpindata(1);
setRS(0);
setRW(1);
setE(1);
shortdelay(1);
temp=pindata;
shortdelay(10);
setE(0);
return(temp);
}
//判忙
bit statuscheck()
{
return((bit)(read_BF_AC()&0x80));
}
//寫指令函數
void writeinstruc(uint instruc)
{
while(statuscheck());
initpindata(0);
setRS(0);
setRW(0);
setE(0);
pindata=instruc;
//short delay(1);
setE(1);
shortdelay(10);
setE(0);
}
//寫數據到RAM
void writedata(uint data1)
{
initpindata(0);
setRS(1);
setRW(0);
setE(0);
pindata=data1;
setE(1);
shortdelay(10);
setE(0);
}
//從RAM中讀數據函數
uint readdata(void)
{
uint temp;
initpindata(1);
setRS(1);
setRW(1);
setE(1);
shortdelay(1);
temp=pindata;
shortdelay(10);
setE(0);
return(temp);
}
//顯示程序 X為行號,Y為列號,date為要顯示的數據
void dispcharacter(int x,uint y,uint data1)
{
uint temp;
while(statuscheck());
temp=y&0x0f;
x&=0x01;
if(x) temp|=0x40;
setDDRAM_Add(temp);
writedata(data1);
// writedata(data1);
}
//LCD復位函數
void LCDreset()
{
clearscreen();
cursorreturn();
}
//LCD初始化
void initLCD()
{
LCDreset();
inputmode(0x06);//增量方式,不移位
dispcontrol(0x0c);//顯示開,光標關,閃爍關
functionset(0x38);//8位,2行,5*7
}
//-----------------------------------準備工作完成-----------------------------------//
//-----------------------------------計算器-----------------------------------------//
  compute(char key1,i)
{
signed char m,n,c,act;
long int num1,num2,result;
signed char str[4][4]={{'7','8','9','/'},
                {'4','5','6','*'},
                {'1','2','3','-'},
                {'c','0','=','+'}};
signed char str1[11],string1[2];
m=(key1&0xf0);
m=m/16;
m=m-1;
n=key1&0x0f;
n=n-1;
c=str[m][n];
sprintf(string1,"%c",c);
strcat(str1,string1);
if((c=='+')||(c=='-')||(c=='*')||(c=='/'))
{
act=c;
num1=atoi(str1);
memset(str1,0,11);
memset(string1,0,2);
}
if(c=='=')
{
num2=atoi(str1);

switch(act)
{
case'+':
{ if(k==0)
    {result=num1+num2;k++;break;}
   else
   {result+=num2;k++;break;}
   }
case'-':
  {if(k==0)
   {result=num1-num2;k++;break;}
   else
   {result-=num2;k++;break;}
   }
case'*':
{if(k==0)
   {result=num1*num2;k++;break;}
   else
   {result*=num2;k++;break;}
   }
case'/':
{if(k==0)
   {result=num1/num2;k++;break;}
   else
  { result/=num2;k++;break;}
   }
}
}
if(c=='c')
{
act=0;
num1=str1[0];
num1=str1[8];
memset(str1,0,11);
memset(string1,0,2);
num1=str1[0];
num1=str1[8];
k=0;
}
longdelay(350);
switch(key1)  //顯示部分
{case 0x11:   dispcharacter(0,i,'7');i++;break;
case 0x12:    dispcharacter(0,i,'8');i++; break;
case 0x13:    dispcharacter(0,i,'9');i++; break;
case 0x14:    dispcharacter(0,i,'/');i++;break;
case 0x21:    dispcharacter(0,i,'4');i++;break;
case 0x22:    dispcharacter(0,i,'5');i++;break;
case 0x23:    dispcharacter(0,i,'6');i++;break;
case 0x24:    dispcharacter(0,i,'*');i++;break;
case 0x31:    dispcharacter(0,i,'1');i++;break;
case 0x32:    dispcharacter(0,i,'2');i++;break;
case 0x33:    dispcharacter(0,i,'3');i++;break;
case 0x34:    dispcharacter(0,i,'-');i++;break;
case 0x41:    clearscreen();             break;
case 0x42:    dispcharacter(0,i,'0');i++;break;
case 0x43:    dispcharacter(0,i,'=');i++;
               m=result/10000;
               result1=result%10000;
               if(m!=0||result==0)
               {
               n=0;
      m=m+'0';
               dispcharacter(0,i,m);i++;
               }
               m=result1/1000;
               result1=result1%1000;
               if(m!=0||n==0)
        {
               m=m+'0';
      n=0;
               dispcharacter(0,i,m);i++;
      }
               m=result1/100;
               result1=result1%100;
               if(m!=0||n==0)
      {
               m=m+'0';
      n=0;
            dispcharacter(0,i,m);i++;
      }
               m=result1/10;
               result1=result1%10;
               if(m!=0||n==0)
      {
               m=m+'0';
      n=0;
               dispcharacter(0,i,m);i++;
      }
               m=result1;
               if(m!=0||n==0)
               m=m+'0';
               dispcharacter(0,i,m);i++;break;
case 0x44:    dispcharacter(0,i,'+');i++;break;
}
return(i);
}
//---------------------------------------------------------------------------------//
//-------------------------------------主函數---------------------------------------//
void main()
{
char key1,i;
start:initpindata(0);
P2=0X00;
initLCD();
i=0;
scan:key1=key_scan();
i=compute(key1,i);
if(key1==0x41)
goto start;
else
goto scan;
}

223822ki1qqighwew3wwne.png (147.76 KB, 下載次數: 21)

223822ki1qqighwew3wwne.png

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年人网站国产 | 亚洲国产一区二区三区在线观看 | 中文字幕免费视频 | 日本亚洲欧美 | 成年女人免费v片 | 婷婷中文在线 | 亚洲精品二区 | 热久久性| 久久精品亚洲精品 | 亚洲视频在线观看免费 | 国产成人精品a视频一区www | 欧美中文在线 | 免费在线观看黄网站 | 免费成人av| 久久成人一区 | 中文字幕第一页在线 | 欧美影院| 992人人草 | 欧美三级久久久 | 婷婷综合五月天 | 在线一区二区国产 | 久久91精品| 婷婷色在线播放 | 91av导航| 日本又色又爽又黄的大片 | 国产免费福利小视频 | 中文字幕一区二区三区精彩视频 | 丝袜美腿一区二区三区动态图 | 精品亚洲一区二区三区 | 无码日韩精品一区二区免费 | 刘亦菲国产毛片bd | 午夜一区二区三区视频 | 成人教育av | 欧美日产国产成人免费图片 | 日韩午夜影院 | 精品日韩在线观看 | 91精品国产综合久久精品图片 | 日韩精品一区二区三区视频播放 | 日韩视频成人 | 国产欧美一区二区在线观看 | 日本黄色免费大片 |