📄 main.c
字号:
#include <ht46r232.h>
#pragma vector isr_4 @ 0x4
#pragma vector isr_8 @ 0x8
#pragma vector isr_c @ 0xc
#pragma vector isr_ad @ 0x10 //ad中断服务程序(r232地址是10)
//ISR for safequard
void isr_4(){} // external ISR
void isr_8(){} // timer/event 0
void isr_c(){} // timer/event 1
//initialize registers for safeguard
void safeguard_init(){
_intc0=0;
_intc1=0;
_tmr0h=0;
_tmr0l=0;
_tmr0c=0;
_tmr1h=0;
_tmr1l=0;
_tmr1c=0;
_pac=0xff;
_pbc =0xff; //input mode
_pcc =0xff;
}
typedef unsigned char u8;
#define rs _pc2 //屏幕的控制rs
#define ep _pc0 //屏幕的控制rs
#define rw _pc1 //屏幕的控制rs
#define dht _pb1
#define ko _pb2 //外部按键定义
#define ky _pb3
#define LED_DATA_CRL _pac //屏幕数据管脚的I/O控制
#define DHT_DATA_CRL _pbc //dht数据管脚的I/O控制
#define LED_DATA_DATA _pa //屏幕数据管脚的数据传递
#define LED_CRL_CRL _pcc //屏幕控制管脚的I/O控制
#define ad_start _26_7 //定义ad转换的start位(r232的adcr寄存器地址是0x26h)
void busycheck(void);
void init(void);
void cmd(unsigned char);
void data(int);
signed char U8FLAG,U8temp,U8comdata;
int U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;/*中间数值,校对校验码后付给最终的结果*/
int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/*实际数值*/
int k; //外部按键常量
unsigned int light; //光强的数字值
int light_b; //百位
int light_s; //十位
int light_g; //个位
int count;
void ADtrans(){ //ad转换开始
ad_start=0;
ad_start=1;
ad_start=0;
}
//--------------------------------------屏幕部分------------------------------
//********************************屏幕初始************************************
void init()
{
LED_DATA_CRL=0;
LED_CRL_CRL=0;
LED_DATA_DATA=0;
_pc=0;
_delay(5000);
_delay(5000);
_delay(5000);
cmd(0x38);
_delay(5000);
cmd(0x38);
_delay(5000);
cmd(0x38);
_delay(5000);
cmd(0x38);
busycheck();
cmd(0x08);
busycheck();
cmd(0x01);
busycheck();
cmd(0x06);
busycheck();
cmd(0x0c);
busycheck();
}
//****************************
//***********送指令函数********
void cmd(u8 mingling)
{
//busycheck();
rs= 0;
rw = 0;
ep = 0;
LED_DATA_DATA=mingling;
_delay(100);
ep=1;
_delay(100);
ep=0;
}
//***************************
//*********送数据************
void data(int zimu)
{//busycheck();
rw=0;
rs = 1;
rw = 0;
ep = 0;
LED_DATA_DATA= zimu;
_delay(100);
ep = 1;
_delay(100);
ep = 0;
}
//***************************
//**********busycheck***********
void busycheck(void){
u8 val;
do{
ep=0;
LED_DATA_CRL=0xff;
rs=0;
rw=1;
ep=1;
_delay(100);
val=LED_DATA_DATA;
_delay(100);
ep=0;
}while(val&(u8)0x80);
rw=0;
LED_DATA_CRL=0;
}
//*****************************************************
//******************写入地址***************************
void pos(u8 x)
{
cmd(x|0x80);
}
//*****************************************************
//-------------------dht21 部分------------------------
//**************获取8位二进制数************************
/*COM获取一个8位二进制数*/
void COM(void)
{
u8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!dht)&&U8FLAG++);
_delay(35);
U8temp=0;
if(dht)U8temp=1;
U8FLAG=2;
while((dht)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp;
}//rof
}
//***********************************************************
/*--------------------------------*/
/*-----温湿度读取子程序 ----------*/
/*--------------------------------*/
/*-----以下变量均为全局变量-------*/
/*----温度高8位== U8T_data_H------*/
/*----温度低8位== U8T_data_L------*/
/*----湿度高8位== U8RH_data_H-----*/
/*----湿度低8位== U8RH_data_L-----*/
/*----校验 8位 == U8checkdata-----*/
void RH(void)
{ int c=0;
DHT_DATA_CRL=0;
dht=0;
_delay(20000); //主机拉低500us
DHT_DATA_CRL=0xff; //主机设为输入(电平由上拉电阻拉高) 在20~40us后判断从机响应信号
while((dht==1)&&(c++<100)); //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!dht)
{
U8FLAG=2;
while((!dht)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
U8FLAG=2;
while((dht)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
COM(); //数据接收状态
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
if(1)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
//******************************************************************
//---------------------华丽的main函数分割线-------------------------
void main()
{
//*********变量定义***********
u8 r='r';
u8 h='h';
u8 t='t';
u8 c='c';
u8 l='l';
u8 z=':';
u8 si='4';
u8 wu='5';
u8 liu='6';
u8 ling='0';
int rhdatas; //湿度数据十位
int rhdatag; // 湿度数据个位
int tdatas;
int tdatag;
int i=0;
//*****************************
//*********初始化**************
safeguard_init();
init();
DHT_DATA_CRL=0xff;
_acsr=0x01; //ad转换8分频
_adcr=0x08; //设置通道 pb0 an0作为ad输入
ad_start=1; //设置分频和通道
ad_start=0;
_emi=0; //关总中断
_adf=0; //清除ad中断标志位
_eadi=1; // 开ad中断使能
_emi=1; //开总中断
//*******************************
while(1){
RH();
ADtrans(); //ad转换开始
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
//**把获得的数据转换成屏幕可以显示的数字(根据屏幕的编码表)**********
rhdatas=U8RH_data_H/10;
rhdatag=U8RH_data_H%10;
rhdatas=(rhdatas|0x30)&0x3f;
rhdatag=(rhdatag|0x30)&0x3f;
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
tdatas=U8T_data_H/10;
tdatag=U8T_data_H%10;
tdatas=(tdatas|0x30)&0x3f;
tdatag=(tdatag|0x30)&0x3f;
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
light_b=light/100;
light_s=(light-light_b*100)/10;
light_g=light%10;
light_b=(light_b|0x30)&0x3f;
light_s=(light_s|0x30)&0x3f;
light_g=(light_g|0x30)&0x3f;
//***********************************
cmd(0x08); //先关显示屏!!!!!!
_delay(60000);
cmd(0x01); // 清屏!!!!!!!!!!
_delay(60000);
_delay(60000);
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
pos(0); //显示温度
data(h);
data(z);
data(rhdatas);
data(rhdatag);
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
pos(43); //显示湿度
data(t);
data(z);
data(tdatas);
data(tdatag);
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
pos(8);
data(r); //显示推荐数据
data(c);
data(z);
if(tdatas=='3') {if (k==1) {data(si);data(ling);}
else {data(si);data(wu);}}
if(U8T_data_H<30&&U8T_data_H>=25) {if (k==1) {data(si);data(wu);}
else {data(wu);data(ling);}}
if (U8T_data_H<25) {if (k==1) {data(wu);data(wu);}
else {data(liu);data(ling);}}
pos(0x4a); //显示当前光强
data(l);
data(z);
data(light_b);
data(light_s);
data(light_g);
pos(0x48);
data(count);
if(ko==0)k=1; //查询键盘
else if(ky==0)k=0;
cmd(0xc); //开显示屏@!!!!!!!!!!!!!!
_delay(250000);
if(ko==0)k=1; //查询+延时
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
}
}
//________________________________________________
//***********中断服务程序********************
void isr_ad(){
_adf=0; //清除ad中断标志位
light=_adrh; //读取ad数据寄存器高八位;
count++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -