📄 text1.c
字号:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//数据口定义
#define lcd1602_bus P0
//引脚定义
sbit rs_1602=P2^5;
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit alarm=P0^0;
uchar tplsb,tpmsb;
uint temp,tempx;
sbit DQ=P2^0;
uchar state;
uchar bdata adc_549;
sbit adc_549low=adc_549^0;
uchar s;
uchar mea,m[2];
uint in[2];
/*********延时子程序**********/
void delay(uchar t)
{
uchar i;
while(t--)
{
/* 对于11.0592M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/*****************启动总线**********************/
/*****************停止IIC总线****************/
/**************检查应答位*******************/
/*****************不对IIC总线产生应答***************/
/*******************向IIC总线写数据*********************/
/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
uchar busy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus; //e在高电平时读
e_1602=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd1602_wrdata(uchar lcddata)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcddata; //在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd1602_clear(void)
{
lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay(1);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay(1);
lcd1602_wrcmd(0x0e); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay(1);
lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
delay(1);
lcd1602_wrcmd(0x01); //清屏
delay(1);
}
/**********4*4矩阵键盘****************/
/************
矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
D C B A
1〔15 14 13 12〕
2〔11 10 9 8〕
3〔 7 6 5 4〕
4〔 3 2 1 0〕
利用已有的那个按键程序
*************/
void TxReset(void)
{
uint i;
DQ = 0;
/* 拉低约900us */
i = 100;
while (i>0) i--;
DQ = 1; // 产生上升沿
i = 4;
while (i>0) i--;
}
/* 等待应答脉冲 */
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while (i>0) i--;
}
/* 读取数据的一位,满足读时隙要求 */
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/* 读取数据的一个字节 */
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{
/* 写1 */
DQ = 0;
i++;i++; // 延时,使得15us以内拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整个写1时隙不低于60us
}
else
{
/* 写0 */
DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}
/* 启动温度转换 */
void convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
/* 读取温度值 */
void RdTemp(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
}
void gettemp()
{
delay(1); // 延时1ms
convert(); // 启动温度转换,需要750ms
delay(100); // 延时1s
RdTemp();
temp=(tpmsb&0x07)*16+((tplsb&0xf0)>>4);
tempx=tplsb&0x0f;
}
uchar getkey_ii()
{
unsigned char keycode=0xff,temp,i;
P1=0x0f;
temp=P1&0x0f;
if(temp!=0x0f) //判是否有键按下
{
// beep=0;
P1=0xef; //自第0行开始扫描输出,自列读入键值
for(i=0;i<4;i++)
{
temp=P1&0x0f;
if(temp==0x07) //判断第0列是否有键按下
{
keycode=i*4+0;
break;
}
else if(temp==0x0b)//判断第1列是否有键按下
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)//判断第2列是否有键按下
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)//判断第3列是否有键按下
{
keycode=i*4+3;
break;
}
P1=(P1<<1)|0x1;
}
while((P1&0x0f)!=0x0f) //等待释放
{
P1=0x0f;
}
// beep=1;
}
return keycode;
}
/**********lcd1602 测试程序**********************/
//上电后lcd1602 显示
// "System of P.H.Y"
// " Welcome!"
//
//分别按矩阵最右下角的三个按键 分别出现下面几个显示界面:
// key=0 显示
// " 2005/7/28";
// " 20:27";
// key=1 显示
// "<>?+-*/()="
// "`-=\[]/.,;"
// key=2 显示
// "!@#$%^&*()_+|~"
// "!@#$%^&*()_+|~"
void xianshu(unsigned long a)
{ unsigned long c,p=0;
if (a!=0)
{
c=a/10000;
if(c!=0)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%10000)/1000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
c=(a%1000)/100;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
c=(a%100)/10;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
c=a%10+0x30;
lcd1602_wrdata(c);
}
}
void xianshi(uchar j)
{ uchar str[][9]={{"1.temp "},{"2.date "},{"3.tsx "},{"4.four "},{"1.temp "}};
uchar i;
unsigned char offset=0x80;
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
lcd1602_wrcmd(offset+0x00);
lcd1602_wrdata('#');
for(i=0;i<7;i++) lcd1602_wrdata(str[j+0][i]);
lcd1602_wrcmd(offset+0x40);
lcd1602_wrdata(' ');
for(i=0;i<7;i++) lcd1602_wrdata(str[j+1][i]);
}
void main()
{
uchar i;
// uint t;
unsigned char a=30;
uchar j=0; //标记
uchar d[]="2007/07/18";
uchar w[]="warning";
uchar str0='7';
uchar str1='4';
uchar str2='1';
uchar str3=' ';
uchar str4='8';
uchar str5='5';
uchar str6='2';
uchar str7='0';
uchar str8='9';
uchar str9='6';
uchar str10='3';
unsigned char offset=0x80; //定义一个偏移地址变量,lcd1602 写入控制字时用到
unsigned char key;
delay(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(offset+0x00);
xianshi(0);
// lcd1602_clear();
while(1)
{
key=getkey_ii();
if(key==4)
{
j=j+1;
if(j>3)j=0;
xianshi(j);
}
if (key==0)
{
if (j==0) j=4;
j=j-1;
xianshi(j);
}
if(key==2 || ((j==0)&&(key==3)))
{
while(key==2 || key==0xff || key==3)
{key=getkey_ii();
gettemp();
lcd1602_clear();
xianshu(temp);
tempx=tempx*10000/16;
lcd1602_wrdata('.');
xianshu(tempx);
lcd1602_wrdata(' ');
lcd1602_wrdata('*');
lcd1602_wrdata('C');
if (temp>=a)
{
alarm=0;
lcd1602_wrcmd(offset+0x40);
for(i=0;i<8;i++){lcd1602_wrdata(w[i]);delay(10);}
delay(1000);
alarm=1;
}
delay(1000);
}
}
if(key==6 || ((j==1)&&(key==3)))
{
lcd1602_init();
lcd1602_clear();
for(i=0;i<10;i++) lcd1602_wrdata(d[i]);
}
if(key==10 || ((j==2)&&(key==3)))
{ a=0;
lcd1602_clear();
while(key!=15 )
{
key=getkey_ii();
if(key==0)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);//换行
a=a*10+7;
xianshu(a);
//lcd1602_wrcmd(offset+0x40);
// for(i=0;i<11;i++) lcd1602_wrdata(str12[i]);
}
else if (key==1)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+4;
xianshu(a);
//lcd1602_wrcmd(offset+0x40);
//for(i=0;i<15;i++) lcd1602_wrdata(str22[i]);
}
else if (key==2)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+1;
xianshu(a);
// lcd1602_wrcmd(offset+0x40);
// for(i=0;i<15;i++) lcd1602_wrdata(str31[i]);
}
else if (key==4)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+8;
xianshu(a);
}
else if (key==5)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+5;
xianshu(a);
}
else if (key==6)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+2;
xianshu(a);
}
else if (key==7)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+0;
xianshu(a);
}
else if (key==8)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+9;
xianshu(a);
}
else if (key==9)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+6;
xianshu(a);
}
else if (key==10)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+3;
xianshu(a);
}
}
xianshi(0);
j=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -