stm32的1602操作显示

在将8051的1602液晶屏驱动代码移植到STM32上时遇到问题,由于两者IO输出电压稳定时间差异,导致显示不成功。解决方案是在STM32中增加适当的延时,并调整GPIO配置以适应5V、10K上拉电阻的环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次,移植8051的代码发现不成功

经过多次测试,IO输出的电压稳定时间跟8051不同,得做延时在5V,10K上拉的情况下,GPIO需重新配置

/********************************************************************

  接口1:void lcd1602dis(uchar *dis1,uchar address1,uchar n)
  详细: dis1第一行显示数据指针,要写入address1第X行的首位置,n为写入字符数
         每行只能40字节最多  0位置-39位置    第一行:0x00-0x27    第二行:0x40-0x67                        
         一次运行       n为忙碌返0平均次数,i为每行写入次数
  接口2:void itp_lcd1602dis(uchar *dis1,uchar address1,uchar n)
  详细:  中断中为避免重调用的显示函数    其余同上
  接口3:void flash(uchar j,uchar d)  
  详细:    功能j次闪烁,间隔d毫秒     不返还CPU
  接口4:void lcd_clr()                  
  详细:  清屏	 一次运行
  接口5: void lcd_init() 
  详细:  初始化  运行
********************************************************************/

/********************************************************************
注:硬件接口:插口在显示屏上端插入,P0为数据端,RS = P2^6   RW = P2^5  EN = P2^7
********************************************************************/							   
u8 nop;
#define no_oper nop=~nop; 
#include "stm32f10x_lib.h"
extern void GPIO_Configuration2(void);
extern void Uart1_PutString(u8* buf , u8 len);
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
#define u8 unsigned char
#define u16  unsigned int

u8 display2[]="inithalf";
u8 display1[]="wdatbusydone";
  u8 tmpdis;
/*#define LCD_RS    //= P2^6;                                                        
#define LCD_RW    //= P2^5;                                                        
#define LCD_EN    //= P2^7;*/
/********************************宏定义*********************************/
#define    P0i(x)      GPIO_Write(GPIOA, (uint)x);
#define    P0o(x)      x=(u8)(0x0011&GPIO_ReadInputData(GPIOA));
//控制孔得PP输出
#define    LCD_RS(x)  x ? GPIO_SetBits(GPIOB, GPIO_Pin_1): GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define    LCD_RW(x)  x ? GPIO_SetBits(GPIOB, GPIO_Pin_2): GPIO_ResetBits(GPIOB, GPIO_Pin_2)
#define    LCD_EN(x)  x ? GPIO_SetBits(GPIOB, GPIO_Pin_0): GPIO_ResetBits(GPIOB, GPIO_Pin_0)   //如此能延长单步时间,达到51 I/O读取时间                                                                           
       //P0为数据口                                                 
     /*1。“code”是单片机C语言特有的关键字在单片机中RAM的空间特别小,特别珍贵。RAM空间,存放变量。
	 而一些常量,比如码表等常量放在ROM中。所以单片机中code就是告诉单片机这个数据放入ROM中。
	 本例中dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; 数组内容为常量,故加上code,以节约RAM的空间。
	 其实code放在unsigned char 前也可以,比如code unsigned char dispbit[8]效果一样*/                                                                     
//uchar code dis1[]         //uchar 正好为ASCII码 8位一字节                         

   //8051片内数据存储器除RAM(00-7fh)之外,还有特殊功能寄存其SFR(80H-FFH),两者合起来共有256字节,但是能够真正用来当数据寄存器的只有128字节,也就是RAM。                                                                        
 
 void NOP()
{ vu16 i;
  for(i=0; i<100; i++); 
}
void nop_stm32()
{ u8 i;
  for(i=0; i<6; i++); 
} 
void nop6()
{ u8 i;
  for(i=0; i<6; i++); 
} 
void nop12()
{ u8 i;
  for(i=0; i<12; i++); 
} 
void nop24()
{ u8 i;
  for(i=0; i<24; i++); 
} 
void nop48()
{ u8 i;
  for(i=0; i<48; i++); 
} 

/*******************************************************************/      
/*                                                                         
 延时子程序                                                              
*/                                                                         
/*******************************************************************/      
                                                                           
void delaylcd(int ms)                                                         
{                                                                          
   int i;                                                                  
   while
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值