📄 1820.c
字号:
#pragma SMALL // LARGE
#include <absacc.h>
#include <string.h>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define C_ad 5
/*----------------------------------------*/
/*温度值 二进制数据输出 16进制输出
+125℃ 0000011111010000 07D0H
+85℃ 0000010101010000 0550H*
+25.0625℃ 0000000110010001 0191H
+10.125℃ 0000000010100010 00A2H
+0.5℃ 0000000000001000 0008H
0℃ 0000000000000000 0000H
-0.5℃ 11111111111111000 FFF8H
-10.125℃ 1111111101011110 FF5EH
-25.0625℃ 1111111001101111 FE6FH
-55℃ 1111110010010000 FC90H*/
/*----7219----*/
sbit load=P1^1;
sbit clk=P1^2;
sbit din=P1^0;
/* ------------lcd-------*/
#define clear 0x01 //清屏幕,约1.6ms
#define home 0x02 //光标回零(左上角)/
#define f_set 0x30 //并行、基本指令 ?????
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
#define C_ad 5
sbit P_RS=P0^7;
sbit P_RW=P0^6;
sbit P_E= P0^5;
/*----5045----*/
sbit acc=0xe0;
sbit cy=0xd7;
//sbit load2=P3^1;
sbit x25_cs=P1^4; //5045 1pin
//sbit dout25=P1^4;
sbit x25_clk=P1^6; // 5045 6pin
sbit x25_din=P1^7; //5045 5pin //5045 3pin 接vcc ,4pin 接 gnd ,7pin 接 reset ,8pin 接 vcc
sbit dout=P1^5; //5045 2pin
/*-----------------*/
data union{
uchar tp[2];
uint temp;
}tt;
//uchar temp[2];
bit f_exit;
bit flag_sign;
sbit Inda=P3^1; //Inda=P1^7; //数据转换中间变量
bdata uchar ab,bc;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
data uchar str2[6];
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void bit8_serial_input(uchar ix)
{
data uchar i,j,nc;
P_E=0; //clk=0; P_E为sclk P_RW为 sid
ab=ix;
for(i=0;i<8;i++){
P_RW=abit7; //din=abit7;
ab<<=1;
P_E=1;
for(j=0;j<10;j++)nc=0; //延时
P_E=0;
}
}
void instruct(uchar dat)
{
data uchar ch;
P_RS=1; //选通
ch=0xf8; ///1111 1110 按照时序前五位必须为1 六七位任意 八位为0
bit8_serial_input(ch); //sid前八位
ch=dat&0xf0; //连接dat与0xf0 取higher data
bit8_serial_input(ch);
ch=dat<<4; //左移动4位 取lower data
bit8_serial_input(ch); //80送到液晶里表示什么意义 instruct中无此命令
P_RS=0; //结束作业 1 byte发完
}
void write_abyte(uchar dat)
{
data uchar ch;
P_RS=1; //读数据--选通 选通
ch=0xfa; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/*
写一个汉字到x,Y坐标处其中X为8列y为4行
*/
void write_word(uint w) //w为双字节变量
{
data uchar ch,cl;
ch=w>>8;
cl=w; //w右移8位给ch 那cl直接取 w 低8位
write_abyte(ch);
write_abyte(cl);
}
dis_hz(uchar x, uchar y, uint *p_hz) //单个汉字、字符显示、两个字母
{
data uchar loc;
data uint hz;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home); //光标home
loc=((x<<3)+y-9)|0x80; //??"|"
instruct(loc); hz=*p_hz; //loc 不同导致开始显示层数不同?????
write_word(hz);
}
dis_hz_str(uchar x, uchar y, uint *p_hz) //功能 汉字字符串显示
{
data uchar loc;
data uint *p;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home);
loc=((x<<3)+y-9)|0x80;
instruct(loc);
p=p_hz;
while(*p){
write_word(*p++);
}
}
/*
显示字母数字在x,y处
*/
void dis_str(uchar x, uchar y, uchar *str) // 多个数字字母 显示
{
data uchar loc,*p;
code uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1); //loc=16*(1-1)+10-1=9 如何
if(loc&0x01){
loc/=2;
instruct(loc|0x80);
//ch=' '; //字符串前加空格(0x20 )
write_abyte(' ');
}else{
loc/=2;
instruct(loc|0x80);
}
while(*p){
write_abyte(*p++); //str为字符串 p为字符串写的时候一个一个字写
}
}
void initial(void) //光标置左上角
{
data uchar i,j;
P0=0xff;
P_RS=0; //串行--不选通
//P_PSB=0;
P_E=0; //串行方式
instruct(f_set); //0x30; //8位并行接口 基本指令 用串行方式 这句是不是没用
for(i=0;i<30;i++){}
for(i=0;i<250;i++){} //等待液晶屏反应
for(i=0;i<250;i++){}
instruct(f_set); //0x30; //8位并行接口 基本指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(dis_on); //0x0f); //开启屏幕 光标 闪烁
for(i=0;i<30;i++){} //维持高电平 等待液晶反应
instruct(clear); //0x01); //清屏幕 clear
for(j=0;j<10;j++){
for(i=0;i<250;i++){} //1.6ms
}
instruct(in_mode); //0x06); //光标右移、地址增1 方式 液晶屏接受信息的形式
for(i=0;i<30;i++){}
instruct(home); //光标复位(行首)
}
/*---------------------------------------------------------*/
//void itoa(int x,unsigned char *str2)
void itoa(int x)
{ //功能 二进制转为ascii码
data unsigned int n;
data unsigned char chn,*p,*p2,str1[5];
data unsigned char i,j;
p2=str2;
if(x<0){
*p2++='-';
x=-x;
}
n=x;
p=&str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*p2++=*p--;
}
else *p2++='0';
*p2=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void rst_wdog(void)
{
x25_cs=0;
x25_cs=1;
}
/*----------------------------------------*/
void delay10(uchar j) /* time=j*10+7 */
{
uchar ch;
while(j--)
{
ch++; ch++;
}
/*
_nop_();
_nop_();};
*/
}
/*---------------------------------------*/
uchar inti(void)
{
data uchar i=3;
do{ //连续检测4次,看是否存在温度传感器
Inda=0;
delay10(50); //发511us复位脉冲
Inda=1; //等待应答脉冲
delay10(6);
if (!Inda) //存在应答脉冲返回1
return(1);
delay10(250);
}
while(i--);
return(0); //4次检测失败返回无传感器
}
/*----------------------------------------*/
void Outwrite(uchar str)
{
data uchar i;
ab=str;
for(i=0;i<8;i++){
Inda=0;
delay10(1);
Inda=abit0;
ab>>=1;
delay10(4);
Inda=1;
_nop_();
_nop_();
}
}
/*----------------------------------------*/
void Outread(void) /*读失败时 str=[0xff,0xff]*/
{
data uchar i,j;
for (i=0;i<2;i++){
for(j=0;j<8;j++){
ab>>=1;
Inda=1;
_nop_();
_nop_();
Inda=0;
_nop_();
_nop_();
Inda=1;
delay10(1);
abit7=Inda;
}
tt.tp[1-i]=ab;
//temp[i]=ab;
}
}
/*----------------------------------------*/
void Wroutds()
{
f_exit=inti();
if(f_exit)
{
delay10(250);
delay10(250);
Outwrite(0xcc); //省去与ROM的有关操作
Outwrite(0x44); //启动温度传感器
}
}
/*----------------------------------------*/
uchar Rdoutds(void)
{
f_exit=inti();
if(f_exit){
delay10(250);
delay10(250);
Outwrite(0xcc);
Outwrite(0xbe);
Outread();
}
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void delay(uchar n)
{
data uchar i,j,k,ch;
for(i=0;i<n;i++){
for(j=0;j<250;j++){
for(k=0;k<25;k++){
rst_wdog();
}
}
}
}
/*---------------------------------------------------------*/
/*void dis_7219(uchar iw,uchar ix,uchar chl,uchar chh)
{
uchar i,j,nc;
clk=0;
load=0;
for(j=0;j<5;j++)nc=0;
ab=iw;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout; dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=ix;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=chl;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout; dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=chh;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
load=1;
}
/*---------------------------------------------------------*/
/*void itoa(int x,unsigned char *str)
{
unsigned int n;
unsigned char chn,*p,str1[5];
data unsigned char i,j;
if(x<0){
*str++='-';
x=-x;
}
n=x;
p=str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*str++=*p--;
}
else *str++='0';
*str=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*void dis_7219(uchar iw,uchar ix) /*串性数据发送*/
/*{
uchar i,j,nc;
clk=1;
for(j=0;j<10;j++)nc=0;
load=1;
iw=~iw; //~????????????
ab=iw;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
clk=0;
for(j=0;j<10;j++)nc=0;
clk=1;
}
ix=~ix;
ab=ix;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
clk=0;
for(j=0;j<10;j++)nc=0;
clk=1;
}
load=0;
}
/*---------------------------------------*/
/*void dis_set(void)
{
data uchar i,j,nc;
dis_7219(0x0f,0x0); /*不测试*/
//dis_7219(0x0a,0x04);/*亮度选择*/
//dis_7219(0x09,0x0f);/*译码选择*/
//dis_7219(0x0b,0x07);/*扫描LED的个数*/
//dis_7219(0x0c,0x01);/*启动*/
//for(i=1;i<5;i++)dis_7219(i,0x0f);
//for(i=5;i<9;i++)dis_7219(i,0x00);
//} */
/*----------------------------------------*/
void dis_play(void)
{
uchar qw,sw,gw,y,i;
data long int xx,bw;
code uint *me={"室内温度是:"};
code uint *lme={"the indoor tempe"} ;
code uint *llme={"rature is : "} ;
data uint str1[10];
code uint *str3={"."};
uint aa;
if(flag_sign)xx=~xx+1;
xx=85*tt.temp;
xx=xx/136;
aa=xx;
//if((!flag_sign)&&(aa>700)|(flag_sign)&&(aa<150))
//i=0;
// dis_7219(6,0xff);// dis_7219(6,0x4);
//else i=0; //dis_7219(6,0xff);//dis_7219(6,0x40);
qw=xx/1000;
bw=xx/100;
sw=xx/10%10;
gw=xx%10;
//if(flag_sign){
// dis_7219(1,0x0a);
// flag_sign=0;
//}
//else //dis_7219(1,0xff,0,0);
P_RS=0;
initial();
// delay10(250) ;
dis_str(1,1,lme);
delay10(250);
dis_str(2,1,llme);
delay10(250);
delay10(250);
strcpy(str1,me);
dis_hz_str(3,1,str1);
// delay(250);
// dis_hz_str(4,1,"美");
// delay(250);
bw=bw*100;
sw=sw*10;
bw=bw+sw+gw;
itoa(bw); //bw
str2[3]=str2[2]; str2[2]='.'; str2[4]=0;
//str1[0]=bw;
dis_str(4,1,str2);
dis_hz(4,3,"℃");
//delay(250);
//itoa(gw);
//str3[0]="." ;str3[1]=str2;
//strcat(str3,str2);
// dis_str(4,3,str2);
//itoa(gw);
//dis_str(4,5,str2);
// itoa(sw); //sw);
// dis_str(4,3,str2);
//dis_str(4,3,".");
//itoa(gw);
//dis_str(4,4,str2);
//delay(250); // dis_7219(2,bw,0,0);
// for (i=0;i<10;i++) { delay10(250) ;
// dis_7219(3,0xff,0,0);
// for(y=0;y<0xff;y++){}
// }
// dis_7219(3,sw|0x10,0,0);//第二位 和小数点(0x10)
/* for (i=0;i<10;i++) { delay10(250) ;
// dis_7219(4,0xff,0,0);
for(y=0;y<0xff;y++){}
}
// dis_7219(3,0x80,0,0);
for (i=0;i<10;i++) { delay10(250) ;
// dis_7219(4,0xff,0,0);
for(y=0;y<0xff;y++){}
}
// dis_7219(4,gw,0,0);
*/
i=0;
}
/*----------------------------------------*/
void main(void)
{
uchar ch,n,m,i,y;
flag_sign=0;
//temp[0]=0;
//temp[1]=0;
//dis_set(); //初始化7219
for(;;){
f_exit=inti(); /*初始化 检测1820是否存在*/
if(f_exit){
Wroutds(); //省去ROM操作,启动温度转换
for(n=0;n<100;n++){ // 延时等待温度转换完成
for(m=0;m<10;m++){
delay10(250);
}
rst_wdog();
}
Rdoutds();
if((0x7f|tt.tp[0])==0xff)
flag_sign=1;
/* for (i=0;i<10;i++) {
dis_7219(i,0xff,0,0);
for(y=0;y<0xff;y++){}
}
/*----------------------------------------*/
dis_play();
/* ch=9;
}
// else {
// dis_7219(1,2);
// dis_7219(2,0x0f);
// dis_7219(3,0x0f);
//dis_7219(4,0x0f);
// } */
rst_wdog();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -