搜索
bottom↓
回复: 5

看看我的用于GCC(AtmanAVR)的1602液晶驱动,C++的.

[复制链接]

出0入0汤圆

发表于 2005-12-18 00:50:57 | 显示全部楼层 |阅读模式
个人觉得用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);

}

出0入0汤圆

 楼主| 发表于 2005-12-18 00:57:26 | 显示全部楼层
只修改头文件就可以让1602液晶在不同的管脚上跑了,并且这样的定义可以实现类似PORTA.PIN1=0这样的语法,使用起来好方便哦.

用类的继承分离了比较底层的硬件操作,代码维护起来比较方便,但就是开销太大了.
-----此内容被linhaimi于2005-12-18,00:58:22编辑过

出0入0汤圆

发表于 2005-12-18 01:15:54 | 显示全部楼层
不错,何不在AVR Studio上直接玩C++???

出0入0汤圆

 楼主| 发表于 2005-12-18 11:19:14 | 显示全部楼层
AtmanAVR其实满不错的,好歹还有一定的智能感知功能,有一个代码向导,但就是使用期只有一个月,一个月后重装都没有.其实在AtmanAVR过期后把下面的文件解压到Atman的安装目录的bin下面,运行那个脚本,在重装AtmanAVR就可以了.反正AtmanAVR5.1我就是这样用的.

点击此处下载armok0192666.rar

出0入0汤圆

发表于 2005-12-18 19:29:53 | 显示全部楼层
对AtmanAVR实在没兴趣...建议早点回头...

出0入0汤圆

发表于 2006-2-13 09:11:12 | 显示全部楼层
各位同道,新手上路。我对*.h文件,比如#include<iom16v.h>,我在winavr只找到“iom16.h“。如果make all时,会出现错误:no such file or directory,请教如何???谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 01:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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