keilkeil uvision4编程问题

keil程序在内部RAM调试的基本步骤网上已经有非常多了,我就不再赘述,大家能够在网上搜到非常多。
可是有些时候内部RAM并不够用,这就须要将程序装入外部RAM中调试,而在这个过程中可能会出现各种各样的问题,在这里我将会把我遇到过的一些问题和须要注意的地方总结一下,希望可以对大家有所帮助。
有错误的地方也希望大神们可以指教,提前表示感谢···
转载请注明出处:
先介绍下我项目使用的硬件,芯片是LPC1788,外部RAM是MT48LC4M32B2,大小为16M(128Mb X32&SDRAM),之前用的是MT48LC2M32B2,大小为8M,后来发现东西太多,8M不够用了,所以换成了16M的。
在换RAM时也遇到过一些问题,这个在下文中会有介绍。
在外部RAM中调试程序,程序中一定不能有操作外部RAM的代码!
在外部RAM中调试,程序中不要有操作外部RAM的代码,初始化也不要有,包含对RAM相关引脚的操作。
RAM的初始化和引脚的初始化要放到jlink的下载配置文件里,主要是对LPC的寄存器进行相关配置,不要忘了RAM中的读取算法配置。
把我的配置文件贴出来供大家參考一下。
FUNC void PinSel(int p1, int n1, int f1)
_WDWORD(0x + (p1 * 32 + n1) * 4, 0x8 | f1);
FUNC void InitSDRAM(void)
PinSel(2,16,1);
PinSel(2,17,1);
PinSel(2,18,1);
PinSel(2,20,1);
PinSel(2,24,1);
PinSel(2,28,1);
PinSel(2,29,1);
PinSel(2,30,1);
PinSel(2,31,1);
for(i = 0; i & 32; i++)
PinSel(3,i,1);
for(i = 0; i & 21; i++)
PinSel(4,i,1);
PinSel(4,24,1);
PinSel(4,25,1);
PinSel(4,30,1);
PinSel(4,31,1);
/* PCONP |= 1 && 11 */
_WDWORD(0x400FC0C4, 0x04288FDE);
// Power On EMC
/* EMCCONTROL |= 1 */
_WDWORD(0xx);
// Enable EMC
/* EMCDLYCTL */
_WDWORD(0x400FC1DC, 0x);
// Config data read delay
/* EMCCONFIG */
_WDWORD(0xx);
// Little endian mode
/* DYNAMICCONTROL */
_WDWORD(0xx);
// Set normal self refresh mode, normal power mode
// CE always HI
// Enable clock out
// Clock do not stop during idle
/* DYNAMICREFRESH */
_WDWORD(0xx0000001F);
// refresh timing
/* DYNAMICREADCONFIG */
_WDWORD(0xx);
// read timing
/* DYNAMICRP */
_WDWORD(0xx);
/* DYNAMICRAS */
_WDWORD(0xx);
/* DYNAMICSREX */
_WDWORD(0xx);
/* DYNAMICAPR */
_WDWORD(0x2009C03C, 0x);
/* DYNAMICDAL */
_WDWORD(0xx);
/* DYNAMICWR */
_WDWORD(0xx);
/* DYNAMICRC */
_WDWORD(0xx);
/* DYNAMICRFC */
_WDWORD(0x2009C04C, 0x);
/* DYNAMICXSR */
_WDWORD(0xx);
/* DYNAMICRRD */
_WDWORD(0xx);
/* DYNAMICMRD */
_WDWORD(0xx);
/* DYNAMICCASRAS0 */
_WDWORD(0xx);
// RAS/CAS Latency
/* DYNAMICCONFIG0 */
_WDWORD(0xx);
// Config device type as SDRAM
// Config address mapping
_sleep_(100);
// Wait 100 ms
/* DYNAMICCONTROL */
_WDWORD(0xx);
// nop command
_sleep_(100);
// Wait 100 ms
/* DYNAMICCONTROL */
_WDWORD(0xx);
// pre-charge command
/* DYNAMICREFRESH */
_WDWORD(0xx);
// refresh timing
_sleep_(100);
// Wait 100 ms
/* DYNAMICREFRESH */
_WDWORD(0xx0000001F);
// refresh timing
/* DYNAMICCONTROL */
_WDWORD(0xx);
// mode command
_RDWORD(0xA0000000 | (0x32 && (2 + 2 + 8)));
_sleep_(100);
// Wait 100 ms
/* DYNAMICCONTROL */
_WDWORD(0xx);
// noamal command
/* DYNAMICCONFIG0 */
_WDWORD(0xx);
// enable buffer
_sleep_(100);
// Wait 100 ms
以上是外部RAM的初始化部分,不要忘了当中的RAM本身的寄存器,在本例中的地址是0xA0000000,寄存器中的各个位数的作用例如以下图:
(截图自MT48LC4M32B2的datasheet)
当中数据要配置正确,RAM才干正确工作。接下来是对内存保护单元(MPU)的配置,两者结合,就是Jlink对RAM的初始化和配置。
RAM_Debug.ini 的文件例如以下所看到的:
INCLUDE MT48LC4M32LFB5.ini
InitSDRAM();
// Initialize memory
LOAD ..\SDRAM_obj\uc1788.axf INCREMENTAL
// Download program
_WDWORD(0xE000ED98, 0x);
// Use No.0 MPU
/* RBAR */
_WDWORD(0xE000ED9C, 0xA0000000);
// Set MPU base addr
/* RASR */
_WDWORD(0xE000EDA0, 0x);
// Set MPU size and permission
/* SHCSR */
// _WDWORD(0xE000ED24, 0x);
// Enable memory managemeng fault
/* MPU_CONTROL */
_WDWORD(0xE000ED94, 0x);
// Enable MPU
/* VTOR */
_WDWORD(0xE000ED08, 0x);
// Set vector table offset
SP = _RDWORD(0x);
// Set stack pointer
PC = _RDWORD(0x);
// Set program counter
这样就能像在FLASH中调试一样来在RAM中调试了。
可是,程序中不要出现不论什么操作RAM的代码!一定记住!
程序装入RAM中起始地址出错
所谓起始地址,就是指程序刚装入RAM中,还没有执行的那个pc地址。
正常情况下,这个地址是指向芯片启动代码的systemiInit()这个函数所在的地址的,可是有些时候这个地址会出错,跑到一个不知道什么地址的地方去。
例如以下图所看到的:
我分析出现这个现象的原因是在jlink对RAM的配置方面有问题,也就是对RAM没有配置成功,导致程序没有成功存入RAM中,或者是储存成功,可是读取失败,或者储存读取都有问题。
解决方式就是查看内存中的数据,看是否正确。或者对设备又一次上电,对jlink复位后又一次调试。
这个问题在我这里偶尔会出现,但又一次调试又会消失,所以到眼下我也没弄清楚这个问题出现的原因。
程序跑入HardFault_Handler
HardFault_Handler是指指令错误中断,通常是由于程序代码翻译成的汇编代码中出现了错误的指令。
解决问题的方法通常是找出错误指令的地址,假设地址是在当前分配的代码段的最開始位置(比方我在分散载入里面将这段代码放在0xAXA0002000之间,然后出错指令出如今0xA0001010这个位置);
或者在上个代码段的结束位置(比方我将这段代码放在0xA0001000位置处,上段代码在0xA0000900结束,而出错指令在0xA0000920这个位置);
普通情况下是内存不够用导致的,并且出错的语句通常是向全局变量赋值的语句。由于内存不够用,可是jlink在向RAM中写数据的时候并不知道内存不够,导致后来溢出的数据折返回代码段起始地址,将曾经的内容覆盖所导致的。(内存覆盖)
解决问题的方法就是换一个大的RAM。
另一种可能,就是在程序中有操作RAM的代码,这也会导致RAM中内容被改动,出现错误的指令。
程序中途跑飞
上一条中的问题也有可能导致程序中途跑飞,此外另一种可能就是指针问题。
指针没有正确初始化,使用了未初始化的指针,或者是指针没有正确回收,导致出现野指针,是最常见的,也是最easy导致程序跑飞的原因。出现故障应最先考虑此因素。
排除了以上的因素后,能够依据那些常规方法,比方查看LR寄存器的值,找到出现故障的语句等方法来查找详细原因。
更换新外部RAM时要注意的问题
更换新RAM之前先看RAM的手冊和芯片的手冊,看清楚使用的芯片支持不支持新的RAM,我就由于没看清楚手冊导致买了芯片不支持的RAM,既费钱又费力。。。。
芯片user manul上一般都有一个表,表中就是它所支持的全部RAM的类型。例如以下图:
先查清楚再买芯片,血淋淋的教训。。。
不同的RAM读写规则有些会有所不同,配置也不尽同样,所以在更换新RAM时要细致读懂RAM的datasheet,对其清楚掌握。
基本上须要配置的最主要參数有下面几个:页大小,外部总线地址映射(行,列,bank),空间大小,位数,读写的算法(在RAM自己的寄存器中配置);
外部总线地址映射要与芯片相应,然后通过上表来确定配置寄存器的值。(程序在RAM中调试要改动jlink的ini文件)
结语:临时就想到了这些,以上的问题都是我在实际项目中碰到的问题,和一些经验介绍。因为我自己也学艺不精,能力有限,所以难免有错误的地方,希望路过的大神能够帮忙指正。同一时候声明,仅供參考。
转载请注明出处:
阅读(...) 评论()没有更多推荐了,
不良信息举报
举报内容:
KEIL编程时遇到的常见错误
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!单片机、电路板
连接器、接插件
其他元器件
单片机Keil软件仿真与调试技巧
单片机Keil软件仿真与调试技巧
一、引言  单片机软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措。实际上。各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧。对于排查这些程序错误问题可以起到举一反三、事半功倍的效果。软件调试是单片机技术人员必须掌握的重要基本技能。  下面以单片机常用开发软件Keil为例,通过一个项目任务实例来介绍单片机软件仿真与调试的方法。  二、Keil仿真与调试  点
一、引言  软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措。实际上。各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧。对于排查这些程序错误问题可以起到举一反三、事半功倍的效果。软件调试是单片机技术人员必须掌握的重要基本技能。  下面以单片机常用开发软件Keil为例,通过一个项目任务实例来介绍单片机软件仿真与调试的方法。  二、Keil仿真与调试  点击运行软件Keil uVision2.其调试操作步骤大体可以分为5步:  1.创建工程  在项目开发中,并不是仅有一个用户源程序就够了,还要为这个项目选择CPU型号、设置编译和调试参数。有一些项目还会有多个文件组成。因此将这些参数设置和所需要的所有文件统称为一个工程,存放于专门的工程文件夹下。这里先建立一个工程文件夹如F:\exam.  ①创建新工程。鼠标左键单击主菜单Project一&New Project.弹出。Create New Project&对话框,用鼠标选择你要保存工程的文件夹(如FAexam),输入新工程名(如&exam&)。单击&保存&按键。  ②在随后弹出的CPU型号设置对话框中选择单片机的型号(如&AT89C51&),单击&确定&完成。  2.建立源程序文件并加入工程  ①鼠标左键单击菜单。File一&New新建文件。  弹出图1窗口。自动进入编辑工作模式。图1 源程序文件的建立与编辑  ②在文本窗口中输入和编辑用户的源程序。  【项目任务】设计一种花样彩灯程序,实现单片机P1口驱动相连的8个发光依次循环点亮。    ③单击菜单。File一&Save as.弹出文件保存对话框,选择工程文件夹(&F:\exam&)。输入源程序文件名(如&exam.asm&),点击&保存&按钮。  注意汇编源程序的扩展名必须为asrn,C51源程序扩展名必须为*.C.  ④将源程序加入工程。用鼠标点击图标&Target1&前的&+&号,展开后右键单击Source Group弹出快捷菜单,点击&Add File to Group'SourceGroup 1&项弹出源程序加入工程对话框。选择刚保存的用户源程序exam.asm,点击ADD按钮加入工程,点击Close关闭对话框。  3.工程参数设置  用鼠标左键单击主菜单Project一&Options forTarget'Targetl弹出工程参数设置对话框。关于工程参数设置的内容很多,篇幅所限,这里仅介绍通常需要设置的三个参数:  ①设置CPU型号。前面已经进行了设置。  ②在设置对话框的&Target&标签下&Xtal(Mhz)&处输入单片机的晶振(如&12&)如图2.图2单片机晶振的设置。  ③在设置对话框的&Output&标签下,选中&Create HEX file&项。用以编译生成可执行的机器码hex文件。如图3所示。该hex文件可以通过编程器写入或下载到单片机中运行。图3生成可执行hex文件的设置。  4.编译源文件  鼠标左键单击主菜单Project一&Built target或快捷按钮编译文件。  若有语法错误,输出窗口将有相应提示信息。(信息来源:)  双击提示信息行,光标会停留在源程序出错处。如图4所示。经检查发现:本程序第3条DJNZ指令被错误输入成了DJNA.用户可根据提示修改源程序,然后再次编译。注意。Keil具有语法检查功能,源程序中正确的指令关键词将变颜色,没变色的为输入错误,方便用户查找语法错误。图4源文件的编译。  若编译后输出信息窗13显示&0 Errors(s),0Warning(s)&,则说明源程序的语法错误已经全部排除。注意:有Errors不能Debug,也不产生HEX码,有Warning是允许的,可以运行。  5.调试程序  源程序编译通过,表明语法正确,却并不能保证该程序能够正确运行。还需要对其逻辑功能进行调试。Keil软件具有很强的软件仿真功能。  鼠标左击主菜单Debug一&Sta№top DebugSession子菜单或调试/编辑模式切换按钮。进入调试程序工作模式,软件窗口如图5所示。重复点击该按钮可以实现在编辑模式和调试模式之间进行切换。图5程序调试运行。  调试程序时的程序运行控制按钮从左到右依次为复位、连续运行,暂停、单步、过程单步、执行完当前子程序、运行到光标当前行。复位按钮模拟芯片的复位,它将使程序回到最开头处执行。当程序处于停止状态时复位才有效,程序处于运行状态时停止按钮才有效。  ①为了方便观察程序调试过程中各变量和RAM单元的中间结果。点击主菜单View一&Watch&Call Stack Window和View一&Memory Window打开观察变量窗13和存储器窗1:3进行显示。由于本例还要观察P1 13的输出变化,可以点击主菜单Peripherals一&I/O-Ports一&Port 1打开I/O 13 P1的观察窗13.  ②程序调试。  程序可以单步执行或连续执行。连续执行是指一条指令执行完后接着连续立即执行下一条,中间不停止。这样程序执行的速度很快。可以看到程序执行的总体效果。即最终结果是正确或错误。但如果程序有错,则难以确认具体出错地方。例如本例中点击连续运行按钮后。P1口输出01H后便始终保持不变。这显然与花样彩灯程序的循环显示要求不符。程序运行出错,如图6所示。
一、引言  软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措。实际上。各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧。对于排查这些程序错误问题可以起到举一反三、事半功倍的效果。软件调试是单片机技术人员必须掌握的重要基本技能。  下面以单片机常用开发软件Keil为例,通过一个项目任务实例来介绍单片机软件仿真与调试的方法。  二、Keil仿真与调试  点击运行软件Keil uVision2.其调试操作步骤大体可以分为5步:  1.创建工程  在项目开发中,并不是仅有一个用户源程序就够了,还要为这个项目选择CPU型号、设置编译和调试参数。有一些项目还会有多个文件组成。因此将这些参数设置和所需要的所有文件统称为一个工程,存放于专门的工程文件夹下。这里先建立一个工程文件夹如F:\exam.  ①创建新工程。鼠标左键单击主菜单Project一&New Project.弹出。Create New Project&对话框,用鼠标选择你要保存工程的文件夹(如FAexam),输入新工程名(如&exam&)。单击&保存&按键。  ②在随后弹出的CPU型号设置对话框中选择单片机的型号(如&AT89C51&),单击&确定&完成。  2.建立源程序文件并加入工程  ①鼠标左键单击菜单。File一&New新建文件。  弹出图1窗口。自动进入编辑工作模式。图1 源程序文件的建立与编辑  ②在文本窗口中输入和编辑用户的源程序。  【项目任务】设计一种花样彩灯程序,实现单片机P1口驱动相连的8个发光依次循环点亮。    ③单击菜单。File一&Save as.弹出文件保存对话框,选择工程文件夹(&F:\exam&)。输入源程序文件名(如&exam.asm&),点击&保存&按钮。  注意汇编源程序的扩展名必须为asrn,C51源程序扩展名必须为*.C.  ④将源程序加入工程。用鼠标点击图标&Target1&前的&+&号,展开后右键单击Source Group弹出快捷菜单,点击&Add File to Group'SourceGroup 1&项弹出源程序加入工程对话框。选择刚保存的用户源程序exam.asm,点击ADD按钮加入工程,点击Close关闭对话框。  3.工程参数设置  用鼠标左键单击主菜单Project一&Options forTarget'Targetl弹出工程参数设置对话框。关于工程参数设置的内容很多,篇幅所限,这里仅介绍通常需要设置的三个参数:  ①设置CPU型号。前面已经进行了设置。  ②在设置对话框的&Target&标签下&Xtal(Mhz)&处输入单片机的晶振(如&12&)如图2.图2单片机晶振的设置。  ③在设置对话框的&Output&标签下,选中&Create HEX file&项。用以编译生成可执行的机器码hex文件。如图3所示。该hex文件可以通过编程器写入或下载到单片机中运行。图3生成可执行hex文件的设置。  4.编译源文件  鼠标左键单击主菜单Project一&Built target或快捷按钮编译文件。  若有语法错误,输出窗口将有相应提示信息。(信息来源:)  双击提示信息行,光标会停留在源程序出错处。如图4所示。经检查发现:本程序第3条DJNZ指令被错误输入成了DJNA.用户可根据提示修改源程序,然后再次编译。注意。Keil具有语法检查功能,源程序中正确的指令关键词将变颜色,没变色的为输入错误,方便用户查找语法错误。图4源文件的编译。  若编译后输出信息窗13显示&0 Errors(s),0Warning(s)&,则说明源程序的语法错误已经全部排除。注意:有Errors不能Debug,也不产生HEX码,有Warning是允许的,可以运行。  5.调试程序  源程序编译通过,表明语法正确,却并不能保证该程序能够正确运行。还需要对其逻辑功能进行调试。Keil软件具有很强的软件仿真功能。  鼠标左击主菜单Debug一&Sta№top DebugSession子菜单或调试/编辑模式切换按钮。进入调试程序工作模式,软件窗口如图5所示。重复点击该按钮可以实现在编辑模式和调试模式之间进行切换。图5程序调试运行。  调试程序时的程序运行控制按钮从左到右依次为复位、连续运行,暂停、单步、过程单步、执行完当前子程序、运行到光标当前行。复位按钮模拟芯片的复位,它将使程序回到最开头处执行。当程序处于停止状态时复位才有效,程序处于运行状态时停止按钮才有效。  ①为了方便观察程序调试过程中各变量和RAM单元的中间结果。点击主菜单View一&Watch&Call Stack Window和View一&Memory Window打开观察变量窗13和存储器窗1:3进行显示。由于本例还要观察P1 13的输出变化,可以点击主菜单Peripherals一&I/O-Ports一&Port 1打开I/O 13 P1的观察窗13.  ②程序调试。  程序可以单步执行或连续执行。连续执行是指一条指令执行完后接着连续立即执行下一条,中间不停止。这样程序执行的速度很快。可以看到程序执行的总体效果。即最终结果是正确或错误。但如果程序有错,则难以确认具体出错地方。例如本例中点击连续运行按钮后。P1口输出01H后便始终保持不变。这显然与花样彩灯程序的循环显示要求不符。程序运行出错,如图6所示。
上一篇:已经是第一篇
型号/产品名
深圳市安口电子
深圳市安口电子
深圳市安口电子
深圳市安口电子
深圳市安口电子当前位置:
&用keil编程 有错误 小女子求帮忙 急急急!~
用keil编程 有错误 小女子求帮忙 急急急!~
作者 cyi1015
/****显示函数****/
write_sfm(uchar add,uchar getdata)& & & & & & & & & & & & //显示程序
{& & & & uchar getdata1,getdata2;& &
& & & & uchar shu[];
& & & & getdata1=getdata*256/51;
& & & & getdata2=getdata*256/51;
& & & & if(getdata2&10000)
& & & & {red=1;
& & & & green=0;
& & & & }else
& & & & {red=0;
& & & & green=1;
& & & & & & & & if(getdata!=0)
& && &Shu[]=getdata1%10;
& & & & & & & & getdata1=getdata1/10;
& && & add++;
& & & && &&&write_sfm(add,getdata1);
LCD_writecom(0xc0+add);
for(i=5;i&=0;i--)
LCD_writedata(0x30+shu);
& & & & delay(100);
& & init();
&&& & & & LCD_init();
& & & & while(1)
& && && & ST=0;ST=1;ST=0;
& & & & & & & && &while(EOC==0);
& & & & & & & && &OE=1;
& & & & & & & && &getdata=P3;
& & & & & & & && &add=4;
& & & & & & & && &write_sfm(add,getdata);
& & & & & & & && &OE=0;
1.c(91): warning C235: parameter 1: different types
1.c(91): warning C235: parameter 2: different types
1.c(92): error C163: 'shu': unknown array size
1.c(107): error C141: syntax error near ']'
程序不全怎么debug。。。
一般来说慢慢查,不会有太大问题,都是在库函数上移植而已。
Shu[]=getdata1%10;
你把Shu[]定义成一个数组,但是又不告诉编译器这个数组多大,所以就报错了。在定义的时候要确定数组的大小。
引用回帖:: Originally posted by cyi1015 at
#include &reg51.h&
#define uchar unsigned char
#define uint unsigned int
uint getdata=0;
sbit ST=P2^3;& & & & & & & && && && && && && && &
sbit EOC=P2^4;& & & & & & & && && && && && && && &
sbit OE=P2^5;& & & & & & & && && & ... #include &reg51.h&
#define uchar unsigned char
#define uint unsigned int
uint getdata=0;//这里定义的uint,但是函数形参是uchar ,不匹配;& && && && && && && && && && && && &
sbit EOC=P2^4;& && && && && && && && && && && && &
sbit OE=P2^5;& && && && && && && && && && && && &
sbit CLK=P2^6;& && && && && && && && && && && && &
sbit ADDA=P1^0;& && && && && && && && && && && && &
sbit ADDB=P1^1;& && && && && && && && && && && && &
sbit ADDC=P1^2;& && && && && && && && && && && && &
sbit RS=P2^2;& && && && && && && && && && && && &
sbit RW=P2^1;& && && && && && && && && && && && &
sbit E=P2^0;& && && && && && && && && && && && &
sbit red=P1^3;& && && && && && && && && && && && && && && && && && &&&
sbit green=P1^4;& && && && && && && && && && && && && && && && &
void delay(uint z);& && && && && && && && && && && &
void init();& && && && && && && && && &
void LCD_init();& && && && && && && && && && && && &
void LCD_writedata(uchar getdata);& && && && && &
void LCD_writecom(uchar com);& && && && && && && && &
write_sfm(add,getdata);//函数声明需要指定形参类型,不能直接给实参,改为write_sfm(uchar add,uchar getdata)
uchar table[]=& The ppm is &;
uchar getdate,//getdate没用,你是不是想声明getdata?
/*****????****/
void delay(uint z)
&&uint i,j;
&&for(i=z;i&0;i--)
&&for(j=z;j&0;j--);& &
/****?????****/
void init()
{ TMOD=0x02;& && && && && && && && && && && && && && && &
& & TH0=216;& && && && && && && && && && && &
& & TL0=216;
& & EA=1;& && && && && && && && && && && && && && && && && && &
& & ET0=1;& && && && && && && && && && && && && && && &&&
& & TR0=1;
& && &&&ST=0;
& && &&&OE=0;
void LCD_init()
& && &&&WR=0;
& && &&&LCD_writecom(0x38);
& && &&&LCD_writecom(0x0c);
& && &&&LCD_writecom(0x06);
& && &&&LCD_writecom(0x01);
& && &&&LCD_writecom(0x80);& && && && && && && && &
& && &&&delay(5);
& && &&&for(a=0;a&11;a++)& && && && && && &
& && && && &&&LCD_writedata(table[a]);
& && && && &&&delay(5);& && && && && &
& & delay(5);& && && && && && && && && &
void t0(void) interrupt 1 using 0
& &CLK=~CLK;
void LCD_writecom(uchar com)
& && &&&P0=
& && &&&E=0;
& && &&&delay(1);
& && &&&E=1;
& && &&&delay(1);
& && &&&E=0;
void LCD_writedata(uchar temp)
{&&RW=0;& && && && && && && && &&&
& && &&&RS=1;
& && &&&P0=
& && &&&E=0;
& && &&&delay(5);
& && &&&E=1;
& && &&&delay(5);
& && &&&E=0;
//这个函数肯定是不能正常工作的,你又是迭代又是递归,你是想显示一个数吧?要么用迭代,要么递归,推荐迭代
write_sfm(uchar add,uchar getdata)& && && && && && && && &
{& && &&&uchar getdata1,getdata2;& &
& && &&&ui shu[];//ui?uint吧?还有,必须指定数组大小
& && &&&getdata1=getdata*256/51;getdata1和getdata2都声明为uchar,小心溢出
& && &&&getdata2=getdata*256/51;
& && &&&if(getdata2&10000)
& && &&&{red=1;
& && &&&green=0;
& && &&&else
& && && && && & red=0;
& && &&&green=1;
& && && && && & if(getdata!=0)
& && &shu[]=getdata1%10;//这里需要指定下标 shu[?]
& && && && && & getdata1=getdata1/10;
& && & add++;
& && && && &write_sfm(add,getdata1);
LCD_writecom(0xc0+add);
for(i=5;i&=0;i--)
LCD_writedata(0x30+shu);这里应该是shu
& && &&&delay(100);
{& && && &
& & init();
& && && & LCD_init();
& && &&&while(1)
& && && & ST=0;ST=1;ST=0;
& && && && && && &while(EOC==0);
& && && && && && &OE=1;
& && && && && && &getdata=P3;
& && && && && && &add=4;
& && && && && && &write_sfm(add,getdata);
& && && && && && &OE=0;
引用回帖:: Originally posted by cyi1015 at
#include &reg51.h&
#define uchar unsigned char
#define uint unsigned int
uint getdata=0;
sbit ST=P2^3;& & & & & & & && && && && && && && &
sbit EOC=P2^4;& & & & & & & && && && && && && && &
sbit OE=P2^5;& & & & & & & && && & ... 编辑一下吧,刚刚那个有错
#include &reg51.h&
#define uchar unsigned char
#define uint unsigned int
uint getdata=0;//这里定义的uint,但是函数形参是uchar ,不匹配;& && && && && && && && && && && && &
sbit EOC=P2^4;& && && && && && && && && && && && &
sbit OE=P2^5;& && && && && && && && && && && && &
sbit CLK=P2^6;& && && && && && && && && && && && &
sbit ADDA=P1^0;& && && && && && && && && && && && &
sbit ADDB=P1^1;& && && && && && && && && && && && &
sbit ADDC=P1^2;& && && && && && && && && && && && &
sbit RS=P2^2;& && && && && && && && && && && && &
sbit RW=P2^1;& && && && && && && && && && && && &
sbit E=P2^0;& && && && && && && && && && && && &
sbit red=P1^3;& && && && && && && && && && && && && && && && && && &&&
sbit green=P1^4;& && && && && && && && && && && && && && && && &
void delay(uint z);& && && && && && && && && && && &
void init();& && && && && && && && && &
void LCD_init();& && && && && && && && && && && && &
void LCD_writedata(uchar getdata);& && && && && &
void LCD_writecom(uchar com);& && && && && && && && &
write_sfm(add,getdata);//函数声明需要指定形参类型,不能直接给实参,改为write_sfm(uchar add,uchar getdata)
uchar table[]=& The ppm is &;
uchar getdate,//getdate没用,你是不是想声明getdata?
/*****????****/
void delay(uint z)
&&uint i,j;
&&for(i=z;i&0;i--)
&&for(j=z;j&0;j--);& &
/****?????****/
void init()
{ TMOD=0x02;& && && && && && && && && && && && && && && &
& & TH0=216;& && && && && && && && && && && &
& & TL0=216;
& & EA=1;& && && && && && && && && && && && && && && && && && &
& & ET0=1;& && && && && && && && && && && && && && && &&&
& & TR0=1;
& && &&&ST=0;
& && &&&OE=0;
void LCD_init()
& && &&&WR=0;
& && &&&LCD_writecom(0x38);
& && &&&LCD_writecom(0x0c);
& && &&&LCD_writecom(0x06);
& && &&&LCD_writecom(0x01);
& && &&&LCD_writecom(0x80);& && && && && && && && &
& && &&&delay(5);
& && &&&for(a=0;a&11;a++)& && && && && && &
& && && && &&&LCD_writedata(table[a]);
& && && && &&&delay(5);& && && && && &
& & delay(5);& && && && && && && && && &
void t0(void) interrupt 1 using 0
& &CLK=~CLK;
void LCD_writecom(uchar com)
& && &&&P0=
& && &&&E=0;
& && &&&delay(1);
& && &&&E=1;
& && &&&delay(1);
& && &&&E=0;
void LCD_writedata(uchar temp)
{&&RW=0;& && && && && && && && &&&
& && &&&RS=1;
& && &&&P0=
& && &&&E=0;
& && &&&delay(5);
& && &&&E=1;
& && &&&delay(5);
& && &&&E=0;
//这个函数肯定是不能正常工作的,你又是迭代又是递归,你是想显示一个数吧?要么用迭代,要么递归,推荐迭代
write_sfm(uchar add,uchar getdata)& && && && && && && && &
{& && &&&uchar getdata1,getdata2;& &
& && &&&ui shu[];//ui?uint吧?还有,必须指定数组大小
& && &&&getdata1=getdata*256/51;getdata1和getdata2都声明为uchar,小心溢出
& && &&&getdata2=getdata*256/51;
& && &&&if(getdata2&10000)getdata2被定义为uchar,肯定不能大于10000
& && &&&{red=1;
& && &&&green=0;
& && &&&else
& && && && && & red=0;
& && &&&green=1;
& && && && && & if(getdata!=0)
& && &shu[]=getdata1%10;//这里需要指定下标
& && && && && & getdata1=getdata1/10;
& && & add++;
& && && && &write_sfm(add,getdata1);
LCD_writecom(0xc0+add);
for(i=5;i&=0;i--)
LCD_writedata(0x30+shu);这里需要指定下标
& && &&&delay(100);
{& && && &
& & init();
& && && & LCD_init();
& && &&&while(1)
& && && & ST=0;ST=1;ST=0;
& && && && && && &while(EOC==0);
& && && && && && &OE=1;
& && && && && && &getdata=P3;
& && && && && && &add=4;
& && && && && && &write_sfm(add,getdata);
& && && && && && &OE=0;
引用回帖:: Originally posted by fj10 at
编辑一下吧,刚刚那个有错
#include &reg51.h&
#define uchar unsigned char
#define uint unsigned int
uint getdata=0;//这里定义的uint,但是函数形参是uchar ,不匹配;& && && && && && && && & ... 给力
24小时热帖
下载小木虫APP
与700万科研达人随时交流

我要回帖

更多关于 keil编程 的文章

 

随机推荐