完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这是我最近在研究的程序,想要有个简单的显示在1602上都做不到,图为我用protuse的仿真图,求大神们帮帮我。我现在只要能实现显示“welcome”,就可以了。谢谢。
#include /*两路数据采集,其中一路很稳定,跳动一两个字,但是另一路跳动就很大了, 我的处理方法是:1 是将多余的通道都接上,采集后排序取中间的或中间 的几个相加再平均,适用于变化较大的输入信号。2 是适用于比较平稳的 输入信号,可4次、8次、16次、32次、64次循环存储平均。这样比较稳定多了。 本程序就是使用了32次循环存储平均*/ typedef unsigned char uchar; typedef unsigned int uint; /**************宏定义***************/ #define DataDir P4DIR #define DataPort P4OUT #define Busy 0x80 #define CtrlDir P3DIR #define CLR_RS P1OUT&=~BIT0; //RS = P3.0 #define SET_RS P1OUT|=BIT0; #define CLR_RW P1OUT&=~BIT1; //RW = P3.1 #define SET_RW P1OUT|=BIT1; #define CLR_EN P1OUT&=~BIT2; //EN = P3.2 #define SET_EN P1OUT|=BIT2; uchar lcd_tab[]={"welcome:"}; static uint results[32]; //保存ADC转换结果的数组 void Trans_val(uint dat); /******************************************* 函数名称:delay 功 能:延时一段时间 参 数:time--延时长度 ********************************************/ void delay(uint time) { uint i; for(i = 0;i < time;i++) _NOP(); } /******************************************* 函数名称:Delay5ms 功 能:延时约5ms ********************************************/ void Delay5ms(void) { uint i=40000; while (i != 0) { i--; } } /******************************************* 函数名称:WaitForEnable 功 能:等待1602液晶完成内部操作 ********************************************/ void WaitForEnable(void) { P4DIR &= 0x00; //将P4口切换为输入状态 CLR_RS; SET_RW; _NOP(); SET_EN;/////////////E=1? _NOP(); _NOP(); while((P4IN & Busy)!=0); //检测忙标志 CLR_EN; P4DIR |= 0xFF; //将P4口切换为输出状态 } /******************************************* 函数名称:write_com 功 能:向液晶模块写入命令 ********************************************/ void write_com(uchar cmd) { WaitForEnable(); // 检测忙信号? CLR_RS; CLR_RW; _NOP(); DataPort = cmd; //将命令字写入数据端口 _NOP(); SET_EN; //产生使能脉冲信号 _NOP(); _NOP(); CLR_EN; } /******************************************* 函数名称:write_data 功 能:向液晶显示的当前地址写入显示数据 参 数:data--显示字符数据 返回值 :无 ********************************************/ void write_data( uchar data ) { WaitForEnable(); //等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort = data; //将显示数据写入数据端口 _NOP(); SET_EN; //产生使能脉冲信号 _NOP(); _NOP(); CLR_EN; } void Write1602(uchar add,uchar dat) { write_com(add); write_data(dat); } void zifuchuan(uchar *ch) { while(*ch!=0) write_data(*ch++); Delay5ms(); } /******************************************* 函数名称:LcdReset 功 能:对1602液晶模块进行复位操作 ********************************************/ void LcdReset(void) { CtrlDir |= 0x07; //控制线端口设为输出状态 DataDir = 0xFF; //数据端口设为输出状态 write_com(0x38);//规定的复位操作 Delay5ms(); write_com(0x38); Delay5ms(); write_com(0x38); Delay5ms(); write_com(0x38);//显示模式设置 write_com(0x06);//写字符时整体不移动 write_com(0x0c);//显示开,不开游标,不闪烁 write_com(0x01);//显示清屏 } /************************主函数****************************/ void main(void) { unsigned int a; WDTCTL = WDTPW+WDTHOLD; //关闭看门狗 /*下面六行程序关闭所有的IO口*/ ////////////////////////P1DIR = 0XFF;P1OUT = 0XFF; ////////////////////////////////// P2DIR = 0XFF;P2OUT = 0XFF; /////////////////////////////////// P3DIR = 0XFF;P3OUT = 0XFF; ////////////////////////////////////P4DIR = 0XFF;P4OUT = 0XFF; ////////////////////////////P5DIR = 0XFF;P5OUT = 0XFF; ///////////////////////////////////// P6DIR = 0XFF;P6OUT = 0XFF; P5DIR |=0x10; P5SEL |=0x01; BCSCTL1 |=XTS; do { IFG1 &= ~OFIFG; for(a=0xFF;a>0;a--); } while((IFG1 & OFIFG)!=0); BCSCTL2 |=SELM1+SELM0; for(a=0xFF;a>0;a--); // P6DIR |= BIT2;P6OUT |= BIT2;//关闭电平转换 LcdReset(); //复位1602液晶 // P6DIR&=~BIT0;//先把P6_1口设为输入,上电就是这个状态,这句可要可不要 P2SEL |= 0x06;//把P6_1口设为ADC输入通道 ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间 ADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器 ADC12IE = 0x01;// 使能ADC中断 ADC12CTL0 |= ENC; // 使能转换 ADC12CTL0 |= ADC12SC;// 开始转换 write_com(0x82); zifuchuan("The volt is:"); while(1) { uint num; write_com(0x80); for(num=0;num<7;num++) write_data( lcd_tab[num]); delay(5); } _EINT(); LPM0; } /******************************************* 函数名称:ADC12ISR 功 能:ADC中断服务函数,在这里用多次平均的 计算P6.0口的模拟电压数值 参 数:无 返回值 :无 ********************************************/ #pragma vector=ADC12_VECTOR __interrupt void ADC12ISR (void) { static uint temp = 0; results[temp++] = ADC12MEM0; if(temp == 32) { uchar i; unsigned long sum = 0; temp = 0; for(i = 0; i < 32; i++) { sum += results[i]; } sum >>= 5;//除以32 Trans_val(sum); } } /******************************************* 函数名称:Trans_val 功 能:将16进制ADC转换数据变换成三位10进制 真实的模拟电压数据,并在液晶上显示 参 数:Hex_Val--16进制数据 n--变换时的分母等于2的n次方 返回值 :无 ********************************************/ void Trans_val(uint dat) { unsigned long temp; uint Curr_Volt; uchar ptr[3]; temp = dat; temp = (temp << 5) + dat; //temp = dat * 33 //移位比直接乘效率要高 temp = (temp << 3) + (temp << 1); //temp = temp * 10 //一个数左移N位等于这个数乘以2的N次方 Curr_Volt = temp >> 12;//Curr_Volt = temp / 2^n一个数右移N位等于除以2的N次方 ptr[0] = Curr_Volt/100; ptr[1] = Curr_Volt %100/10; ptr[2] = Curr_Volt%10; //在液晶上显示变换后的结果 Write1602(0x80+0x40,ptr[0]+0x30); Write1602(0x80+0x41,'.'); Write1602(0x80+0x42,ptr[1]+0x30); Write1602(0x80+0x43,ptr[2]+0x30); Write1602(0x80+0x44,'V'); }
|
|
相关推荐
5个回答
|
|
|
|
|
|
|
|
|
|
1602的话,用一个电位器103-520,就可以调节对比度了。
|
|
|
|
|
|
|
|
楼主大大你把Proteus给拼错了
|
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
702 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
613 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1075 浏览 1 评论
771 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
535 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
183浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
145浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
9浏览 13评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
136浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
130浏览 12评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 21:47 , Processed in 1.060276 second(s), Total 89, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号