📄 text3.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//数据口定义
#define lcd1602_bus P3
//引脚定义
sbit rs_1602=P2^5;
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit DQ =P1^0;
//ASCII码表
/**********0---9**************/
unsigned int code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**********a---z**************/
unsigned int code table1[26]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a};
/***********A---Z*************/
unsigned int code table2[26]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};
uchar wtdg,xbz;
//基本变量定义
//uchar cnt;
// unsigned int d[3];
/*
hexstoascii2(unsigned int hex)
{
d[0]=table[hex/10];
hex=hex%10;
d[1]=table[hex];
}
hexstoascii3(unsigned int hex)
{
d[0]=table[hex/100];
hex=hex%100;
d[1]=table[hex/10];
hex=hex%10;
d[2]=table[hex];
}
*/
/**********************************lcd1602******************************************/
/*********延时子程序**********/
void delay(uchar dy)
{
while(--dy);
}
/***********忙判断标志,返回一个位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(100);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay(100);
lcd1602_wrcmd(0x0f); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay(100);
lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
delay(100);
lcd1602_wrcmd(0x01); //清屏
delay(100);
}
/**********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〕
利用已有的那个按键程序
*************/
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 xianshi(unsigned long a)
{ unsigned long c,p=0;
if (a!=0)
{ c=a/100000000;
if(c!=0)
{lcd1602_wrdata(c+0x30);
p=1;
}
delay(100);
c=(a%100000000)/10000000;
if(c!=0 || p==1 )
{lcd1602_wrdata(c+0x30);
p=1;
}
delay(100);
c=(a%10000000)/1000000;
if(c!=0 || p==1 )
{lcd1602_wrdata(c+0x30);
p=1;
}
delay(100);
c=(a%1000000)/100000;
if(c!=0 || p==1 )
{lcd1602_wrdata(c+0x30);
p=1;
}
delay(100);
c=(a%100000)/10000;
if(c!=0 || p==1 )
{lcd1602_wrdata(c+0x30);
p=1;
}
delay(100);
c=(a%10000)/1000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
delay(100);
c=(a%1000)/100;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
delay(100);
c=(a%100)/10;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
delay(100);
c=a%10+0x30;
lcd1602_wrdata(c);
delay(100);
}
}
void delay1820(unsigned int i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
wtdg=!wtdg;
DQ = 1; //DQ复位
delay1820(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay1820(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay1820(14);
xbz=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay1820(20);
DQ=1;
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
wtdg=!wtdg;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay1820(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
wtdg=!wtdg;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay1820(5);
DQ = 1;
dat>>=1;
}
delay(4);
}
void Config18b20()
{
Init_DS18B20();
WriteOneChar(0xcc); //skip rom
WriteOneChar(0x4e); //write scratchpad
WriteOneChar(0x55); //上限
WriteOneChar(0x00); //下限
WriteOneChar(0x7f); //set 11 bit (0.125)
Init_DS18B20();
WriteOneChar(0xcc); //skip rom
WriteOneChar(0x48); //保存设定值
Init_DS18B20();
WriteOneChar(0xcc); //skip rom
WriteOneChar(0xb8); //回调设定值
}
uint ReadTemperature()
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
unsigned int g;
Config18b20();
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(500);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
DQ=1;
g=b<<8; //最终数据在a和b中,怎么处理你自己用吧 呵呵
g=g|a;
g=g*0.625; //这是转换成具体温度值,1点代表0.625°C
return(g);
}
void main()
{
uchar i;
// uint t;
uchar s1[]="tempretrue:";
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';
uchar str11='=';
uchar str12='/';
uchar str13='*';
uchar str14='-';
uchar str15='+';
unsigned long c,a=0,b,t;
uchar j; //标记加减乘除
unsigned char offset=0x80; //定义一个偏移地址变量,lcd1602 写入控制字时用到
unsigned char key;
// unsigned int count1=10;
// unsigned int count2=297;
delay(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<10;i++) lcd1602_wrdata(s1[i]);
t=ReadTemperature();
xianshi(t);
// for(i=0;i<2;i++) lcd1602_wrdata(s2[i]+0x30);
// lcd1602_wrcmd(offset+0x40);
// for(i=0;i<11;i++) lcd1602_wrdata(str02[i]);
// lcd1602_clear();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -