搜索
bottom↓
回复: 29

HS12232-9带汉字库的2行7位半汉字LCD模块WINAVR C++演示程序

[复制链接]

出0入0汤圆

发表于 2005-1-17 13:15:58 | 显示全部楼层 |阅读模式
/*------------------------------------------------------------

    HS12232-9带汉字库的2行7位半汉字LCD模块WINAVR C++演示程序

HotPower@126.com                    2005.1.17

-------------------------------------------------------------*/



#include <inttypes.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/wdt.h>

#include <avr/ina90.h>

#include <avr/eeprom.h>

//#include <stdio.h>

#include <avr/delay.h>

#include <avr/io.h>

#include <avr/delay.h>

#include <string.h>

#include <stdlib.h>



#define  FREQ 8  //Meaga8L,8MHz



#define  SS   PB2//LCD片选(串行) 0:禁止 1:允许

#define  MOSI PB3//LCD输入串行数据(串行)

#define  SCK  PB5//LCD输入串行脉冲(串行)



class LcdSpiObj {

private:

  unsigned char LcdRow,LcdCol;

  void LcdSpiModeSetup(void);

public:

  LcdSpiObj(void);//LcdSpiObj的构造函数

  void LcdSpiSend(unsigned char);

  void LcdSpiDelayMs(unsigned int);

  void LcdInit(void);

  void LcdSendCommand(unsigned char);

  void LcdSendData(unsigned char);

  unsigned char SetLcdDisplayPos(unsigned char, unsigned char);

  void GetLcdDisplayPos(unsigned char &, unsigned char &);

  void LcdDisplayPos(unsigned char, unsigned char, const char *);

  void LcdDisplayString(const char *);

  void LcdDisplayNumber(char);

  void LcdDisplayNumber(int);

};





LcdSpiObj::LcdSpiObj(void)

{

  LcdRow = 0;

  LcdCol = 0;

  LcdSpiModeSetup();

}



void LcdSpiObj::LcdSpiModeSetup(void)

{

/* 设置MOSI 和SCK 及SS 为输出,其他为输入 */

  DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS);

  PORTB = (1 << MOSI) | (1 << SCK) | (1 << SS);

//  PORTB = 0xff;

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式0*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);//不支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式1*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << SPR0);//支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式2*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << SPR0);//不支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式3*/

  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPR0);//支持!!!

}



void LcdSpiObj::LcdSpiSend(unsigned char cData)

{

/* 启动数据传输 */

  SPDR = cData;

/* 等待传输结束 */

  while(!(SPSR & (1 << SPIF)));

}



void LcdSpiObj::LcdSpiDelayMs(unsigned int t)

{

unsigned int i;

  for(i = 0; i < t; i++)

    _delay_loop_2(250 * FREQ);

}





/*--------------------------------------------------------

    发送8位LCD控制命令

--------------------------------------------------------*/

void LcdSpiObj::LcdSendCommand(unsigned char cCommand)

{

/*--------------------------------------------------------

    发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)

--------------------------------------------------------*/

  PORTB |= (1 << SS);//SS=1,启动SPI

  LcdSpiSend(0xf8);//发送LCD控制命令

  LcdSpiSend(cCommand & 0xf0);//发送高4位LCD控制命令

  LcdSpiSend(cCommand << 4);//发送低4位LCD控制命令

  PORTB &= ~(1 << SS);//SS=0,关闭SPI

  if (cCommand == 0x01) _delay_loop_2(1600 * FREQ);//1.6mS

  else _delay_loop_2(72 * FREQ);//st7920要求等待72uS

}



/*--------------------------------------------------------

    发送8位LCD显示数据

--------------------------------------------------------*/

void LcdSpiObj::LcdSendData(unsigned char cData)

{

/*--------------------------------------------------------

    发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)

--------------------------------------------------------*/

  PORTB |= (1 << SS);//SS=1,启动SPI

  LcdSpiSend(0xfa);//发送LCD显示数据

  LcdSpiSend(cData & 0xf0);//发送高4位LCD显示数据

  LcdSpiSend(cData << 4);//发送低4位LCD显示数据

  PORTB &= ~(1 << SS);//SS=0,关闭SPI

  _delay_loop_2(72 * FREQ);//st7920要求等待延时72uS

}





/*---------------------------------------------------

    LCD初始化设置

----------------------------------------------------*/

void LcdSpiObj::LcdInit(void)

{

/*---------------------------------------------------

    LCD模块上电等待延时

----------------------------------------------------*/

  LcdSpiDelayMs(1000);//上电等待延时1000Ms

  LcdSpiModeSetup();//SPI初始化

  LcdSendCommand(0b00100000);//发送4位控制命令

//  LcdSendCommand(0b00110000);//发送8位控制命令//与8位4位无关!!!

  LcdSendCommand(0b00000010);//发送位址归位命令,设定DDRAM位址计数器为0

  LcdSendCommand(0b00000100);//发送进入点命令

  LcdSendCommand(0b00001100);//发送开显示关光标命令

  LcdSendCommand(0b00000001);//发送清除显示命令

  LcdSendCommand(0b10000000);//发送设定DDRAM地址0x00命令

}



unsigned char LcdSpiObj::SetLcdDisplayPos(unsigned char row, unsigned char col)

{

  if ((row < 2) && (col < 8)) {//汉字字符为2行7.5列(汉字必须偶数对齐)

    LcdSendCommand(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令

        LcdRow = row;

        LcdCol = col << 1;

        return 1;

  }

  else

    return 0;

}



void LcdSpiObj::GetLcdDisplayPos(unsigned char &row, unsigned char &col)

{

  row = LcdRow;

  col = LcdCol;

}





void LcdSpiObj::LcdDisplayPos(unsigned char row, unsigned char col, const char * string)

{

  if (SetLcdDisplayPos(row, col)) LcdDisplayString(string);

}





void LcdSpiObj::LcdDisplayString(const char * string)

{

  while(*string) {

    LcdSendData(*string ++);

        LcdCol ++;

  }

}



//注意下列2个函数(函数重载)

void LcdSpiObj::LcdDisplayNumber(char Val)

{

char str[4];

  itoa((int)Val, (char *)str, 10);

  LcdDisplayString((char *)str);

}



void LcdSpiObj::LcdDisplayNumber(int Val)

{

char str[6];

  itoa(Val, (char *)str, 10);

  LcdDisplayString((char *)str);

}





LcdSpiObj LcdSpi;



//main程序

int main(void)

{

unsigned int i = 0;

unsigned char row, col;

  LcdSpi.LcdInit();

  LcdSpi.SetLcdDisplayPos(0, 1);//汉字定位到上行左端

  LcdSpi.LcdDisplayString("汉字显示演示");

// sei();

  for(;;) {

    LcdSpi.LcdSpiDelayMs(1000);//上电等待延时1000Ms

    LcdSpi.SetLcdDisplayPos(1,0);//字符定位到下行左端

    LcdSpi.LcdDisplayString("123456789ABCDEF");//必须换行

    LcdSpi.LcdDisplayPos(1, 4, "汉字");

    LcdSpi.GetLcdDisplayPos(row, col);//解除C语言的&row,&col之烦恼

    LcdSpi.SetLcdDisplayPos(1, 6);

    LcdSpi.LcdDisplayNumber(row);//字节型数字(0~255)

    LcdSpi.LcdDisplayNumber(col);

    LcdSpi.SetLcdDisplayPos(1, 0);

    LcdSpi.LcdDisplayNumber(i ++);//字型数字(0~65535)

  }       

  return 0;

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2005-1-17 13:16:39 | 显示全部楼层
从现在起,正式开始做WINAVR C++菜鸟...

出0入0汤圆

发表于 2005-1-17 16:41:16 | 显示全部楼层
升级了?单片机开发中还没用过C++呢,跟hotpower好好学学。

现在WinAVR中,对于C++的模板支持吗?操作符重载怎么样?

出0入0汤圆

 楼主| 发表于 2005-1-17 18:39:41 | 显示全部楼层
继续重载,所有LCD显示函数都使用一个函数名LcdDisplay()



/*------------------------------------------------------------

    HS12232-9带汉字库的2行7位半汉字LCD模块WINAVR C++演示程序

HotPower@126.com                    2005.1.17

-------------------------------------------------------------*/



#include <inttypes.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/wdt.h>

#include <avr/ina90.h>

#include <avr/eeprom.h>

//#include <stdio.h>

#include <avr/delay.h>

#include <avr/io.h>

#include <avr/delay.h>

#include <string.h>

#include <stdlib.h>



#define  FREQ 8  //Meaga8L,8MHz



#define  SS   PB2//LCD片选(串行) 0:禁止 1:允许

#define  MOSI PB3//LCD输入串行数据(串行)

#define  SCK  PB5//LCD输入串行脉冲(串行)



class LcdSpiObj {

private:

  unsigned char LcdRow,LcdCol;

  void LcdSpiModeSetup(void);

public:

  LcdSpiObj(void);//LcdSpiObj的构造函数

  void LcdSpiSend(unsigned char);

  void LcdSpiDelayMs(unsigned int);

  void LcdInit(void);

  void LcdSendCommand(unsigned char);

  void LcdSendData(unsigned char);

  unsigned char SetLcdDisplayPos(unsigned char, unsigned char);

  void GetLcdDisplayPos(unsigned char &, unsigned char &);



  void LcdDisplay(unsigned char, unsigned char, const char *);

  void LcdDisplay(const char *);

  void LcdDisplay(char);

  void LcdDisplay(int);

};





LcdSpiObj::LcdSpiObj(void)

{

  LcdRow = 0;

  LcdCol = 0;

  LcdSpiModeSetup();

}



void LcdSpiObj::LcdSpiModeSetup(void)

{

/* 设置MOSI 和SCK 及SS 为输出,其他为输入 */

  DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS);

  PORTB = (1 << MOSI) | (1 << SCK) | (1 << SS);

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式0*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);//不支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式1*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << SPR0);//支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式2*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << SPR0);//不支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式3*/

  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPR0);//支持!!!

}



void LcdSpiObj::LcdSpiSend(unsigned char cData)

{

/* 启动数据传输 */

  SPDR = cData;

/* 等待传输结束 */

  while(!(SPSR & (1 << SPIF)));

}



void LcdSpiObj::LcdSpiDelayMs(unsigned int t)

{

unsigned int i;

  for(i = 0; i < t; i++)

    _delay_loop_2(250 * FREQ);

}





/*--------------------------------------------------------

    发送8位LCD控制命令

--------------------------------------------------------*/

void LcdSpiObj::LcdSendCommand(unsigned char cCommand)

{

/*--------------------------------------------------------

    发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)

--------------------------------------------------------*/

  PORTB |= (1 << SS);//SS=1,启动SPI

  LcdSpiSend(0xf8);//发送LCD控制命令

  LcdSpiSend(cCommand & 0xf0);//发送高4位LCD控制命令

  LcdSpiSend(cCommand << 4);//发送低4位LCD控制命令

  PORTB &= ~(1 << SS);//SS=0,关闭SPI

  if (cCommand == 0x01) _delay_loop_2(1600 * FREQ);//1.6mS

  else _delay_loop_2(72 * FREQ);//st7920要求等待72uS

}



/*--------------------------------------------------------

    发送8位LCD显示数据

--------------------------------------------------------*/

void LcdSpiObj::LcdSendData(unsigned char cData)

{

/*--------------------------------------------------------

    发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)

--------------------------------------------------------*/

  PORTB |= (1 << SS);//SS=1,启动SPI

  LcdSpiSend(0xfa);//发送LCD显示数据

  LcdSpiSend(cData & 0xf0);//发送高4位LCD显示数据

  LcdSpiSend(cData << 4);//发送低4位LCD显示数据

  PORTB &= ~(1 << SS);//SS=0,关闭SPI

  _delay_loop_2(72 * FREQ);//st7920要求等待延时72uS

}





/*---------------------------------------------------

    LCD初始化设置

----------------------------------------------------*/

