OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9184|回复: 7

51的程序移植到stm32问题,大神进,小弟非常感谢

[复制链接]

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-15 09:03:55 | 显示全部楼层 |阅读模式
5金钱
我有个51的1602液晶显示屏,有正确的hex文件和工程文件,但是不知道硬件怎么连接的,所以我用工程文件做了判断,然后移植到stm32上出现乱码,求大神指点,小弟非常感谢

[mw_shl_code=c,true]1602.c文件 #include"1602.h" /******************************************************************************* * 函 数 名 : Lcd1602_Delay1ms * 函数功能 : 延时函数,延时1ms * 输 入 : c * 输 出 : 无 * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //误差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能 : 向LCD写入一个字节的命令 * 输 入 : com * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待数据稳定 LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } #else void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能清零 LCD1602_RS = 0; //选择写入命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; // Lcd1602_Delay1ms(1); LCD1602_DATAPINS = com << 4; //发送低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif /******************************************************************************* * 函 数 名 : LcdWriteData * 函数功能 : 向LCD写入一个字节的数据 * 输 入 : dat * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat) //写入数据 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //选择输入数据 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = dat; //写入数据 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } #else void LcdWriteData(uchar dat) //写入数据 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //选择写入数据 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; LCD1602_DATAPINS = dat << 4; //写入低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif /******************************************************************************* * 函 数 名 : LcdInit() * 函数功能 : 初始化LCD屏 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x38); //开显示 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点 } #else void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x32); //将8位总线转为4位总线 LcdWriteCom(0x28); //在四位线下的初始化 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点 } #endif[/mw_shl_code]
[mw_shl_code=c,true]1602.h #ifndef __LCD_H_ #define __LCD_H_ /********************************** 当使用的是4位数据传输的时候定义, 使用8位取消这个定义 **********************************/ #define LCD1602_4PINS /********************************** 包含头文件 **********************************/ #include<reg51.h> //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif /********************************** PIN口定义 **********************************/ #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; /********************************** 函数声明 **********************************/ /*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差 0us /*LCD1602写入8位命令子函数*/ void LcdWriteCom(uchar com); /*LCD1602写入8位数据子函数*/ void LcdWriteData(uchar dat) ; /*LCD1602初始化子程序*/ void LcdInit(); #endif[/mw_shl_code]

[mw_shl_code=c,true]main函数 /******************************************************************************* * * 普中科技 -------------------------------------------------------------------------------- * 实 验 名 : LCD1602显示试验 * 实验说明 : LCD1602显示Pechin Science * 连接方式 : 见连接图 * 注 意 : *******************************************************************************/ #include<reg51.h> #include"1602.h" //--定义全局变量--// unsigned char PuZh[]="Pechin Science"; /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main(void) { unsigned char i; LcdInit(); for(i=0;i<16;i++) { LcdWriteData(PuZh); } while(1) { } }[/mw_shl_code]

我的stm32硬件是这样的PB8-PB15对应P0.0-p.7   PB0-PB7对应P2.7-P2.0,然后我根据成功的51文件推测是P0.4-P0.7四个IO作为输出的,然后P2.5-P2.7作为控制端,下面是stm32工程文件
[mw_shl_code=c,true]main函数 #include "sys.h" #include "delay.h" #include "lcd.h" unsigned char PuZh[]="CHINA"; int main(void) { u8 cc; delay_init(); //延时初始化 init1602(); for(cc=0;cc<6;cc++) { write_dat(PuZh[cc]); } while(1) { }[/mw_shl_code]
[mw_shl_code=c,true]lcd.c #include "lcd.h" #include "sys.h" #include "delay.h" #define rs PBout(1) //RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 #define wr PBout(2) //R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。->下一行 //当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 #define en PBout(0) //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令 void init1602(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //SWJ 完全失能(JTAG+SW-DP) //APB2外设时钟使能寄存器(RCC_APB2ENR) //使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //PB端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); write_com(0x32); //将8位总线转为4位总线 write_com(0x28); //在四位线下的初始化 write_com(0x0c); //开显示不显示光标 write_com(0x06); //写一个指针加1 write_com(0x01); //清屏 write_com(0x80); //设置数据指针起点 } /*******************写指令函数************************/ void write_com(unsigned char com) { rs=0; wr=0; en=0; delay_ms(2); GPIOB->ODR=((0XF0&com)<<8); delay_ms(5); en=1; delay_ms(5); en=0; delay_ms(5); GPIOB->ODR=((0X0F&com)<<12); delay_ms(5); en=1; delay_ms(5); en=0; } /*******************写数据函数************************/ void write_dat(unsigned char date) { rs=1; wr=0; en=0; delay_ms(2); GPIOB->ODR=((0X2FF&date)<<8); delay_ms(5); en=1; delay_ms(5); en=0; GPIOB->ODR=(((0X20F&date)<<12)+2); delay_ms(5); en=1; delay_ms(5); en=0; } [/mw_shl_code]
[mw_shl_code=c,true]lcd.h #ifndef __1602_H #define __1602_H #include "sys.h" void init1602(void); void write_com(unsigned char com); void write_dat(unsigned char date); //void write_2date(unsigned char a,unsigned char b); #endif [/mw_shl_code]



最佳答案

查看完整内容[请看2#楼]

论坛搜索,有人搞出来了
愈挫愈勇
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-15 09:03:56 | 显示全部楼层
论坛搜索,有人搞出来了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-15 22:40:27 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
谢谢山姆哥
愈挫愈勇
回复

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2014-5-16 00:17:47 | 显示全部楼层
1602,   so easy
学电子,学音乐!!
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-16 08:12:43 | 显示全部楼层
回复【3楼】非常完美:
---------------------------------
回复【4楼】XINSI:
---------------------------------
听到没,这才是高手,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-16 08:33:14 | 显示全部楼层
回复【4楼】XINSI:
---------------------------------
帮我看看呗,非常感谢,小弟菜鸟,再次谢过
愈挫愈勇
回复

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2014-10-13
在线时间
4 小时
发表于 2014-12-5 19:53:31 | 显示全部楼层
回复【3楼】非常完美:
---------------------------------
我也想要程序
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2014-12-5 21:30:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 06:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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