完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
初始化显示乱码!复位之后正常显示,再复位又是乱码,反复这样下去
1602驱动 #include"sys.h" #include"delay.h" #include"ds1602.h" u16 val; void wait(void) { GPIOB->CRH&=0x0fffffff; GPIOB->CRH|=0x80000000; WR=1; delay_ms(5); RD=0; delay_ms(5); EN=1; delay_ms(5); val=GPIOB->IDR; while(val&0x8000) { val=(GPIOB->IDR); delay_ms(5); } EN=0; delay_ms(5); GPIOB->CRH&=0x0fffffff; GPIOB->CRH|=0x30000000; } void write_com(u16 com) { wait(); WR=0; delay_ms(5); RD=0; delay_ms(5); EN=0; delay_ms(5); GPIOB->BSRR=(com<<8)&0xf000; GPIOB->BRR=((~com)<<8)&0xf000; delay_ms(5); EN=1; delay_ms(5); EN=0; delay_ms(5); GPIOB->BSRR=(com<<12)&0xf000; GPIOB->BRR=((~com)<<12)&0xf000; delay_ms(5); EN=1; delay_ms(5); EN=0; delay_ms(5); } void write_date(u16 date) { wait(); WR=0; delay_ms(5); RD=1; delay_ms(5); EN=0; delay_ms(5); GPIOB->BSRR=(date<<8)&0xf000; GPIOB->BRR=((~date)<<8)&0xf000; delay_ms(5); EN=1; delay_ms(5); EN=0; delay_ms(5); GPIOB->BSRR=(date<<12)&0xf000; GPIOB->BRR=((~date)<<12)&0xf000; delay_ms(5); EN=1; delay_ms(5); EN=0; delay_ms(5); } void lcd1602_init(void) { write_com(0x28); write_com(0x0c); write_com(0x06); write_com(0x01); } 主函数 #include<STM32f10x_lib.h> #include"sys.h" #include"delay.h" #include"usart.h" #include"ds1602.h" u8 table[]="I LOVE YOU "; void GPIO_init() { RCC->APB2ENR|=0x3<<2; GPIOB->CRH=0x33333333; GPIOB->CRL&=0xfffff000; GPIOB->CRL|=0x00000333; } int main() { u8 i; stm32_systime_init(9); delay_init(72); JTAG_set(0x04); GPIO_init(); lcd1602_init(); while(1) { write_com(0x80); for(i=0;i<11;i++) { write_date(table[i]); delay_ms(5); } write_com(0x80+0x40+1); for(i=0;i<11;i++) { write_date(table[i]); delay_ms(5); } } } |
|
相关推荐
2个回答
|
|
试试这个程序
如果不行的话,那有可能是你的LCD出问题了 #include #include"sys.h" #include"delay.h" #define RS_OUT PBout(1) #define RW_OUT PBout(2) #define EN_OUT PBout(0) #define DATA_OUT(data) {GPIOB->ODR=(GPIOB->ODR&0X00FF)|(data<<8);} extern u8 LCD_Buffer1[16]; extern u8 LCD_Buffer2[16]; extern void LCD_GPIO_Init(void); extern void LCD_Write_Cmd(u8 Cmd); extern void LCD_Write_Data(u8 Data); extern void LCD_Display_String(u8 Position,u8 *s); extern void LCD_Display_Number(u8 Position,u8 Data); extern void LCD_Display_Voltage(u8 Position,u16 Data); extern void LCD_Init(void); u8 LCD_Buffer1[16]={" I LOVE YOU "}; u8 LCD_Buffer2[16]={" MCU STM32 "}; void LCD_GPIO_Init(void) { RCC->APB2ENR|=1<<3; //PB 时钟使能 GPIOB->CRL&=0XFFFFF000; GPIOB->CRL|=0X00000333;//50MHz推挽输出 GPIOB->CRH&=0X00000000; GPIOB->CRH|=0X33333333; } void LCD_Write_Cmd(u8 Cmd) { RS_OUT=0; RW_OUT=0; DATA_OUT(Cmd); delay_ms(1); EN_OUT=1; delay_ms(1); EN_OUT=0; } void LCD_Write_Data(u8 Data) { RS_OUT=1; RW_OUT=0; DATA_OUT(Data); delay_ms(1); EN_OUT=1; delay_ms(1); EN_OUT=0; } void LCD_Display_String(u8 Position,u8 *s) { u8 i=0; LCD_Write_Cmd(0x80+Position); for(i=0;i<16;i++) { LCD_Write_Data(s[i]); delay_ms(1); } } void LCD_Display_Number(u8 Position,u8 Data) { LCD_Write_Cmd(0x80+Position); LCD_Write_Data(0x30+Data); } void LCD_Init(void) { LCD_GPIO_Init(); LCD_Write_Cmd(0x38); LCD_Write_Cmd(0x01); LCD_Write_Cmd(0x06); LCD_Write_Cmd(0x0c); } |
|
|
|
我的1602是4位数据传输的,不是8位的,所以8位的数据要分两次进行传输啊,液晶显示模式是0X28,0X38是行不通的,不过也谢谢你。。。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1049 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1017 浏览 2 评论
2123 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1219 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1639 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 09:34 , Processed in 0.504256 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号