按K2按钮不会显示,
- #include <REGX51.H>
- #include <stdio.h>
- #define u16 unsigned int
- #define u8 unsigned char
- #define DbPins P0 // 宏定义将P0口用DbPins表示
- sbit E = P2^7;
- sbit RS = P2^6;
- sbit RW = P2^5;
- sbit K1 = P3^1; // 四个独立按键
- sbit K2 = P3^0;
- sbit K3 = P3^2;
- sbit K4 = P3^3;
- sbit led1 = P2^0; //左转向灯
- sbit led2 = P2^2; //右转向灯
- u16 sign; // 用于判断有无按键被按下 ,0表示有按键按下,1表示没有按键按下
- u8 string1_K4[]="left_light_shan";
- u8 string2_K4[]="shan 10 xia";
- u8 string1_K3[]="right_light_shan";
- u8 string2_K3[]="shan 10 xia";
- u8 string3[]="IT class 2 huang yuxing";
- u16 Key_value; //用于接收键值的全局变量
- u8 string1[]="IT class 2"; //定义要显示的字符
- u8 string2[]="huang yuxing";
- void delay(u16 ms)
- {
- u16 a,b;
- for(;ms>0 ; ms--)
- {
- for(b=199;b>0;b--)
- {
- for(a=1;a>0;a--) ;
- }
- }
- }
- // 写入命令函数
- void LcdWriter(u8 com)
- {
- E = 0; //使能信号,1时读取信息,下降沿时执行指令
- RS = 0; //低电平表示输入指令,高电平表示输入数据
- RW = 0; //高电平向lcd读取信息,低电平向lcd输入指令或数据
- DbPins = com; //写入命令
- delay(1); // 延时 保持数据稳定性
- E = 1; //写入时序
- delay(5); //保持时间
- E = 0; //下降沿执行指令
- }
- // 输出函数
- void LcdPrint(u8 date)
- {
- E = 0; // 使能清零
- RS = 1; // 选择写入数据
- RW = 0; //选择写入
- DbPins = date; // 写入数据
- delay(1); // 延时1ms
- E = 1; // 读取信息
- delay(5); //保持时间
- E = 0; // 下降沿执行指令
- }
- // 初始化函数
- void Lcdinit()
- {
- LcdWriter(0x38); //开显示,数据总线为8位显示两行,每个字符为5*7的点阵,
- LcdWriter(0x0c); // 开显示,不显示光标
- LcdWriter(0x06); // 写一个指针加1,向右移动
- LcdWriter(0x01); // 清屏
- LcdWriter(0x80); // 设置数据指针起点
- }
- void out_put1()
- {
-
- u16 i,j,len1,len2;
- Lcdinit();
- len1 = sizeof(string1)-1; // 计算字符串长度
- len2 = sizeof(string2)-1;
- for(i=0;i<len1;i++)
- {
- LcdPrint(string1[i]);
- }
-
- LcdWriter(0x40+0x80);
- for(i=0;i<len2;i++)
- {
- LcdPrint(string2[i]);
- }
- LcdWriter(0x07); // 写一个指针加1,向右移动
- j=50;
- while(j--)
- for(i=0;i<len1;i++)
- {
- LcdPrint(string3[i]);
- delay(250);
- }
- }
- void out_put()
- {
- u16 i,len1,len2;
- Lcdinit(); //初始化
-
- len1 = sizeof(string1)-1; // 计算字符串长度
- len2 = sizeof(string2)-1;
- for(i=0;i<len1;i++)
- {
- LcdPrint(string1[i]);
- }
-
- LcdWriter(0x40+0x80);
- for(i=0;i<len2;i++)
- {
- LcdPrint(string2[i]);
- }
- while(1);
- }
- // 输出按下K4输出的
- void out_put_K4()
- {
-
- u16 i,len1,len2;
- Lcdinit();
- len1 = sizeof(string1_K4)-1; // 计算字符串长度
- len2 = sizeof(string2_K4)-1;
- for(i=0;i<len1;i++)
- {
- LcdPrint(string1_K4[i]);
- }
-
- LcdWriter(0x40+0x80);
- for(i=0;i<len2;i++)
- {
- LcdPrint(string2_K4[i]);
- }
- }
- // 输出按下K3输出的
- void out_put_K3()
- {
-
- u16 i,len1,len2;
- Lcdinit();
- len1 = sizeof(string1_K3)-1; // 计算字符串长度
- len2 = sizeof(string2_K3)-1;
- for(i=0;i<len1;i++)
- {
- LcdPrint(string1_K3[i]);
- }
-
- LcdWriter(0x40+0x80);
- for(i=0;i<len2;i++)
- {
- LcdPrint(string2_K3[i]);
- }
- }
- // 模拟独立按键按钮按下
- void K4_but()
- {
- u16 a= 0;
- if (K4==0) //K4按下
- {
- delay(50); //消抖
- if(K4 == 0)
- {
- Key_value = 16;
- }
-
- while((a>50) && (K4 != 0))
- {
- a++;
- }
- sign = 0; // 已有按键被按下
- out_put_K4();
- }
- a= 0;
- if (K3==0) //K3按下
- {
- delay(50); //消抖
- if(K3 == 0)
- {
- Key_value = 17;
- }
-
- while((a>50) && (K3 != 0))
- {
- a++;
- }
- sign = 0; // 已有按键被按下
- out_put_K3();
- }
- a = 0;
- if (K2==0) //K2按下
- {
- delay(50); //消抖
- if(K2 == 0)
- {
- Key_value = 18;
-
- }
-
- while((a>50) && (K2 != 0))
- {
- a++;
- }
- sign = 0; // 已有按键被按下
- out_put_K2();
- }
- a = 0;
- if (K1==0) //K1按下
- {
- delay(50); //消抖
- if(K1 == 0)
- {
- Key_value = 19;
- }
-
- while((a>50) && (K1 != 0))
- {
- a++;
- }
- sign = 0; // 已有按键被按下
- out_put();
- }
- }
- void main()
- {
- u16 i;
- sign = 1; // 无按键被按下
- Lcdinit(); //初始化
- K1 = 1;
- K2 = 1;
- K3 = 1;
- K4 = 1;
- do{
- while(sign)
- {
- K4_but();
- }
- if(Key_value == 16) // 如果k4 按下D1亮
- {
- for(i = 0;i < 10;i++)
- {led1 = 0;
- delay(100);
- led1 = ~led1;
- delay(100);}
- sign = 1;// 按一次,输入一个字符
- }
- else if(Key_value == 17) //如果K3按下D3,亮
- {
- for(i = 0;i < 10;i++)
- {led2 = 0;
- delay(100);
- led2 = ~led2;
- delay(100);}
- sign = 1;// 按一次,输入一个字符
- }
- else if(Key_value == 18)
- {
-
- out_put();
- sign = 1;
- }
- else
- {
- out_put1();
- sign = 1;
- }
- }
- while(1);
- }
复制代码
按按钮k1也不会进入我想要的界面
|