楼主: wangkj

循环直接跳过,貌似溢出了,但是我用的是32bit类型啊!

[复制链接]
发表于 2009-7-15 19:45:01 | 显示全部楼层
可以多试试

加了L应该就没有问题
 楼主| 发表于 2009-7-16 08:45:21 | 显示全部楼层
果然可以了,只需要最前面,加上 1L * 就可以!
clr_scr3.jpg
发表于 2009-7-16 09:18:39 | 显示全部楼层
看来keil会把define中的内容默认为最匹配的数据类型,挺节约的,呵呵
发表于 2009-7-16 09:28:06 | 显示全部楼层
看来以后宏定义也要注明类型
太繁琐了~
发表于 2009-7-16 09:33:11 | 显示全部楼层
其实这样做并不是繁琐,呵呵,看来keil还是很聪明的,为了帮助节省资源,会自动选择数据类型,只是用的时候要小心
发表于 2009-7-16 09:33:41 | 显示全部楼层
这几天看了21上单片机版面的置顶贴,讲程序优化的,感觉前人总结的
高内聚,低耦合,模块功能要单纯
真是经典


呵呵,跑题了
发表于 2009-7-16 09:38:18 | 显示全部楼层
建议ls读一下《Unix编程艺术》
你就知道那些东西不过尔尔~

做硬件的跟纯做软件的专业水准是比不了的  哈哈~
 楼主| 发表于 2009-7-16 09:47:46 | 显示全部楼层
有出错了,还是int 32的问题,高16bit丢了!

void cursor(unsigned int x,y)  //设置显存地址 8M 寻址空间。
{
   //int i;
   union
   {
      unsigned long int addr;
          unsigned int addr_HL[2];
   } addr_union;
   addr_union.addr=1L*y*WIDTH+x;
   EA0=1;//set cmd status
   //addr=272*y+x;
   spi_write16(addr_union.addr_HL[1]);  
   spi_write16(addr_union.addr_HL[0]);  

   EA0=0;//set data status        PutCmd(0);//reset display ram pointer to 0
}
 楼主| 发表于 2009-7-16 09:48:34 | 显示全部楼层
>>> hex(0x201*1024+0x201)='0x80601'

把0x80丢了!
 楼主| 发表于 2009-7-16 09:50:59 | 显示全部楼层
结果输出的图。
int32_1.jpg
int32_1.jpg
发表于 2009-7-16 10:00:24 | 显示全部楼层
应该还是 那类问题吧~?  8位机确实比较费劲~
发表于 2009-7-16 10:04:41 | 显示全部楼层
这是一个很好讨论,

请问一下wangkj,编译器难道没有警告吗?

要是没有警告的话,

应该就算编译器的BUG了吧?
 楼主| 发表于 2009-7-16 10:10:58 | 显示全部楼层
51 vga的图片,vga部分的接口引出,可以不用板载的51
img026.jpg
 楼主| 发表于 2009-7-16 10:11:49 | 显示全部楼层
Build target 'Target 1'
compiling serial.c...
compiling vga51.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?GET_CHAR?SERIAL
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?CO?SERIAL
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?NOP?VGA51
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?UDELAY?VGA51
Program Size: data=213.1 xdata=0 code=985
creating hex file from "vga51"...
"vga51" - 0 Error(s), 4 Warning(s).
 楼主| 发表于 2009-7-16 10:12:32 | 显示全部楼层
这几个警告没用,都是我注释掉的函数。
 楼主| 发表于 2009-7-16 10:13:12 | 显示全部楼层
keil c51真的很垃圾,int32 不让用,纯粹是想断单片机的后路。
发表于 2009-7-16 10:14:41 | 显示全部楼层
有没有设置成最严格的警告方式?
发表于 2009-7-16 10:15:30 | 显示全部楼层
瞎猜的,不知道KEIL有没有这样的设置
 楼主| 发表于 2009-7-16 10:19:33 | 显示全部楼层
源码在附件中。

src.rar

50.76 KB, 下载积分: 积分 -1

 楼主| 发表于 2009-7-16 10:25:44 | 显示全部楼层
void cursor(unsigned int x,y)  //设置显存地址 8M 寻址空间。
{
   //int i;
   union
   {
      unsigned long int addr;
          unsigned int addr_HL[2];
   } addr_union;
   addr_union.addr=1L*(long)y*WIDTH+(long)x;
   EA0=1;//set cmd status
   //addr=272*y+x;
   spi_write16(addr_union.addr_HL[1]);  
   spi_write16(addr_union.addr_HL[0]);  

   EA0=0;//set data status        PutCmd(0);//reset display ram pointer to 0
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表