標題:
關(guān)于單片機lcd1602多級菜單的顯示
[打印本頁]
作者:
圣無名
時間:
2017-4-18 10:46
標題:
關(guān)于單片機lcd1602多級菜單的顯示
這是自己寫的一個程序 沒有往上面寫1602的.h文件
不知道哪里出了問題,總是不能實現(xiàn)按下k1進入第一個菜單,按下k2進入第二個菜單,按下k3返回的功能 求大神給看一下吧 萬分感謝
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
static flag =3; //標記
void delay(u16 i) //延時
{
while(i--);
}
void menu0 ()
{
Lcd1602_Write_Cmd(0x01);
LcdShowStr(0,0," welcome ") ;
}
void menu1 ()
{
Lcd1602_Write_Cmd(0x01);
LcdShowStr(0,0," nihao ") ;
}
void keyvalue()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
flag=0;
}
}
else
{
flag=3;
}
while(!k1);
if(k2==0)
{
delay(1000) ;
if(k2==0)
{
flag=1;
}
}
else
{
flag=3;
}
while(!k2);
}
void key()
{
keyvalue();
switch(flag)
{
case 0:
{
menu0();
if(k3==0)
{
delay(1000);
if(k3==0)
{
flag=3 ;
}
}
while(!k3);
break;
}
case 1:
{
menu1();
if(k3==0)
{
delay(1000);
if(k3==0)
{
flag=3 ;
}
}
while(!k3);
break;
}
case 3:
{
u8 i;
for(;i<10;i++)
{
Lcd1602_Write_Data('C');
}
break;
}
}
}
void main(void)
{
InitLcd1602();
while(1)
{
key();
}
}
復(fù)制代碼
作者:
admin
時間:
2017-4-19 04:00
現(xiàn)在這樣能顯示什么?
作者:
admin
時間:
2017-4-19 04:00
現(xiàn)在這樣能顯示什么?
作者:
octcity
時間:
2017-4-19 08:22
請多描述一下
作者:
圣無名
時間:
2017-4-19 09:54
admin 發(fā)表于 2017-4-19 04:00
現(xiàn)在這樣能顯示什么?
不能,應(yīng)該是賦值出現(xiàn)問題了。具體的還在想....
作者:
bayga456
時間:
2017-4-19 10:07
static flag =3;//這fiag要不要申明是什么類型?
if(k1==0) 當(dāng)k1按下
{
delay(1000); 防抖
if(k1==0) 確定k1按下
{
flag=0;
}
}
else 如果k1沒按下
{
flag=3;
}
while(!k1); 等待k1松開
意思就是說:k1按下flag=0;當(dāng)程序再次掃描按鍵檢測子函數(shù)時,因為沒有按鍵按下,所以flag=3,如果其它子程序沒問題,很可能一直停止在flag=3的顯示頁面。把if(k==0)后面的else內(nèi)容都去掉應(yīng)該就可以了。
以上如不對,請見諒。
作者:
FxMan
時間:
2017-4-19 10:52
看看 ,學(xué)習(xí) 我是小白。
作者:
XIN_XIN
時間:
2017-4-19 15:43
在多機通信中,主機必須要能對各個從機進行識別,在51系列單片機中可以通過SCON寄存器的SM2位來實現(xiàn)。當(dāng)串口以方式2或方式3發(fā)送數(shù)據(jù)時,每一幀信息都是11位,第9位是數(shù)據(jù)可編程位,通過給TB8置1或置0來區(qū)別地址幀和數(shù)據(jù)幀,當(dāng)該位為1時,發(fā)送地址幀;該位為0時,發(fā)送數(shù)據(jù)幀。 在多機通信過程中,主機先發(fā)送某一從機的地址,等待從機的應(yīng)答,所有的從機接收到地址幀后與本機地址進行比較,若相同,則將SM2置0準備接收數(shù)據(jù);若不同,則丟棄當(dāng)前數(shù)據(jù),SM2位不變。
作者:
圣無名
時間:
2017-4-19 16:21
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
static int flag =0; //標記
void delay(u16 i) //延時
{
while(i--);
}
void menu0 ()
{
Lcd1602_Write_Cmd(0x01);
LcdShowStr(0,0," hello ") ;
delay(1000);
}
void menu1 ()
{
Lcd1602_Write_Cmd(0x01);
LcdShowStr(0,0," welcome ") ;
delay(1000);
}
void menu2 ()
{
Lcd1602_Write_Cmd(0x01);
LcdShowStr(0,0," nihao ") ;
delay(1000);
}
void keyscan()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
flag=1;
}
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
flag=2;
}
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
flag=0;
}
}
}
void menu()
{
keyscan();
switch(flag)
{
case 0:
{
menu0();
}
break;
case 1:
{
menu1();
break;
}
case 2:
{
menu2();
break;
}
}
}
void main(void)
{
InitLcd1602();
while(1)
{
menu();
delay(5000);
}
}
已經(jīng)改好了具體的功能是一開始顯示第一個菜單hello 當(dāng)?shù)谝话存I按下時顯示第二個菜單,welcome,當(dāng)?shù)诙䝼按鍵按下時顯示第第三個菜單,當(dāng)?shù)谌齻按鍵按下時,顯示第一個菜單,也就是返回鍵。一開始的程序里面沒想清楚switch語句的用法所以搞錯了 。謝謝各位啦。具體的菜單想要什么就改動就可以了~
作者:
老來所學(xué)
時間:
2017-5-19 21:48
想請問, LcdShowStr(0,0," welcome ") ;這句話中的函數(shù)在H文件中怎么寫的
作者:
18750930984
時間:
2017-9-24 22:03
謝謝。。。。。。。。
作者:
wxc19960311
時間:
2017-9-26 20:03
keyvalue()這個子函數(shù)用了嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1