完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include ***it RS = P2^4; //定义端口 ***it RW = P2^5; ***it EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define uchar unsigned char #define DataPort P1 /*------------------------------------------------ mS延时函数 ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } /*------------------------------------------------ 判忙函数 ------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { // while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ } #define uint unsigned int ***it P27=P2^7; ***it EOC=P2^3; ***it st=P3^0; ***it oe=P3^1; uchar getdata=0; uchar code table[]="0123456789";//定义显示的数组 uchar q,b,s,g; void adc0809(void) { float temp=0.0; st=0;//ADC0809初始化 st=1; _nop_();_nop_(); st=0; while(EOC==0)//等待转换完成 {oe=1; getdata=P0;//p2选择为ADC的数据口 oe=0; } temp= (float) getdata*5.0/256;//数据处理 temp=temp/100.0; temp=temp*100000.0; q=(int)temp/1000; b=(int)temp%1000/100; s=(int)temp%1000%100/10; g=(int)temp%10; } /*void chufa()//将各位数字拆开函数 { bai=(getdata*2)/100;//求百位数字 shi=(getdata*2)%100/10;//求十位数字 ge=(getdata*2)%10;//求各位数字 LCD_Write_Com(0x80+0x40);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移 LCD_Write_Data(table1[bai]);//第一位显示百位 LCD_Write_Data(table1[10]); //第二位显示小数点 LCD_Write_Data(table1[shi]); //第三位显示十分位 LCD_Write_Data(table1[ge]); //第四位显示百分位 LCD_Write_Data(table1[11]);//显示电压单位'v' DelayMs(100);//改变数值可以修改数字滚动的速度 } */ void main(void) { LCD_Init(); oe=0; while (1) { LCD_Write_String(0,0,"current value:"); adc0809(); LCD_Write_Com(0x80+0x40);//1602显示处理好的数据 { LCD_Write_Data(table[q]); DelayMs(20); LCD_Write_Data(table[b]); DelayMs(20); LCD_Write_Data(table[s]); DelayMs(20); LCD_Write_Data(table[g]); DelayMs(20); } while(1); } } 程序没有问题~~~但只能显示一次数据~~
|
|
相关推荐
1 条评论
8个回答
|
|
|
|
|
|
非常感谢~~~就是多了一句~~~请问下那个如果像图那么接,ad0809的初始化怎么写呢?加个74ls02 |
|
|
|
|
|
|
|
adc0809的输出值为什么不能连续变化呢?从39直接到58 了?为啥呢? |
|
|
|
具体这个之间的差值到没细算。但是ad转换有个精度。比如5V分成了256份,也就说,他的精度为5/256。而不是0.00000000000000000000000001。 |
|
|
|
temp= (float) getdata*5.0/256;//数据处理 temp=temp/100.0; temp=temp*100000.0; 你这个计算方法本身就有问题。你看哈,getdata范围为0-255。在乘以5.0(小数点后保留一位)除以256就是5以下的一个数字。然后你要除以100后在*100000.0这是干啥,为什么不直接换算呢,就是变成*1000。51单片机浮点数的计算能力有限制,这样很多时候他的精度更不保证不了,外加AD转换芯片自身精度限制。 |
|
|
|
谢谢你的奖励。有个回帖被审核了。不知道为什么?哪里回复具体分析方法。请注意查看。
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
542 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
648 浏览 0 评论
751 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1295 浏览 0 评论
1143 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12056 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 15:16 , Processed in 0.678907 second(s), Total 56, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号