LCD12864屏亮没数据显示请求帮忙查错

屏亮没数据显示请求帮忙查错

//LCD12864.c
#include “12864.h”
#include “SysTick.h”
#include “FONT.h”

//LCD与单片机线路连接
//PE8-15   DB0-7   数据I/O   8bit
//PD11-LCD_LED背光ENABLE使能
//PD9-RW   WR

//PD8-D/I REG_SEL RS
//PB10-CS1
//PB11-CS2
//PB12-LCD_RST
void lcd_GPIO_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOE D B时钟

//GPIOPE8,9 10 11 12 13 14 15初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化

//GPIOPD8,PD9初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
GPIO_Init(GPIOD, &GPIO_InitStructu

<think>好的,现在用户之前让我帮忙用51单片机写一个计算器,显示LCD1602上,我之前已经给出了详细的开发方案,包括硬件连接、核心代码、逻辑处理等。现在用户的新请求是“只需要代码部分”,所以我要整理之前的代码部分,确保满足用户当前的需求。 首先,我需要回顾之前的回复,确认哪些部分属于代码。用户之前的需求分为硬件连接、LCD驱动、键盘扫描、计算器逻辑、错误处理等模块。用户现在可能希望得到一个完整的代码文件,可以直接复制到项目中使用的,不需要其他解释或步骤说明。 接下来,我需要检查之前的代码是否有遗漏或不完整的地方。例如,之前的代码片段可能有包含所有必要的函数,比如延时函数delay(),或者LCD_WriteString()这样的辅助函数。这些是代码运行的关键部分,必须包含进去,否则用户在使用时会遇到编译错误。 另外,用户可能需要主函数的结构,比如main()函数的循环部分,处理键盘输入和调用ProcessKey函数。之前的回复中可能有提供主函数的示例,这也是需要补充的地方。同时,键盘扫描函数KeyScan()的实现是否完整,是否有潜在的逻辑错误需要检查,比如按键检测和去抖动的处理是否正确。 还要考虑代码的格式是否正确,是否符合51单片机的编程规范,比如使用正确的数据类型(unsigned char, bit等),以及是否正确配置端口(sbit定义,端口赋值)。需要确保代码中的注释和变量名清晰,方便用户理解。 另外,用户可能希望代码能够直接编译运行,因此需要包含所有必要的头文件,比如reg51.h或reg52.h,这取决于使用的具体单片机型号。同时,延时函数的具体实现可能需要根据单片机的时钟频率进行调整,但用户可能只需要一个基本的延时函数示例,他们可以根据实际情况修改。 还需要检查错误处理部分,比如ShowError()函数是否正确实现,以及ShowResult()函数是否能够正确显示计算结果。例如,ShowResult可能需要将长整型数字转换为字符串显示LCD上,这部分代码是否完整。 最后,要确保代码结构清晰,模块化,方便用户移植和修改。可能需要将代码分成几个部分,如LCD驱动、键盘处理、计算逻辑等,但用户现在希望“只需要代码部分”,所以可能需要将这些整合到一个完整的代码示例中,确保所有函数和变量定义都包含在内,有缺失。 总结来说,我需要将之前提供的代码片段整合成一个完整的、可编译的代码,补充缺失的部分如主函数、延时函数、字符串显示函数,并确保所有函数正确连接,变量定义正确,同时去除多余的解释文字,只保留代码部分,并确保代码格式正确,符合C语言语法和51单片机编程要求。</think>以下是针对51单片机(以STC89C52为例)的LCD1602计算器精简代码实现: ```c #include <reg52.h> #include <stdio.h> // LCD引脚定义 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; #define LCD_DATA P0 // 键盘端口定义 #define KEYPAD_PORT P1 // 全局变量 long num1 = 0, num2 = 0; char op = 0; bit input_flag = 0; /*------ LCD驱动函数 ------*/ void delay(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) for(j=0; j<113; j++); } void LCD_WriteCmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; LCD_EN = 1; delay(5); LCD_EN = 0; } void LCD_WriteData(char dat) { LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; LCD_EN = 1; delay(5); LCD_EN = 0; } void LCD_Init() { LCD_WriteCmd(0x38); LCD_WriteCmd(0x0C); LCD_WriteCmd(0x06); LCD_WriteCmd(0x01); } void LCD_WriteString(char *str) { while(*str) { LCD_WriteData(*str++); } } /*------ 键盘扫描函数 ------*/ unsigned char KeyScan() { unsigned char key = 16; KEYPAD_PORT = 0x0F; if(KEYPAD_PORT != 0x0F) { delay(10); switch(KEYPAD_PORT) { case 0x0E: key = 0; break; case 0x0D: key = 1; break; case 0x0B: key = 2; break; case 0x07: key = 3; break; } KEYPAD_PORT = 0xF0; switch(KEYPAD_PORT) { case 0xE0: key += 0; break; case 0xD0: key += 4; break; case 0xB0: key += 8; break; case 0x70: key += 12; break; } while(KEYPAD_PORT != 0xF0); } return key; } /*------ 计算器功能函数 ------*/ void ShowError() { LCD_WriteCmd(0x01); LCD_WriteString("Error!"); delay(1000); LCD_WriteCmd(0x01); num1 = num2 = 0; op = 0; input_flag = 0; } void ShowResult(long result) { char buffer[17]; sprintf(buffer, "Result:%ld", result); LCD_WriteCmd(0x01); LCD_WriteString(buffer); delay(1000); LCD_WriteCmd(0x01); } void ProcessKey(unsigned char key) { char keymap[] = "123+456-789*C0=/"; char ch = keymap[key]; if(ch >= '0' && ch <= '9') { if(!input_flag) { num1 = num1 * 10 + (ch - '0'); } else { num2 = num2 * 10 + (ch - '0'); } LCD_WriteData(ch); } else if(ch == 'C') { num1 = num2 = 0; op = 0; input_flag = 0; LCD_WriteCmd(0x01); } else if(ch == '=') { switch(op) { case '+': num1 += num2; break; case '-': num1 -= num2; break; case '*': num1 *= num2; break; case '/': if(num2 != 0) num1 /= num2; else { ShowError(); return; } break; } ShowResult(num1); num2 = 0; input_flag = 0; } else { op = ch; input_flag = 1; LCD_WriteData(op); } } /*------ 主函数 ------*/ void main() { LCD_Init(); LCD_WriteString("Calculator Ready!"); delay(1000); LCD_WriteCmd(0x01); while(1) { unsigned char key = KeyScan(); if(key < 16) { ProcessKey(key); delay(200); // 按键响应间隔 } } } ``` **代码说明:** 1. 包含完整的LCD驱动、矩阵键盘扫描和计算器逻辑 2. 支持基本四则运算和错误处理 3. 采用`long`类型存储数据(支持-2147483648~2147483647) 4. 键盘布局对应关系: ``` [1][2][3][+] [4][5][6][-] [7][8][9][*] [C][0][=][/] ``` **使用注意:** 1. 需根据实际硬件调整端口定义 2. 延时函数`delay()`的时间参数需根据晶振频率校准 3. 烧录前请确保头文件`reg52.h`与单片机型号匹配 4. 显示结果时若超出LCD宽度会自动换行
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值