void LcdSpiObj::LcdInit(void)

{

/*---------------------------------------------------

    LCD模块上电等待延时

----------------------------------------------------*/

  LcdSpiDelayMs(1000);//上电等待延时1000Ms

  LcdSpiModeSetup();//SPI初始化

  LcdSendCommand(0b00100000);//发送4位控制命令

//  LcdSendCommand(0b00110000);//发送8位控制命令//与8位4位无关!!!

  LcdSendCommand(0b00000010);//发送位址归位命令,设定DDRAM位址计数器为0

  LcdSendCommand(0b00000100);//发送进入点命令

  LcdSendCommand(0b00001100);//发送开显示关光标命令

  LcdSendCommand(0b00000001);//发送清除显示命令

  LcdSendCommand(0b10000000);//发送设定DDRAM地址0x00命令

}



unsigned char LcdSpiObj::SetLcdDisplayPos(unsigned char row, unsigned char col)

{

  row --;

  col --;

  if ((row < 2) && (col < 8)) {//汉字字符为2行7.5列(汉字必须偶数对齐)

    LcdSendCommand(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令

        LcdRow = row;

        LcdCol = col << 1;

        return 1;

  }

  else

    return 0;

}



void LcdSpiObj::GetLcdDisplayPos(unsigned char &row, unsigned char &col)

{

  row = LcdRow + 1;

  col = LcdCol + 1;

}





void LcdSpiObj::LcdDisplay(unsigned char row, unsigned char col, const char * string)

{

  if (SetLcdDisplayPos(row, col)) LcdDisplay(string);

}





void LcdSpiObj::LcdDisplay(const char * string)

{

  while(*string) {

    LcdSendData(*string ++);

        LcdCol ++;

  }

}



void LcdSpiObj::LcdDisplay(char Val)

{

char str[4];

  itoa((int)Val, (char *)str, 10);

  LcdDisplay((char *)str);

}



void LcdSpiObj::LcdDisplay(int Val)

{

char str[6];

  itoa(Val, (char *)str, 10);

  LcdDisplay((char *)str);

}



/*----------------------------------------------------------

  申请全局类对象LcdSpi.它封装了HS12232-9 LCD模块的基本函数组合

----------------------------------------------------------*/

LcdSpiObj LcdSpi;





//main程序

int main(void)

{

int i = 0;

unsigned char row, col;

  LcdSpi.LcdInit();//LCD初始化

  LcdSpi.SetLcdDisplayPos(1, 2);//定位到第1行第2个汉字列上

  LcdSpi.LcdDisplay("汉字显示演示");//在当前位置显示汉字串

// sei();

  for(;;) {//死循环

/*--------------------------------------------------------------------

    C++函数重载演示,注意,所有LCD显示函数都使用一个函数名LcdDisplay()

--------------------------------------------------------------------*/

    LcdSpi.LcdSpiDelayMs(1000);//上电等待延时1000Ms

    LcdSpi.SetLcdDisplayPos(2,1);//定位到第2行第1个汉字列上

    LcdSpi.LcdDisplay("123456789ABCDEF");//必须换行

    LcdSpi.LcdDisplay(2, 5, "演示");//在第2行第5个汉字列处显示"演示"

    LcdSpi.GetLcdDisplayPos(row, col);//函数同时返回2个值row和col.

    LcdSpi.SetLcdDisplayPos(2, 7);//定位到第2行第7个汉字列上

    LcdSpi.LcdDisplay(row);//第2行第7个汉字列处左端显示row(1~2)

    LcdSpi.LcdDisplay(col);//第2行第7个汉字列处右端显示col(1~15)

    LcdSpi.SetLcdDisplayPos(2, 1);//定位到第2行第1个汉字列上

    LcdSpi.LcdDisplay(++ i);//显示循环次数

  }       

  return 0;//正常返回操作系统(实际不可能,MCU一般也不需要)

}

出0入0汤圆

 楼主| 发表于 2005-1-17 22:50:15 | 显示全部楼层
适当声明为内联函数可以优化,但有些反而增大代码程度.

比较郁闷...





楼上.text=1004   .data=34

本例.text= 744   .data=34







inline LcdSpiObj::LcdSpiObj(void)

{

  LcdRow = 0;

  LcdCol = 0;

  LcdSpiModeSetup();

}



inline void LcdSpiObj::LcdSpiModeSetup(void)

{

/* 设置MOSI 和SCK 及SS 为输出,其他为输入 */

  DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS);

  PORTB = (1 << MOSI) | (1 << SCK) | (1 << SS);

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式0*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);//不支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式1*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << SPR0);//支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式2*/

