久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機程序沒什么問題 就是實物圖顯示不出來,板子做出來用這個程序沒反應
[打印本頁]
作者:
xy0821
時間:
2018-12-4 10:42
標題:
單片機程序沒什么問題 就是實物圖顯示不出來,板子做出來用這個程序沒反應
程序沒什么問題 就是實物圖顯示不出來 板子做出來用這個程序沒反應
電路原理圖如下:
JSUBTS1E2B6SJQXY_RE)HU1.png
(79.47 KB, 下載次數: 60)
下載附件
2018-12-4 10:38 上傳
#include <reg51.H>
#include<intrins.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
#define Data P0//數據端口
//全局變量
float num1;//第一操作數num1 (初始為零)
float num2;//第二操作數num2 (初始為零)
char yun_flag='+';//運算符號 yun_flag (默認為+ )
char key_last;//上次按鍵狀態標志 key_last
char sqrt_flag;//開方鍵按下標志 sqrt_flag
unsigned long pos_flag=1;//小數位權pos_flag (默認為1)
char neg_flag;//正負標志 neg_flag
char data c_num1[15]=" ";//c_num1 字符型第一操作數 (數組不定義大小與其他變量沖突)
char data c_num2[15]=" ";//c_num2 字符型第二操作數
char error;//運算法則錯誤;
char len;//小數點后位數
/* 微秒延時函數 */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1; /*12MHz頻率*/
while(--uscnt);
}
/******************************************************************/
/* 毫秒函數聲明 */
/******************************************************************/
void DelayMs(unsigned char ms)
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
/******************************************************************/
/* 寫入命令函數 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前短暫延時,保證信號穩定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/* 寫入數據函數 */
/******************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //操作前短暫延時,保證信號穩定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/* 寫入字節函數 */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行則命令代碼高4位為0xc
else
p=pos+0x80; //是第二行則命令代碼高4位為0x8
WriteCommand (p);//寫命令
WriteData (c); //寫數據
}
/******************************************************************/
/* 寫入字符串函數 */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;*(ptr+i)!='\0';i++)
ShowChar (l++,*(ptr+i));//循環顯示16個字符
}
/******************************************************************/
/* 初始化函數 */
/******************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示光標移動位置
WriteCommand(0x0c); //顯示開及光標設置
WriteCommand(0x01); //顯示清屏
}
/*************按鍵掃描****************************/
char scan()
{
char h_data,l_data,i,key_num;
P2=P2&0XE0;//P2低5位送0
P1=P1|0X0F;//P1低4位送1
while((P1|0xf0)==0xff)//判斷P1低4位是否全為1
{
while((P1|0xf0)==0xff);
DelayMs(10);//延時10ms
}
l_data=~(P1|0xf0);//記入列標志
P2=P2|0X1F;//P2低五位送1
P1=P1&0XF0;//P1低四位送0
h_data=~(P2|0xe0);//記入行標志
for(i=0;i<=4;i++)//計算行號(0~4)
{
if(h_data==1)break;
h_data=h_data>>1;
}
h_data=i;//行號
for(i=1;i<=4;i++)//計算列號(1~4)
{
if(l_data==1)break;
l_data=l_data>>1;
}
l_data=i;//列號
key_num=h_data*4+l_data;
P2=P2&0XE0;//P2低5位送0
P1=P1|0X0F;//P1低4位送1
while((P1|0xf0)!=0xff)//判斷P1低4位是否全為1
{
while((P1|0xf0)!=0xff);
DelayMs(10);//延時10ms
}
return key_num;
}
void float_to_char(float a,char* p)
{
char i,flag,length;
flag=0;
sprintf(p,"%f",a);
length=strlen (p);
for(i=0;i<length;i++)
{
if(*(p+i)=='.')flag=1;
}
if(flag==1)
for(i=length-1;i>=0;i--)
{
if(*(p+i)=='.'){*(p+i)='\0';break;}
if(*(p+i)!='0'){*(p+i+1)='\0';break;}
}
}
/**********************更新液晶*************************/
void refresh()//更新液晶
{
char length,i,j;
char dot;
dot=0;
float_to_char(num2,c_num2);//num2轉為字符型
length=strlen(c_num2);
for(i=0,j=0;i<length;i++)
{
if(c_num2[i]=='.')
dot=1;
if(dot==1)
j++;
}
if(j<len)
{
if(dot==1)
{
for(i=length;i<(length+len-j);i++)
{
c_num2[i]='0';
}
c_num2[i]='\0';
}
else
{
c_num2[length]='.';
if(len-j>1)
{
for(i=length+1;i<(length+len-j);i++)
c_num2[i]='0';
}
c_num2[length+len-j]='\0';
}
}
if(neg_flag==1)//'+/-'按下首位加‘-’
{
length=strlen(c_num2);//計算c_num2長度
for(i=length-1;i>=0;i--)
{
c_num2[i+1]=c_num2[i];
}
c_num2[length+1]='\0';
c_num2[0]='-';
}
if(sqrt_flag==1)
{
length=strlen(c_num2);//計算c_num2長度
for(i=length-1;i>=0;i--)
{
c_num2[i+1]=c_num2[i];
}
c_num2[length+1]='\0';
c_num2[0]=0xe8;//字符根號
}
if(error==0)
{
float_to_char(num1,c_num1);//num1轉為字符型
WriteCommand(0x01); //顯示清屏
ShowString(0,c_num1);
ShowString(1,c_num2);
ShowChar(15,yun_flag);
}else
{
WriteCommand(0x01); //顯示清屏
ShowString(0,"error!!!");
}
}
//鍵值處理
void operation1(char keynum)//按下 ’+、-、*、/處理
{
if(key_last==1)//上次按鍵為 數字、小數點、+/-、sqrt
{
if(neg_flag==1)num2=-num2;//'+/-'按下
if(sqrt_flag==1)//sqrt按下
{
if(num2>=0)
num2=sqrt(num2);
else
error=1;
}
if(yun_flag=='+')num1=num1+num2; //按下的是‘+’
if(yun_flag=='-')num1=num1-num2;//按下的是‘-’
if(yun_flag=='*')num1=num1*num2;//按下的是‘*’
if(yun_flag=='/')//按下的是‘/’
{
if(num2!=0)
num1=num1/num2;
else
error=1;
}
num2=0;//num2清零
sqrt_flag=0;//sqrt_flag清零
neg_flag=0;//neg_flag清零
pos_flag=1;//pos_flag回1
}
if(keynum==4)yun_flag='+';//yun_flag更新
if(keynum==8)yun_flag='-';
if(keynum==12)yun_flag='*';
if(keynum==16)yun_flag='/';
len=0;
key_last=0;//key_last更新
refresh();
}
//////////////////////////////////////////////////////
void operation2(char keynum)//輸入數字
{
float Data1;
if(keynum==1)Data1=7;//分析輸入數字
if(keynum==2)Data1=8;
if(keynum==3)Data1=9;
if(keynum==5)Data1=4;
if(keynum==6)Data1=5;
if(keynum==7)Data1=6;
if(keynum==9)Data1=1;
if(keynum==10)Data1=2;
if(keynum==11)Data1=3;
if(keynum==13)Data1=0;
if(pos_flag==1)//更新num2
num2=num2*10+Data1;
else
{
num2=num2+(Data1/pos_flag);
pos_flag=pos_flag*10;
len++;
}
key_last=1;//更新key_last
refresh();
}
////////////////////////////////////////////////////////////
void operation3()//輸入小數點
{
if(pos_flag==1)//首次出現小數點
{
pos_flag=pos_flag*10;//小數位權*10
len++;
}
key_last=1;//更新key_last
refresh();//更新液晶
}
/////////////////////////////////////////////////////
void operation4()//輸入'='
{
if(neg_flag==1)num2=-num2;//'+/-'按下
if(sqrt_flag==1)//sqrt按下
{
if(num2>=0)
num2=sqrt(num2);
else
error=1;
}
if(yun_flag=='+')num1=num1+num2; //按下的是‘+’
if(yun_flag=='-')num1=num1-num2;//按下的是‘-’
if(yun_flag=='*')num1=num1*num2;//按下的是‘*’
if(yun_flag=='/')//按下的是‘/’
{
if(num2!=0)
num1=num1/num2;
else
error=1;
}
num2=0;//num2清零
sqrt_flag=0;//sqrt_flag清零
neg_flag=0;//neg_flag清零
pos_flag=1;//pos_flag回1
yun_flag='+';//yun_flag更新
len=0;
key_last=0;//key_last更新
refresh();
}
////////////////////////////////////////////////////
void operation5()//輸入clear all
{
num1=0;// num1清零
num2=0;//num2清零
sqrt_flag=0;//清sqrt_flag
neg_flag=0;// 清neg_flag
pos_flag=1;// Pos_flag=1
yun_flag='+';// yun_flag(為'+')
error=0;//清error
len=0;
key_last=0;//更新key_flag
refresh();//更新液晶
}
///////////////////////////////////////////////////////
void operation6()//輸入'C'
{
num2=0;//num2清零
sqrt_flag=0;//清sqrt_flag
neg_flag=0;//清neg_flag
pos_flag=1;//pos_flag=1
len=0;
key_last=0;//key_last
refresh();//更新液晶
}
////////////////////////////////////////////////////////////
void operation7()//輸入'+/-'
{
if(neg_flag==0)//neg_flag反轉
neg_flag=1;
else neg_flag=0;
key_last=1;//key_last
refresh();// 更新液晶
}
/////////////////////////////////////////////////////////////
void operation8()//輸入'sqrt'
{
if(sqrt_flag==0)//sqrt_flag反轉
sqrt_flag=1;
else sqrt_flag=0;
key_last=1;//更新key_last
refresh();//更新液晶
}
//鍵值分析
void key(char keynum)
{
switch(keynum)
{
case 4 :
case 8 :
case 12:
case 16://+、-、*、/
{
if(error==0)
operation1(keynum);
break;}
case 1 : //數字7
case 2 : //數字8
case 3 : //數字9
case 5 : //數字4
case 6 : //數字5
case 7 : //數字6
case 9 : //數字1
case 10 : //數字2
case 11 : //數字3
case 13 : //數字0
{
if(error==0)
operation2(keynum);
break;}
case 14 ://小數點
{
if(error==0)
operation3();
break;}
case 15 :// '='
{
if(error==0)
operation4();
break;}
case 17 :// clear all
{
operation5();
break;}
case 18 :// 'C'
{
if(error==0)
operation6();
break;}
case 19 :// '+/-'
{
if(error==0)
operation7();
break;}
case 20 ://sqrt
{
if(error==0)
operation8();
break;}
}
}
main()
{
InitLcd(); //初始化LCD
DelayMs(15); //延時保證信號穩定
refresh();
//延時保證信號穩定
while(1)
{
key(scan());
}
}
復制代碼
作者:
xy0821
時間:
2018-12-4 11:17
大神幫忙看看什么問題
作者:
732511054
時間:
2018-12-4 11:21
這種情況你可以復查下你的引腳是否接錯,看看你的程序有沒有錯誤,重新在試下,如果程序可以在電腦上運行,那說明你的板子有問題,可以重新檢測然后打板子。
作者:
Huazx
時間:
2018-12-4 11:42
或許是你板子沒焊接好。引腳接錯。程序下載錯。。一個個排查吧
作者:
小貓貓愛吃魚
時間:
2018-12-4 12:10
如果是PCB,把PCB板子圖發一下
1、檢查電源
2、檢查晶振
3、檢查復位
4、檢查液晶管腳
5、可以聯系我
作者:
ysandi
時間:
2018-12-4 14:02
圖錯了,U1的40腳到VCC干嘛串個10K電阻?
作者:
wulin
時間:
2018-12-4 14:18
你的原理圖上單片機電源腳(40PIN)串聯了一個10K電阻,如果PCB也是這樣,那怎么可能正常工作???
作者:
ahshmj
時間:
2018-12-4 16:44
除了電源的電阻錯誤外,不知你的EA腳接的是什么?接高電平了沒有?
作者:
哈嘍哈
時間:
2018-12-4 17:30
仿真可以不代表做實物的時候可以,電路設計時有要注意布局,布局不好會影響單片機的工作的
作者:
yaoji123
時間:
2018-12-4 20:26
液晶寫命令、寫數據時,要判斷一下是否完成。在你程序中沒有。/******************************************************************/
/* */
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
/* */
/******************************************************************/
bit LCD_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
LCD_delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久伊人免费视频
|
4h影视
|
色综合色综合色综合
|
日本久久精
|
亚洲网站在线观看
|
日韩精品一区二区三区在线播放
|
成年人黄色一级片
|
欧美日韩在线综合
|
在线观看免费av网
|
久久岛国
|
久久久成人免费一区二区
|
伊人免费视频二
|
一区二区三区在线
|
欧美成ee人免费视频
|
久久久久国产一区二区三区四区
|
a级黄色片在线观看
|
亚洲视频一区二区三区
|
国产精品精品久久久
|
亚洲va在线va天堂va狼色在线
|
黄色国产在线视频
|
欧美三级视频在线观看
|
成人午夜电影在线观看
|
国产激情
|
欧美日一区二区
|
欧美日韩在线精品
|
欧美色综合天天久久综合精品
|
天天插天天操
|
粉嫩一区二区三区国产精品
|
国产在线一区二区
|
日韩成人在线视频
|
久久不卡
|
黄色网址在线免费观看
|
亚洲一区久久
|
www.操.com
|
久久精品国产一区二区三区
|
九色porny自拍视频
|
国产农村妇女毛片精品久久麻豆
|
午夜不卡一区二区
|
在线视频一区二区
|
国产乱xxav
|
国产一区二区三区网站
|