|
个人觉得用C++的话代码组织的比较容易,不过内存消耗好像比C要大些.
这是主函数:
#include "1602LCDTEST.h"
#include "1602.h"
Lcd1602 Lcd;
int main(void)
{
Lcd.Puts("www.ouravr.com");
asm("sleep");
}
够简洁吧,
这是头文件:
#include <avr\io.h>
#ifndef _1602_H_1341661
#define _1602_H_1341661
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef struct
{
uint8 rw : 1;
uint8 rs : 1;
uint8 en : 1;
} lcd_port;
#define lcd_data PORTA
#define lcd_data_ddr DDRA
#define lcd_port_ddr DDRD
#define lcd_rs ((lcd_port*)&PORTD)->rs
#define lcd_rw ((lcd_port*)&PORTD)->rw
#define lcd_en ((lcd_port*)&PORTD)->en
class LcdBase
{
protected:
void WriteCmd(uint8 cmd);
void WriteData(uint8 data);
};
class Lcd1602 : LcdBase
{
public:
Lcd1602(void);
void Clear(void);
void PutChar(uint8 data);
void Puts(const char* data);
void GotoXY(uint8 x, uint8 y);
};
#endif
这是代码的实现:
#include "1602.h"
#include <delay.h>
#define nop asm("nop")
void LcdBase::WriteCmd(uint8 cmd)
{
lcd_data = cmd;
nop;
lcd_rs = 0;
nop;
lcd_rw = 0;
nop;
lcd_en = 0;
delay(1, 8000);
lcd_en = 1;
}
void LcdBase::WriteData(uint8 data)
{
lcd_data = data;
nop;
lcd_rs = 1;
nop;
lcd_rw = 0;
nop;
lcd_en = 0;
delay(1, 8000);
lcd_en = 1;
}
Lcd1602::Lcd1602(void)
{
uint8 i = 0;
lcd_data_ddr = 0xFF;
lcd_port_ddr = 0xFF;
for (i = 0; i < 3; i++)
{
WriteCmd(0x38);
delay(5, 8000);
}
Clear();
WriteCmd(0x0C);
}
void Lcd1602::PutChar(uint8 data)
{
WriteData(data - '!' + 0x21);
}
void Lcd1602::Clear(void)
{
WriteCmd(0x01);
delay(5, 8000);
}
void Lcd1602::Puts(const char* data)
{
uint8 i = 0;
while (data != '\0')
WriteData(data[i++]);
}
void Lcd1602::GotoXY(uint8 x, uint8 y)
{
y &= 0x1;
x &= 0xF;
if (y) x |= 0x40;
x |= 0x80;
WriteCmd(x);
} |
|