|
发表于 2021-2-1 16:56:19
|
显示全部楼层
既然另一个有正确反应(出现闪烁光标),那就好。我记得你还有 AVR,你接到 AVR 上测试看看
- /*
- * HD44780.c
- *
- * Created: 2019/2/8 16:31:01
- * Author : washu
- */
- #define F_CPU 1000000
- #include <avr/io.h>
- #include <avr/iom8.h>
- #include <util/delay.h>
- #include <stdio.h>
- void InitMCU(void);
- void StrobeHD44780(void);
- void WriteInstruction(unsigned char bDat);
- void WriteDatums(unsigned char bDat);
- void InitHD44780(int ShowCursor, int BlinkCursor);
- void ShowString(int dX, int dLine, char *strLine);
- #define LCD_StB PB4
- #define LCD_DoI PB5
- #define LCD_Dat PORTB
- #define LCD_Control PORTB
- #define LCD_STATE_Instruction() LCD_Control = LCD_Control & ~(1 << LCD_DoI)
- #define LCD_STATE_Datums() LCD_Control = LCD_Control | (1 << LCD_DoI)
- #define LCD_STATE_ENABLE() LCD_Control = LCD_Control | (1 << LCD_StB)
- #define LCD_STATE_DISABLE() LCD_Control = LCD_Control & ~(1 << LCD_StB)
- #define LED_Test PC2
- #define LED_Control PORTC
- #define LED_ON() LED_Control = LED_Control | (1 << LED_Test)
- #define LED_OFF() LED_Control = LED_Control & ~(1 << LED_Test)
- int main(void)
- {
- unsigned char i = 0;
- char sbuff[32];
- InitMCU();
- InitHD44780(0, 1);
- ShowString(2, 0, "HD44780 Test");
- ShowString(1, 1, "abcdefg");
- ShowString(3, 1, " ");
- while (1)
- {
- LED_ON();
- _delay_ms(500);
- LED_OFF();
- _delay_ms(500);
- i = i + 1;
-
- sprintf (sbuff, "%02X", i);
- ShowString(12, 1, sbuff);
- }
- }
- void InitMCU(void)
- {
- DDRB = 0xff;
- DDRC = 0xff;
- DDRD = 0xff;
- PORTB = 0;
- PORTC = 0b00000111;
- PORTD = 0;
- }
- void StrobeHD44780(void)
- {
- _delay_us(1);
- LCD_STATE_ENABLE();
- _delay_us(35); //具体值看手册
- LCD_STATE_DISABLE();
- _delay_us(1);
- }
- void WriteInstruction(unsigned char bDat)
- {
- LCD_STATE_Instruction();
- LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b11110000) >> 4;
- StrobeHD44780();
- LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b00001111);
- StrobeHD44780();
- }
- void WriteDatums(unsigned char bDat)
- {
- LCD_STATE_Datums();
- LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b11110000) >> 4;
- StrobeHD44780();
- LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b00001111);
- StrobeHD44780();
- }
- void InitHD44780(int ShowCursor, int BlinkCursor)
- {
- WriteInstruction(0x33);
- LCD_Dat = (LCD_Dat & 0b11110000) | 0x03;
- StrobeHD44780();
- LCD_Dat = (LCD_Dat & 0b11110000) | 0x02;
- StrobeHD44780();
- WriteInstruction(0x28);
- WriteInstruction(0b00001100 | (ShowCursor & 0b00000001) << 1 | (BlinkCursor & 0b00000001));
- WriteInstruction(0x01);
- _delay_ms(2); //该指令需要一定时间执行,看手册留足够时间
- }
- void ShowString(int dX, int dLine, char *strLine)
- {
- WriteInstruction(0b10000000 | (dLine & 0b00000001) << 6 | (dX & 0b00111111));
- while (*strLine)
- {
- WriteDatums(*strLine);
- strLine++;
- }
- }
复制代码 |
|