//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << SPR0);//不支持!!!

/* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式3*/

  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPR0);//支持!!!

}



inline void LcdSpiObj::LcdSpiSend(unsigned char cData)

{

/* 启动数据传输 */

  SPDR = cData;

/* 等待传输结束 */

  while(!(SPSR & (1 << SPIF)));

}



inline void LcdSpiObj::LcdSpiDelayMs(unsigned int t)

{

unsigned int i;

  for(i = 0; i < t; i++)

    _delay_loop_2(250 * FREQ);

}





/*--------------------------------------------------------

    发送8位LCD控制命令

--------------------------------------------------------*/

void LcdSpiObj::LcdSendCommand(unsigned char cCommand))//内联反而增大代码长度

{

/*--------------------------------------------------------

    发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)

--------------------------------------------------------*/

  PORTB |= (1 << SS);//SS=1,启动SPI

  LcdSpiSend(0xf8);//发送LCD控制命令

  LcdSpiSend(cCommand & 0xf0);//发送高4位LCD控制命令

  LcdSpiSend(cCommand << 4);//发送低4位LCD控制命令

  PORTB &= ~(1 << SS);//SS=0,关闭SPI

  if (cCommand == 0x01) _delay_loop_2(1600 * FREQ);//1.6mS

  else _delay_loop_2(72 * FREQ);//st7920要求等待72uS

}



/*--------------------------------------------------------

    发送8位LCD显示数据

--------------------------------------------------------*/

inline void LcdSpiObj::LcdSendData(unsigned char cData)

{

/*--------------------------------------------------------

    发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)

--------------------------------------------------------*/

  PORTB |= (1 << SS);//SS=1,启动SPI

  LcdSpiSend(0xfa);//发送LCD显示数据

  LcdSpiSend(cData & 0xf0);//发送高4位LCD显示数据

  LcdSpiSend(cData << 4);//发送低4位LCD显示数据

  PORTB &= ~(1 << SS);//SS=0,关闭SPI

  _delay_loop_2(72 * FREQ);//st7920要求等待延时72uS

}





/*---------------------------------------------------

    LCD初始化设置

----------------------------------------------------*/

inline void LcdSpiObj::LcdInit(void)

{

/*---------------------------------------------------

    LCD模块上电等待延时

----------------------------------------------------*/

  LcdSpiDelayMs(1000);//上电等待延时1000Ms

  LcdSpiModeSetup();//SPI初始化

  LcdSendCommand(0b00100000);//发送4位控制命令

//  LcdSendCommand(0b00110000);//发送8位控制命令//与8位4位无关!!!

  LcdSendCommand(0b00000010);//发送位址归位命令,设定DDRAM位址计数器为0

  LcdSendCommand(0b00000100);//发送进入点命令

  LcdSendCommand(0b00001100);//发送开显示关光标命令

  LcdSendCommand(0b00000001);//发送清除显示命令

  LcdSendCommand(0b10000000);//发送设定DDRAM地址0x00命令

}



inline unsigned char LcdSpiObj::SetLcdDisplayPos(unsigned char row, unsigned char col)

