📄 jian+xianshi2.c
字号:
#include <reg51.h>
#include <intrins.h>
typedef bit BOOL ;
sbit rs = P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
#define key P0
unsigned char code Q[]={'0','1','2','3','4','5','6','7','8','9','.','m','V','A','W'};
//unsigned char code Q[]={0,1,2,3,4,5,6,7,8,9};
unsigned char c=0,k=0,a=0,temp1=0;
unsigned long temp=0;
unsigned char dis1[16]={"Frequnevy: "};
void delay(unsigned char ms)
{ // 延时子程序
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++);
}
}
/*void longdelay(unsigned char s) //长延时
{
while(s--)
{
delay(60);
}
}*/
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
result = (BOOL)(P1 & 0x80);
ep = 0;
return result;
}
void lcd_wcmd(unsigned char cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
P1 = cmd;
ep = 1;
ep = 0;
}
void lcd_pos(unsigned char pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(unsigned char dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P1 = dat;
ep = 1;
ep = 0;
}
void lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //function set
delay(1);
lcd_wcmd(0x38); //function set
delay(1);
lcd_wcmd(0x08); //display on/off
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x06); //entry mode set
delay(1);
lcd_wcmd(0x0c); //entry mode set
delay(1);
}
/*---------------
函数名称:display()
功能 :在LCD上显示数组的数据
说明 :先写显示地址,后写显示数据
调用 :lcd_wcmd(), lcd_pos()
入口参数:pos 写入的位置,q指向要写入的数据所在的数组
返回值 :无
----------------*/
void display(unsigned char pos, unsigned char *q)
{
unsigned char i;
//lcd_wcmd(0x01); //clear
//delay(10);
lcd_pos(pos);
for(i=0;i<16;i++)
{
lcd_wdat(*q);
q++;
//longdelay(2);
//delay(1);
}
//delay(20);
}
//...........................
//判断有无按键按下
bit judge_hitkey()
{
unsigned char scancode,keycode;
scancode=0xf0;
key=scancode; //P1.4~P1.7全为1;
keycode=key;
if(keycode==0xf0)
return(0);
else
return(1);
}
//............................
unsigned char scan_key() //判断是哪一行哪一列
{
unsigned char scancode,keycode;
scancode=0xef;
while(scancode!=0xff)
{
key=scancode;
keycode=key;
if((keycode&0x0f)!=0x0f)
break; //找到按键的地方,跳出
scancode=(keycode<<1)|0x0f; //没找到扫描新的一行
//display(0x00,dis1);
}
keycode=~keycode;//++k;
return(keycode);
}
//............................
//各按键的功能
void key_Function(unsigned char keycode)
{
switch(keycode)
{
default:
case 0x11:
c=Q[7];a=7;
break;
case 0x12:
c=Q[8];a=8;
break;
case 0x14:
c= Q[9];a=9;
break;
case 0x18:
c=Q[12];
break;
case 0x21:
c=Q[4];a=4;
break;
case 0x22:
c=Q[5];a=5;
break;
case 0x24:
c=Q[6];a=6;
break;
case 0x28:
c=Q[12];
break;
case 0x41:
c=Q[1];a=1;
break;
case 0x42:
c=Q[2];a=2;
break;
case 0x44:
c=Q[3];a=3;
break;
case 0x48:
c=Q[11];
break;
case 0x81:
c=Q[0];a=0;
break;
case 0x82:
c=Q[10];
break;
case 0x84:
c=Q[10];
break;
case 0x88:
c=Q[10];
break;
}
}
//...............................
//按键扫描功能的实现
Key_Program()
{
unsigned char key_code;
if(judge_hitkey())
{
delay(1);
if(judge_hitkey())
{
key_code=scan_key();
while(judge_hitkey());
k++;//temp=temp*10+a;
key_Function(key_code);
// return(temp);
}
}
}
/////.................
main()
{
/*P0=0xff;
P1=0xff;
P2=0xff;*/
lcd_init(); // 初始化LCD
delay(10);
while(1)
{
if(k>6||k==0)
{k=0;
dis1[10]='0';
dis1[11]='0';
dis1[12]='0';
dis1[13]='0';
dis1[14]='0';
dis1[15]='0';
temp=0;
}
/*if(k!=temp)
{
switch(k)
{ default:
case 0:break;
case 1:dis1[15]=c;break;
case 2:dis1[14]=c;break;
case 3:dis1[13]=c;break;
case 4:dis1[12]=c;break;
case 5:dis1[11]=c;break;
case 6:dis1[10]=c;break;
}
}*/
/* switch(k)
{
default:
case 0:break;
case 1:temp1=c;break;
case 2:temp2=c;break;
case 3:temp3=c;break;
case 4:temp4=c;break;
case 5:temp5=c;break;
case 6:temp6=c;break;
}*/
if(temp1!=k)
{
temp=temp*10+a;
dis1[15]=Q[temp%10];
dis1[14]=Q[temp/10%10];
dis1[13]=Q[temp/100%10];
dis1[12]=Q[temp/1000%10];
dis1[11]=Q[temp/10000%10];
dis1[10]=Q[temp/100000%10];
}
display(0x00,dis1);
temp1=k;
Key_Program();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -