完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
为什么lcd的灯只亮不显示
#include #include #include #include #define uchar unsigned char #define uint unsigned int #define BUSY 0x80 //常量定义 #define DATAPORT P0 //ADC0832的引脚 ***it ADCS =P3^5; //ADC0832 chip seclect ***it ADDI =P3^7; //ADC0832 k in ***it ADDO =P3^7; //ADC0832 k out ***it ADCLK =P3^6; //ADC0832 clock signal ***it LCM_RS=P2^0; ***it LCM_RW=P2^1; ***it LCM_EN=P2^2; uchar ad_data; //采样值存储 ***it Alarm_led_red =P1^5; //超过压力表量程最大值红色led报警定义 ***it Alarm_led_green=P1^6; //低于压力表量程最小值绿色led报警定义 //adc采样值存储单元 char press_data; //标度变换存储单元 unsigned char ad_alarm; //报警值存储单元 unsigned char press_bai=0; //显示值百位 unsigned char press_shi=0; //显示值十位 unsigned char press_ge=0; //显示值个位 unsigned char press_dot=0; //显示值十分位 uchar code str0[]={"Press: . kpa "}; uchar code str1[]={" Check BY Jack "}; void delay(uint); void lcd_wait(void); void delay_LCM(uint); //LCD延时子程序 void initLCM( void); //LCD初始化子程序 void lcd_wait(void); //LCD检测忙子程序 void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数 void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数 void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数 void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数 void display(void); //系统显示子函数 uchar Adc0832(unsigned char channel); void alarm(void); void data_pro(void); /**********main funcation************/ void main(void) { delay(500); //系统延时500ms启动 //ad_data=0; //采样值存储单元初始化为0 initLCM( ); WriteCommandLCM(0x01,1); //清显示屏 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); while(1) { ad_data =Adc0832(0); //采样值存储单元初始化为0 alarm(); data_pro(); display(); } } /*********延时K*1ms,12.000mhz**********/ void delay(uint k) { uint i,j; for(i=0;i for(j=0;j<60;j++) {;} } } /**********写指令到ICM子函数************/ void WriteCommandLCM(uchar WCLCM,uchar BusyC) { if(BusyC)lcd_wait(); DATAPORT=WCLCM; LCM_RS=0; // 选中指令寄存器 LCM_RW=0; // 写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /**********写数据到LCM子函数************/ void WriteDataLCM(uchar WDLCM) { lcd_wait( ); //检测忙信号 DATAPORT=WDLCM; LCM_RS=1; // 选中数据寄存器 LCM_RW=0; // 写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /***********lcm内部等待函数*************/ void lcd_wait(void) { DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,proteus仿真会有显示逻辑黄色 LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); _nop_(); _nop_(); while(DATAPORT&BUSY) { LCM_EN=0; _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); } LCM_EN=0; } /**********LCM初始化子函数***********/ void initLCM( ) { DATAPORT=0; delay(15); WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 delay(5); WriteCommandLCM(0x38,0); delay(5); WriteCommandLCM(0x38,0); delay(5); WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x08,1); //关闭显示,检测忙信号 WriteCommandLCM(0x01,1); //清屏,检测忙信号 WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号 WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号 } /****显示指定坐标的一个字符子函数****/ void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40 X|=0x80; //指令码为地址码+0X80 WriteCommandLCM(X,0); WriteDataLCM(DData); } /*******显示指定坐标的一串字符子函数*****/ void DisplayListChar(uchar X,uchar Y,uchar code *DData) { uchar ListLength=0; Y&=0x01; X&=0x0f; while(X<16) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } /*****************系统显示子函数*****************/ void display(void) { WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); DisplayOneChar(7,0,press_bai+0x30); DisplayOneChar(8,0,press_shi+0x30); DisplayOneChar(9,0,press_ge +0x30); DisplayOneChar(11,0,press_dot+0x30); delay(1000); //稳定显示 } /************ 读ADC0832函数 ************/ //采集并返回 uchar Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0; uchar j; uint dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat); //return ad k } void data_pro(void) { unsigned int temp; float press; if(14 int vary=ad_data;//y=(115-15)/(243-13)*X+15kpa press=((10.0/23.0)*vary)+9.3;//测试时补偿值为9.3 temp=(int)(press*10); //放大10倍,便于后面的计算 press_bai=temp/1000; //取压力值百位 press_shi=(temp%1000)/100; //取压力值十位 press_ge=((temp%1000)%100)/10; //取压力值个位 press_dot=((temp%1000)%100)%10;//取压力值十分位 } } /*****************报警子函数*******************/ void alarm(void) { if(ad_data>=243) //如果当前压力值大于115kpa, { Alarm_led_red=0; } //则启动报警 else { Alarm_led_red=1; } //关闭报警 } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
5916 浏览 1 评论
7592 浏览 1 评论
8363 浏览 0 评论
2127 浏览 0 评论
VL53L5CX #高达 8x8 多区域测距和 63°对角线宽视场 飞行时间多区域测距传感器
17588 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-5-8 14:13 , Processed in 0.630868 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 www.ringvoyeur.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191