{

  row --;

  col --;

  if ((row < 2) && (col < 8)) {//汉字字符为2行7.5列(汉字必须偶数对齐)

    LcdSendCommand(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令

        LcdRow = row;

        LcdCol = col << 1;

        return 1;

  }

  else

    return 0;

}



inline void LcdSpiObj::GetLcdDisplayPos(unsigned char &row, unsigned char &col)

{

  row = LcdRow + 1;

  col = LcdCol + 1;

}





inline void LcdSpiObj::LcdDisplay(unsigned char row, unsigned char col, const char * string)

{

  if (SetLcdDisplayPos(row, col)) LcdDisplay(string);

}





void LcdSpiObj::LcdDisplay(const char * string)//内联反而增大代码长度

{

  while(*string) {

    LcdSendData(*string ++);

        LcdCol ++;

  }

}



inline void LcdSpiObj::LcdDisplay(char Val)

{

char str[4];

  itoa((int)Val, (char *)str, 10);

  LcdDisplay((char *)str);

}



inline void LcdSpiObj::LcdDisplay(int Val)

{

char str[6];

  itoa(Val, (char *)str, 10);

  LcdDisplay((char *)str);

}

出0入0汤圆

发表于 2005-1-17 23:51:09 | 显示全部楼层
比较关心的是函数重载后,究竟它的汇编代码是如何设计的,会不会比用分开的多个函数来写低效很多呢?

对于单片机,大家还是比较注重运行效率的。

出0入0汤圆

 楼主| 发表于 2005-1-17 23:59:19 | 显示全部楼层
哈哈...



C++的"函数重载"不过是骗"C人"的,它实际还是C中原来的多个函数,只是书写方便罢了...



C++根据函数入口参数的不同来调用"原来的多个不同函数"...



所以,"C人"不必忧伤...
头像被屏蔽

出0入0汤圆

发表于 2005-1-18 02:02:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2005-1-18 07:37:01 | 显示全部楼层
哈哈...这是一个完整的LCD演示程序...不少半行语句...



我自动放弃WINAVR菜鸟的资格而直接插队做WINAVR C++菜鸟主要是想减少编程错误及放弃软件调试...(硬件就更不指望了)

出0入0汤圆

 楼主| 发表于 2005-1-18 22:00:23 | 显示全部楼层
感觉GCCAVR由于受MCU的限制,故只实现了一部分,但对于在MCU上使用C++语法编程,确实已经够满足了...



我觉得最为实用的而且也是GCCAVR实现的:



1.类

  当然这是废话了,无类那叫C++呀.虽不能动态new,delete也罢...(MCU程序区很难也不该实现之,否则如同病毒一般...)

2.引用

  可以暂时摆脱讨厌的指针*.尤其是非要记清入口是变量还是指针而带来的烦恼.

  本需要2步的现在可以一步到位,如:

  int a = 1234;                int a = 1234;

  int *b;                      int& b = a;

  b=&a;

3.函数重载

  可以减少同功能不同参数类型函数的定义个数.

4.构造函数

  让人自动养成初始化的好习惯...当然析构函数在MCU中确实有些多余,但未来程序区都用

  铁电来做的话就另当别论了,不过GCC现在已支持析构函数,虽然现在是梁山泊英雄--无用...

5.内联函数

  非常小的函数适当用内联确实会减少代码的生成长度和提高速度,但有些就相反了...

6.比C更加强类型转换

  这个比C好些,往往被C漏过网的在C++中是逃不掉的...



总之,C++肯定比C好...



这就是我准备当AVR菜鸟时在编译器"选型"选中GCCAVR的最大原因吧...

我不会满足C的束缚...用C++才是我之目的...否则玩AVR为那家???


-----此内容被hotpower于2005-01-18,22:03:42编辑过

出0入0汤圆

 楼主| 发表于 2005-1-20 07:34:46 | 显示全部楼层
HS12232-9并非遵守完整的SPI协议,片选先CS(SS)可以直接接高电平,这样实际只需2线(时钟SCK和数据MOSI).



串行接法的缺点是不能读出LCD信息,不过也不是最重要的,重要的是连线最少才是真...
头像被屏蔽

出0入0汤圆

发表于 2005-1-20 09:52:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2005-1-22 10:37:19 | 显示全部楼层
哈哈...没时间"绣花"...

出0入0汤圆

发表于 2005-2-1 15:44:19 | 显示全部楼层
求助hotpower,我试了一下,编译没有通过。我想大概是makefile没有设置好。hotpower能否指点一下如何设置WINAVR C++。

谢谢!

出0入0汤圆

 楼主| 发表于 2005-2-1 23:44:02 | 显示全部楼层
只需将makefile文件的CC = avr-gcc改为CC = avr-g++即可,就这样简单



# Define programs and commands.

SHELL = sh

CC = avr-g++

OBJCOPY = avr-objcopy

OBJDUMP = avr-objdump

SIZE = avr-size

NM = avr-nm

AVRDUDE = avrdude

REMOVE = rm -f

COPY = cp

出0入0汤圆

发表于 2005-2-2 00:35:10 | 显示全部楼层
非常感谢hotpower,编译通过。争取也做个WINAVR C++菜鸟!

出0入0汤圆

 楼主| 发表于 2005-2-2 00:39:55 | 显示全部楼层
我在网上从不给出假冒的源程序...



祝您加入“WINAVR C++菜鸟俱乐部”!!!

出0入0汤圆

 楼主| 发表于 2005-2-2 00:45:35 | 显示全部楼层
12232-9/12864通用程序



12232-9/12864通用程序



我最近在21IC也灌了不少的C++水

出0入0汤圆

发表于 2005-2-2 08:22:05 | 显示全部楼层
求助:如果把class LcdSpiObj {....}整理成

独立的LcdSpiObj.h以及LcdSpiObj.c两个文件,似乎加上inline就会出错,只能所有的代码放在一个文件时才可正常编译。不知该如何解决。

请hotpower大侠指点。

出0入0汤圆

 楼主| 发表于 2005-11-19 00:38:00 | 显示全部楼层
补充:



AVR Studio4.12调试gccavr的C++时,需用外部自己设置的makefile.



并再将 DEBUG = stabs

改为   DEBUG = dwarf-2



即可在AVR Studio4.12中调试gccavr的C++



今天正式鼓动阿莫站长鼓励C++...希望各位捧场...



出0入0汤圆

发表于 2005-11-19 11:05:48 | 显示全部楼层
ding

出0入0汤圆

发表于 2005-11-24 12:58:30 | 显示全部楼层
各位大哥:

    小弟调了很久12232f的程序(汇编),都没成功。那位大哥能提供一个参考,串口或并口都可以,谢谢了!!

出0入0汤圆

发表于 2005-12-17 20:12:31 | 显示全部楼层
我也学C++ 了!!!做个WINAVR C++菜鸟!!

出0入0汤圆

发表于 2005-12-17 21:28:38 | 显示全部楼层
不错 值得支持,高手真多啊

出0入0汤圆

发表于 2005-12-26 22:32:20 | 显示全部楼层
ding

早就想学c++玩AVR了

出0入0汤圆

发表于 2005-12-27 12:56:32 | 显示全部楼层
我可苦了,花了90元买个LCD但不知道引脚图和指令格式,我估计与其它型号的LCD指令格式不一样,有誰知道台湾伟同科技(WAYTON_MG1206HW-SGL)128*64 LCD的引脚定义? 就?告诉小弟一声,网上也找不到此款资料!

出0入0汤圆

发表于 2006-3-7 18:12:12 | 显示全部楼层
早就想学C++了!

出0入0汤圆

发表于 2006-3-7 19:22:19 | 显示全部楼层
cool!

出0入0汤圆

发表于 2006-5-3 00:05:47 | 显示全部楼层
感觉用自己修改后的Kamavr做IDE是最方便的,只需要在几个编译选项上打勾就可以了,不必制作makefile。自己修改后的Kamavr的方法是:用UE32读入kamavr.exe,然后另存为kamavr C++.exe,用搜索功能查找“gcc”的ascii字符串,将其改为“g++”,也可以使用替换功能来做这事,文件中大约存在4处“gcc”的ascii字符串,但只要修改了第一个就可以了,全部改掉也没发现什么问题,最后保存文件就可以拉。以后你就可以一劳永逸地向编译C那样编译C ++程序了。

出0入0汤圆

发表于 2007-11-16 23:08:56 | 显示全部楼层
参考了一下,继续挖掘功能!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-29 02:39

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

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