|
QQ截圖20170311180339.png (25.82 KB, 下載次數(shù): 66)
下載附件
仿真圖
2017-3-11 18:04 上傳
在lcd1602中顯示不出來,連初始化的0都顯示不出來 不知道是程序有問題還是仿真圖有問題,各位大神幫幫忙看看 困擾好久 沒人指導(dǎo) 很難受 睡不著
- #include<reg52.h>
- sbit key0_in = P3^4;
- sbit key1_in = P3^5;
- sbit key2_in = P3^6;
- sbit key3_in = P3^7;
- sbit key0_out = P3^0;
- sbit key1_out = P3^1;
- sbit key2_out = P3^2;
- sbit key3_out = P3^3;
- unsigned char code KeyCodeMap[4][4] = { //矩陣按鍵編號(hào)到標(biāo)準(zhǔn)鍵盤鍵碼的映射表
- { '1', '2', '3', 0x26 }, //數(shù)字鍵1、數(shù)字鍵2、數(shù)字鍵3、向上鍵
- { '4', '5', '6', 0x25 }, //數(shù)字鍵4、數(shù)字鍵5、數(shù)字鍵6、向左鍵
- { '7', '8', '9', 0x28 }, //數(shù)字鍵7、數(shù)字鍵8、數(shù)字鍵9、向下鍵
- { '0', 0x1B, 0x0D, 0x27 } //數(shù)字鍵0、ESC鍵、 回車鍵、 向右鍵
- };
- unsigned char pdata KeySta[4][4] = { //全部矩陣按鍵的當(dāng)前狀態(tài)
- {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
- };
- extern unsigned char zfc_date(unsigned char *zfc,signed long date);
- extern void numkeyaction(unsigned char n);
- extern void operkeyaction(unsigned char type);
- extern void reset();
- extern void getresult();
- extern void lcdshowdate(unsigned char x,unsigned char y,unsigned char *zfc);
- void keyaction(unsigned char keycode) //加減乘除函數(shù)
- {
- if((keycode >= '0') && (keycode <= '9'))
- {
- numkeyaction(keycode -'0');
- }
- if(keycode == 0x26)
- {
- operkeyaction(0);
- }
- else if(keycode == 0x28)
- {
- operkeyaction(1);
- }
- else if(keycode == 0x25)
- {
- operkeyaction(2);
- }
- else if(keycode == 0x27)
- {
- operkeyaction(3);
- }
- else if(keycode == 0x0D)
- {
- getresult();
- }
- else if(keycode == 0x1B)
- {
- reset();
- lcdshowdate(15,1,"0");
- }
- }
- void keydriver() //按鍵掃描
- {
- unsigned char i;
- unsigned char j;
- static unsigned char backup[4][4]=
- {
- {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
- };
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- if(backup[i][j]!= KeySta[i][j])
- {
- if(KeySta[i][j]!= 0)
- {
- keyaction(KeyCodeMap[i][j]);
- }
- backup[i][j] = KeySta[i][j];
- }
-
- }
- }
- }
- void keyscanf()
- {
- unsigned char i;
- static unsigned char keyout=0;
- static unsigned char keybuf[4][4]={
- {0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}
- };
- keybuf[keyout][0]= (keybuf[keyout][0])<< 1 | key0_in;
- keybuf[keyout][1]= (keybuf[keyout][1])<< 1 | key1_in;
- keybuf[keyout][2]= (keybuf[keyout][2])<< 1 | key2_in;
- keybuf[keyout][3]= (keybuf[keyout][3])<< 1 | key3_in;
- for(i=0;i<4;i++)
- {
- if((keybuf[keyout][i] & 0x0f )==0x00)
- {
- KeySta[keyout][i] = 0;
- }
- else if ((keybuf[keyout][i] & 0x0f) == 0x0f)
- {
- KeySta[keyout][i] = 1;
- }
-
- }
- keyout++;
- keyout &= 0x03;
- switch (keyout)
- {
- case 0: key3_out =1; key0_out =0; break;
- case 1: key0_out =1; key1_out =0; break;
- case 2: key1_out =1; key2_out =0; break;
- case 3: key2_out =1; key3_out =0; break;
- default: break;
- }
- }
- /****************************************************lcd配置*******************************************************//
- #include<reg52.h>
- #define lcddb P0
- sbit rw=P2^1;
- sbit rs=P2^0;
- sbit en=P2^2;
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void lcdwriteready() //檢測(cè)是否忙狀態(tài)
- {
- unsigned char zfc;
- lcddb=0xff;
- rw=1;
- rs=0;
- do
- {
- en=1;
- zfc=lcddb;
- en=0;
- }
- while(zfc & 0x80);
- }
- void lcdwritecom(unsigned char com) //寫指令
- {
- lcdwriteready();
- rs=0;
- rw=0;
- lcddb=com;
- delay(10);
- en=1;
- delay(10);
- en=0;
- delay(10);
- }
- void lcdwritedate(unsigned char date) //寫數(shù)據(jù)
- {
- lcdwriteready();
- rs=1;
- rw=0;
- lcddb=date;
- delay(10);
- en=1;
- delay(10);
- en=0;
- delay(10);
- }
- void lcdInit() //初始化lcd
- {
- lcdwritecom(0x01);
- lcdwritecom(0x38);
- lcdwritecom(0x0C);
- lcdwritecom(0x06);
- }
- void lcd_add(unsigned char x,unsigned char y) //設(shè)置lcd輸入起始地址
- {
- unsigned char add;
- if(y==0)
- add = 0x00 + x;
- else
- add = 0x40 + x;
- lcdwritecom(add|0x80);
- }
- void lcdshowdate(unsigned char x,unsigned char y,unsigned char *zfc) //將轉(zhuǎn)換的字符指針傳入lcd
- {
- lcd_add(x,y);
- while(*zfc != '\0')
- {
- lcdwritedate(*zfc++);
- }
- }
- void lcdareaclear(unsigned char x,unsigned char y,unsigned char changdu) //局部清除
- {
- lcd_add(x,y);
- while(changdu--)
- {
- lcdwritedate(' ');
- }
- }
- void lcdallclear() //全屏清除
- {
- lcdwritecom(0x01);
- }
- /*************************************************main.c函數(shù)***********************************************************/
- #include<reg52.h>
- unsigned char num1=0;
- unsigned char num2=0;
- unsigned char step=0;
- unsigned char oper = 0;
- unsigned char T0RH=0;
- unsigned char T0RL=0;
- unsigned char result=0;
- void ConfigTimer0(unsigned int ms);
- extern void lcdInit();
- extern void lcdshowdate(unsigned char x,unsigned char y,unsigned char *zfc); //將轉(zhuǎn)換的字符指針傳入lcd
- extern void lcdareaclear(unsigned char x,unsigned char y,unsigned char changdu); //局部清除
- extern void lcdallclear(); //全屏清除
- extern void keyaction(unsigned char keycode);
- extern void keydriver();
- extern void keyscanf();
- void main()
- {
- EA = 1; //開總中斷
- ConfigTimer0(1); //配置T0定時(shí)1ms
- lcdInit(); //初始化液晶
- lcdshowdate(15, 1, "0"); //初始顯示一個(gè)數(shù)字0
- while (1)
- {
- keydriver(); //調(diào)用按鍵驅(qū)動(dòng)
- }
- }
- unsigned char zfc_date(unsigned char *zfc,signed long date) //數(shù)字轉(zhuǎn)字符串
- {
- signed long i = 0;
- unsigned char changdu = 0;
- unsigned char buf[12];
- if(date < 0)
- {
- date = -date;
- *zfc++ = '-';
- changdu++;
- }
- do
- {
- buf[i++]= date %10;
- date /= 10;
- }
- while(date > 0);
- changdu += i;
- while(i-- > 0)
- {
- *zfc++ = buf[i] + '0';
- }
- *zfc = '\0';
-
- return changdu;
- }
- void showoper(unsigned char y, unsigned char type) //加減乘除函數(shù)
- {
- switch(type)
- {
- case 0: lcdshowdate( 0 , y , "+");
- case 1: lcdshowdate( 0 , y , "-");
- case 2: lcdshowdate( 0 , y , "*");
- case 3: lcdshowdate( 0 , y , "/");
- default: break; //
- }
- }
- void reset() //清除
- {
- num1 = 0;
- num2 = 0;
- step = 0;
- lcdallclear();
- }
- void numkeyaction(unsigned char n) //輸入
- {
- unsigned char changdu = 0;
- unsigned char zfc[12];
- if(step > 1)
- {
- reset();
- }
- if(step == 0)
- {
- num1 = num1*10 + n;
- changdu = zfc_date(zfc,num1); //
- lcdshowdate(16-changdu,1,zfc);
- }
- else
- {
- num2 = num2*10 + n;
- changdu = zfc_date(zfc,num2); //
- lcdshowdate(16-changdu,1,zfc);
- }
- }
- void operkeyaction(unsigned char type) //輸入
- {
- unsigned char changdu;
- unsigned char zfc[12];
- if(step == 0)
- {
- changdu = zfc_date(zfc,num1);
- lcdareaclear(0,0,16-changdu);
- lcdshowdate(16-changdu,0,zfc);
- showoper(1,type);
- lcdareaclear(1,1,14);
- lcdshowdate(15,1,"0"); //
- oper = type; //
- step = 1;
- }
- }
- void getresult() //結(jié)果
- {
- unsigned char changdu;
- unsigned char zfc[12];
- if(step == 1)
- {
- step = 2;
- switch(oper)
- {
- case 0: result = num1 + num2; break;
- case 1: result = num1 - num2; break;
- case 2: result = num1 * num2; break;
- case 3: result = num1 / num2; break;
- default: break;
- }
- changdu = zfc_date(zfc,num2);
- showoper(0,oper);
- lcdareaclear(1,0,16-changdu-1);
- lcdshowdate(16-changdu,0,zfc);
- changdu = zfc_date(zfc,result);
- lcdshowdate(0,1,"=");
- lcdareaclear(1,1,16-changdu-1);
- lcdshowdate(16-changdu,1,zfc);
- }
- }
- /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
- void ConfigTimer0(unsigned int ms)
- {
- unsigned long tmp; //臨時(shí)變量
- tmp = 11059200 / 12; //定時(shí)器計(jì)數(shù)頻率
- tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值
- tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
- tmp = tmp + 12; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
- T0RH = (unsigned char)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
- T0RL = (unsigned char)tmp;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0為模式1
- TH0 = T0RH; //加載T0重載值
- TL0 = T0RL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動(dòng)T0
- }
- /* T0中斷服務(wù)函數(shù),執(zhí)行按鍵掃描 */
- void InterruptTimer0() interrupt 1
- {
- TH0 = T0RH; //重新加載重載值
- TL0 = T0RL;
- keyscanf(); //按鍵掃描
- }
復(fù)制代碼 |
-
-
51計(jì)算器.rar
2017-3-11 19:36 上傳
點(diǎn)擊文件名下載附件
61.5 KB, 下載次數(shù): 6
|