51单片机
一个按键按一下LCD1602上出现01,之后按第二下变成01 02,第三下01 02 03,之后以此类推。
另一个按键按一下队伍的第一个数就会消失
且要队伍事实显示在LCD1602上。
首先你要解决LCD1602的显示问题,例如做成函数Display1602(row,col,data),实现在第row行,第col列显示数据data,没问题后再考虑键盘处理的事情,建立一个队列,key1按一下,队列长度加一,新增数据数据就是队列长度,然后根据长度,一个for循环把队列数据显示就可以了,另一个按键按下时,清除队列,显示自动就空了。
///LCD1602液晶显示配置
/写命令/
void cmd_w(uchar cmd)
{
RW=0;
RS=0;
E=1;
P1=cmd;
delay(1);
E=0;
}
/写数据/
void dat_w(uchar dat)
{
RW=0;
RS=1;
E=1;
P1=dat;
delay(1);
E=0;
}
/清屏/ /
void lcd_clear(void)
{
cmd_w(0x01); //清屏
cmd_w(0x02); //清屏回到左上角
} */
/*初始化/
void Lcd1602_init(void)
{
cmd_w(0x38);
cmd_w(0x0c);
cmd_w(0x06);
cmd_w(0x01);
cmd_w(0x80);
}
/光标定位*/
void gotoxy(uchar x,uchar y) //x是行数,y是列数
{
if(x==1)
{cmd_w(0x80+y);}
else
{cmd_w(0xc0+y);}
}
void dsp_ch(uchar _ch)
{
dat_w(_ch);
}
///LCD1602液晶显示
void inputbyte(unsigned char dat)
{
unsigned char i;
for ( i=8; i>0; i-- )
{
SCLK_1302 = 0;
NOP;
NOP;
if(dat&0x01)
{
DIO_1302 = 1;
}
else
{
DIO_1302 = 0;
}
NOP;
NOP;
dat >>= 1;
SCLK_1302 = 1;
NOP;
NOP;
NOP;
NOP;
}
}
unsigned char outputbyte(void)
{
unsigned char i;
unsigned char dat=0;
for ( i=8; i>0; i-- )
{
dat >>= 1;
NOP;
NOP;
SCLK_1302 = 0;
NOP;
NOP;
if(DIO_1302)
{
dat|=0X80;
}
NOP;
NOP;
SCLK_1302 = 1;
NOP;NOP;NOP;NOP;
}
return(dat);
}
void write1302 ( unsigned char addr,dat )
{
CE_1302 = 0;
NOP;
NOP;
SCLK_1302 = 0;
NOP;
NOP;
CE_1302 = 1;
NOP;NOP;NOP;NOP;
inputbyte(addr);
inputbyte(dat);
CE_1302 = 0;
}
unsigned char read1302 (unsigned char addr)
{
unsigned char dat,data_buff;
CE_1302 = 0;
NOP;
NOP;
SCLK_1302 = 0;
NOP;
NOP;
CE_1302 = 1;
NOP;NOP;NOP;NOP;
inputbyte(addr);
dat=outputbyte();
SCLK_1302 = 1;
NOP;
NOP;
CE_1302 = 0;
data_buff=dat;
data_buff/=16;
dat=dat%16;
dat=data_buff*10+dat;
return (dat);
}
按键部分较为简单,没有按下按键,对应IO口是高电平,按键按下,对应IO口接地,是低电平。单片机检测各个按键IO口电平,判断按键状态。
最后在main.c里面while1配合按键调用上面的写lcd1602函数就可以实现显示任意内容。
有问题可私信我,望采纳。
按键按下后判断按下的次数,第1次在坐标比如0 ,0 的地方显示1 第2次在坐标 1,0的位置显示02 第3次在坐标 2, 0 的位置显示03。另一个按键按下的时候根据次数把0 ,0的显示清除 就是一个坐标的计算
这种题目还要问么,自己想,想不出来还是建议换了吧,嘿嘿