問題是按鍵時第一次和第二次按下時正常,按下第三個時一下子出3~4個相同的數求
批注 2019-08-19 150357.png (99.15 KB, 下載次數: 35)
下載附件
2019-8-19 15:55 上傳
單片機源程序如下:
- #include<reg51.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- unsigned char code xianshi[16]={'*','0','#','=','7','8','9','/','4','5','6','-','1','2','3','+'};
- unsigned char code shu[16]={0,0,0,0,7,8,9,0,4,5,6,0,1,2,3,0};
- unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};
- #define anjian P1
- #define LCD_D P2
- sbit LCD_RS=P3^0;
- sbit LCD_RW=P3^1;
- sbit LCD_E=P3^2;
- u8 jianwei,i=0,jieguo;
- u8 zancun[4];
- void delay(u16 i)
- {
- while(i--);
- }
- void delayms(u16 c) //延時函數ms 誤差 0us
- {
- u8 a,b;
- for (; c>0; c--)
- {
- for (b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
- }
- void dat(u8 d) //寫入數據
- {
- LCD_E=0; //關閉使能端
- LCD_RW=0; //進入 寫
- LCD_RS=1; //選擇 數據
- LCD_D=d; //輸入數據
- delayms(1); //等待數據穩定
- LCD_E=1; //打開使能端
- delayms(5); //延時1ms
- LCD_E=0; //關閉使能端
- }
- void junzhenanjian()
- {
- u8 a;
- anjian=0x0f;
- if(anjian!=0x0f)
- {
- delay(1000); //消抖
- if(anjian!=0x0f)
- {
- anjian=0x0f;
- switch(anjian)
- {
- case(0x07): jianwei=0;break;
- case(0x0b): jianwei=1;break;
- case(0x0d): jianwei=2;break;
- case(0x0e): jianwei=3;break;
- }
- anjian=0xf0;
- switch(anjian)
- {
- case(0x70): jianwei=jianwei; break;
- case(0xb0): jianwei=jianwei+4; break;
- case(0xd0): jianwei=jianwei+8; break;
- case(0xe0): jianwei=jianwei+12;break;
- }
- while((a<50)&&(anjian!=0xf0))
- {
- delay(1000);
- a++;
- }
- dat(xianshi[jianwei]);
- zancun[i]=jianwei;
- i++;
- }
- }
- }
- void com(u8 c) //寫入命令
- {
- LCD_E=0; //關閉使能端
- LCD_RW=0; //進入 寫
- LCD_RS=0; //選擇 命令
- LCD_D=c; //輸入命令
- delayms(1); //等待數據穩定
- LCD_E=1; //打開使能端
- delayms(5); //延時1ms
- LCD_E=0; //關閉使能端
- }
- void qingping() //清屏
- {
-
- com(0x06); //光標右移
- com(0x0c); //顯示光標
- com(0x38); //8線 1行 5×10
- com(0x01); //清屏
- com(0x80); //設置起點
- }
- void main()
- {
- u8 shi,ge;
- qingping();
- while(1)
- {
- junzhenanjian();
- if(i==4)
- {
- switch(zancun[1])
- {
- case(0):jieguo=(shu[zancun[0]]*shu[zancun[2]]);break;
- case(7):jieguo=(shu[zancun[0]]/shu[zancun[2]]);break;
- case(11):jieguo=(shu[zancun[0]]-shu[zancun[2]]);break;
- case(15):jieguo=(shu[zancun[0]]+shu[zancun[2]]);break;
- }
- if(jieguo>=10)
- {
- shi=jieguo/10;
- ge=jieguo-shi*10;
- dat(table[shi]);
- dat(table[ge]);
- }
- else
- dat(table[jieguo]);
- i=0;
- }
- }
- }
復制代碼
|