一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2529|回复: 14
收起左侧

[avr] 求助大侠,avr程序数字拆分的问题

[复制链接]
发表于 2013-6-26 00:21 | 显示全部楼层 |阅读模式
本人是单片机菜鸟,在写数字拆分的时候遇到了一些问题,在此向各位大侠求教。
以下是部分程序

#include <AVR/io.h>
#define uint unsigned int
#define uchar unsigned char
uint ge,shi,bai,qian,wan,swan;

……

略去中间一些无关程序

……
void data_chr(int temp_data)                                     //        数值转换函数 {          uint swan_temp,wan_temp,qian_temp,bai_temp,shi_temp,ge_temp;        swan_temp=temp_data/100000;        wan_temp=temp_data%100000/10000;        qian_temp=temp_data%10000/1000;        bai_temp=temp_data%1000/100 ;        shi_temp=temp_data%100/10;        ge_temp=temp_data%10;        swan=swan_temp;        wan=wan_temp;        qian=qian_temp;        bai=bai_temp;        shi=shi_temp;        ge=ge_temp; }
int main(void) {        DDRC=0xff;         DDRD=0xff;         LCD_init();    //初始12864        uint k=1234; //测试数字分拆用的         while(1)         {        data_chr(k);   //进行数字分拆        Show816(0,0,qian);     //送到12864去显示        Show816(0,1,bai);        Show816(0,2,shi);        Show816(0,3,ge);        }}
之前在51里面按照这样写是可以正确显示的,但是在avr里面程序不能正常显示,要么是乱码,要么是0.仿真结果如下: 不能正常显示.jpg

但是把程序这样修改,之后是能正常显示,修改后如下:#include <avr/io.h>#define uint unsigned int#define uchar unsigned charint main(void) {        DDRC=0xff;         DDRD=0xff;         LCD_init();//初始12864
        uint ge,shi,bai,qian,wan,swan;       
        uint k=1234;        swan=k/100000;        wan=k%100000/10000;        qian=k%10000/1000;        bai=k%1000/100 ;        shi=k%100/10;        ge=k%10;                 while(1)         {        Show816(0,0,qian);        Show816(0,1,bai);        Show816(0,2,shi);        Show816(0,3,ge);        }} 正常显示.jpg

请大侠们指教,是什么原因造成这样的结果,不胜感激!
如果将数字分拆写成函数的形式,方便调用,该如何写呢?烦请各位指导。


发表于 2013-6-26 00:26 | 显示全部楼层
大哥,排下版吧
发表于 2013-6-26 00:35 | 显示全部楼层
本帖最后由 hysy 于 2013-6-26 00:45 编辑

给他解决问题,还得帮他排版。占位先
void data_chr(int temp_data) //        数值转换函数
{         
uint swan_temp,wan_temp,qian_temp,bai_temp,shi_temp,ge_temp;        
swan_temp=temp_data/100000;        
wan_temp=temp_data%100000/10000;        
qian_temp=temp_data%10000/1000;        
bai_temp=temp_data%1000/100 ;        
shi_temp=temp_data%100/10;        
ge_temp=temp_data%10;        
swan=swan_temp;        
wan=wan_temp;        
qian=qian_temp;        
bai=bai_temp;        
shi=shi_temp;        
ge=ge_temp;
}
main(void)
{        
DDRC=0xff;         
DDRD=0xff;         
LCD_init();    //初始12864        
uint k=1234; //测试数字分拆用的         
while(1)         
{        
  data_chr(k);   //进行数字分拆        
  Show816(0,0,qian);     //送到12864去显示        
  Show816(0,1,bai);        
  Show816(0,2,shi);        
  Show816(0,3,ge);        
}
}
排版好了。哈哈,愿意帮忙的上...
个人认为51可以显avr不行,估计端口寄存器没有处理好。
另外说下,这程序写的太‘造次’了,函数封装到最后应该是一个printf(“****中文字母数字通吃”);的函数形式才叫程序哈。

发表于 2013-6-26 00:59 | 显示全部楼层
玩STM32的时候试过有这类诡异的问题,要把全局变量定义为不使用缓存才行,要不,写入的只是映射值,真正的值没有改变.LZ可以查下有关资料,不在家里只能说个大概
发表于 2013-6-26 00:59 | 显示全部楼层
玩STM32的时候试过有这类诡异的问题,要把全局变量定义为不使用缓存才行,要不,写入的只是映射值,真正的值没有改变.LZ可以查下有关资料,不在家里只能说个大概
发表于 2013-6-26 01:34 | 显示全部楼层
Show816(0,0,qian);     //送到12864去显示        
  Show816(0,1,bai);        
  Show816(0,2,shi);        
  Show816(0,3,ge);   
要把变量定义成每次调用都更新读取的类型才行。
比如
unsigned char改成下面的。
volatile  unsigned char
然后编译后的代码也许会增大,这就是里面有差异了

代码编写没什么好诡异的,只是你不了解硬件运行的机制
发表于 2013-6-26 07:30 | 显示全部楼层
本帖最后由 倪大德 于 2013-6-26 07:35 编辑



        问题并不复杂! 程序也无大问题!

请将wan_temp,qian_temp,bai_temp,shi_temp,ge_temp; 定义为全局变量!


           
发表于 2013-6-26 10:52 | 显示全部楼层
本帖最后由 xrff_z 于 2013-6-26 11:12 编辑

可能是由于编译器的优化,造成该变的量没变 加上volatile。
qian bai....用uchar 就可以了吧。
avr和51的对于int这类多字节的存储顺序好像不太一样,会不会是这上面的问题。

为什么转换的时候,还要用***_temp中间值呢,直接计算出来不行吗?
 楼主| 发表于 2013-6-26 13:43 | 显示全部楼层
首先谢谢各位的指点,按几位老大的方法都试过了,还是相同的问题,全局变量在子函数里传值之后读出的还是0。用的avr studio编译的,准备换其它编译器再试试。再三感谢各位的指点。
发表于 2013-6-26 14:30 | 显示全部楼层
试试用指向uint指针传递参数,
形参真的很容易看编译器的脸色

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-18 09:05 , Processed in 0.074546 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表