音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

我是新手,現(xiàn)在想用AVR驅(qū)動液晶,咋就不行呢?

作者:xsq 欄目:單片機(jī)
我是新手,現(xiàn)在想用AVR驅(qū)動液晶,咋就不行呢?

12864液晶(控制器為ST7920),用M16驅(qū)動,winavr?qū)懗绦,串口方式,按照說明書上的時(shí)序?qū)懥艘恍《纬绦颍鋵?shí)就是想讓它在左上角顯示一個海字,咋也調(diào)不通,請各位幫幫我:
#include"avr/io.h"
#include"avr/eeprom.h"
#include"avr/wdt.h"
#include"avr/delay.h"
#define uint unsigned int
#define uCHAR unsigned CHAR
void wrd(uCHAR a,uCHAR dat)
{uCHAR i,j;
PORTA&=0xfe;
PORTA|=0x01;//CS置高,準(zhǔn)備接收數(shù)據(jù)或指令
for(i=0;i<5;i++)
    {PORTA|=0x02;//SID置高
     PORTA&=0xfb;//拉低SCLK
     PORTA|=0x04;//置高SCLK
     PORTA|=0x04;//置高SCLK
     PORTA&=0xfb;//拉低SCLK
    }//輸出5個連續(xù)的高脈沖
if(a==0) j=0x0;
  else    j=0x40;//如果是數(shù)據(jù)就按數(shù)據(jù)寫,如果是指令,就按指令寫
for(i=0;i<3;i++)
    {if((j&0x80)==0) PORTA&=0xfd;
       else          PORTA|=0x02;
     PORTA&=0xfb;//拉低SCLK
     PORTA|=0x04;//置高SCLK
     PORTA|=0x04;//置高SCLK
     PORTA&=0xfb;//拉低SCLK
     j<<1;
    }//如是寫指令,輸出三個連續(xù)的0,如是寫數(shù)據(jù),輸出010
j=dat;
j&=0xf0;
for(i=0;i<8;i++)
    {if((j&0x80)==0) PORTA&=0xfd;
       else          PORTA|=0x02;
     PORTA&=0xfb;//拉低SCLK
     PORTA|=0x04;//置高SCLK
     PORTA|=0x04;//置高SCLK
     PORTA&=0xfb;//拉低SCLK
     j<<1;
    }//寫高四位
j=dat<<4;
for(i=0;i<8;i++)
    {if((j&0x80)==0) PORTA&=0xfd;
       else          PORTA|=0x02;
     PORTA&=0xfb;//拉低SCLK
     PORTA|=0x04;//置高SCLK
     PORTA|=0x04;//置高SCLK
     PORTA&=0xfb;//拉低SCLK
     j<<1;
    }//寫低四位
}//寫入一個字節(jié)數(shù)據(jù)或命令                      
void main()
{
DDRB=DDRC=DDRD=0x0;
PORTB=PORTC=PORTD=0xff;
DDRA=0xe0;
PORTA=0x1f;
_delay_ms(60);
wrd(0,0x30); _delay_ms(1);
wrd(0,0x30); _delay_ms(1);
wrd(0,0x0c); _delay_ms(1);
wrd(0,0x01);_delay_ms(1);
wrd(0,0x04);_delay_ms(1);
wrd(0,0x80);
wrd(1,0xba);
wrd(1,0xa3);//寫入“!
}

2樓: >>參與討論
wudianjun
我用過,很好、的啊
 
3樓: >>參與討論
hotpower
HS12232-9帶漢字庫的2行7位半漢字LCD模塊WINAVR C++演示程序
12864和12232控制幾乎相同!!!

前者為4行8個漢字,后者為2行7位半漢字.

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=359142&bbs_page_no=1&bbs_id=1000

4樓: >>參與討論
xsq
我初學(xué),連GCC都弄不懂,還C++呢,還是來點(diǎn)實(shí)惠的吧
各位老兄,還是把GCC程序貼出來吧,先謝了

5樓: >>參與討論
hotpower
暈~~~思路與語言無關(guān)
 
6樓: >>參與討論
computer00
細(xì)節(jié)問題就會跟語言有關(guān)拉。。。
有時(shí),換語言時(shí),不得不換思路………………

7樓: >>參與討論
hotpower
哈哈,他的順序編程思路你贊賞???
 
8樓: >>參與討論
computer00
不,我沒看前面,只是針對你那一句來的^_^
hotpower 發(fā)表于 2005-11-18 00:15 AVR 單片機(jī) ←返回版面    

暈~~~思路與語言無關(guān)



9樓: >>參與討論
hotpower
我們這里叫"水盆大肉"---好吃
 
10樓: >>參與討論
xsq
我來這兒就是想得到幫助的,各位老大誰能幫我一下?
水平太差,本來登不得大雅之堂的,讓大家見笑了,可我就是想來這兒學(xué)習(xí)的,不想?yún)s讓各位老大傷了和氣,我這兒給諸位賠罪了,諸位前輩,有人肯真心實(shí)意的幫幫我嗎?多謝了。

11樓: >>參與討論
computer00
去看看hotpower給你介紹的那個吧,估計(jì)能看懂。然后自己改改
 
12樓: >>參與討論
javie
發(fā)燒了,37.8
看不懂

13樓: >>參與討論
hotpower
發(fā)燒了,暈
看不懂---眼燒紅了...

14樓: >>參與討論
xsq
已經(jīng)通過,你的程序真好,多謝了。
真高手也

15樓: >>參與討論
hotpower
哈哈,仔細(xì)搜就行了---12232-9/12864通用程序
這里有一個純C的程序(http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=208482&bbs_page_no=1&bbs_id=1000)

/*------------------------------------------------------------
    HS12232-9帶漢字庫的2行7位半漢字LCD模塊WINAVR演示程序
HotPower@126.com                    2005.1.15
-------------------------------------------------------------*/

#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>


#define  FREQ 8  //Meaga8L,8MHZ
#define  CS   PB2//LCD片選(串行) 0:禁止 1:允許
#define  SID  PB3//LCD輸入串行數(shù)據(jù)(串行)
#define  CLK  PB5//LCD輸入串行脈沖(串行)

#define  SS   PB2//LCD片選(串行) 0:禁止 1:允許
#define  MOSI PB3//LCD輸入串行數(shù)據(jù)(串行)
#define  SCK  PB5//LCD輸入串行脈沖(串行)

void PortIoInit(void)
{
  DDRB  = 0;//設(shè)置B口全為輸入
  DDRC  = 0;//設(shè)置C口全為輸入
  DDRD  = 0;//設(shè)置D口全為輸入
  PORTB = 0xff;//設(shè)置B口全部上拉
  PORTC = 0xff;//設(shè)置C口全部上拉
  PORTD = 0xff;//設(shè)置D口全部上拉
}

void SPI_MasterInit(void)
{
/* 設(shè)置MOSI 和SCK 及SS 為輸出,其他為輸入 */
  DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS);
  PORTB = (1 << MOSI) | (1 << SCK) | (1 << SS);
//  PORTB = 0xff;
/* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式0*/
//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);//不支持!!!
/* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式1*/
//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << SPR0);//支持!!!
/* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式2*/
//  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << SPR0);//不支持!!!
/* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式3*/
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPR0);//支持!!!
}

void SPI_MasterTransmit(unsigned CHAR cData)
{
/* 啟動數(shù)據(jù)傳輸 */
  SPDR = cData;
/* 等待傳輸結(jié)束 */
  while(!(SPSR & (1 << SPIF)));
}

void DelayMs(unsigned int t)
{
unsigned int i;
  for(i = 0; i < t; i++)
    _delay_loop_2(250 * FREQ);
}

/*--------------------------------------------------------
    發(fā)送8位LCD控制命令
--------------------------------------------------------*/
void LcdSendCommand(unsigned CHAR cCommand)
{
/*--------------------------------------------------------
    發(fā)送同步脈沖11111 WR(0) RS(0) 0發(fā)送順序從左至右)
--------------------------------------------------------*/
  PORTB |= (1 << SS);//SS=1,啟動SPI
  SPI_MasterTransmit(0xf8);//發(fā)送LCD控制命令
  SPI_MasterTransmit(cCommand & 0xf0);//發(fā)送高4位LCD控制命令
  SPI_MasterTransmit(cCommand << 4);//發(fā)送低4位LCD控制命令
  PORTB &= ~(1 << SS);//SS=0,關(guān)閉SPI
  if (cCommand == 0x01) _delay_loop_2(1600 * FREQ);//1.6mS
  else _delay_loop_2(72 * FREQ);//ST7920要求等待72uS
}

/*--------------------------------------------------------
    發(fā)送8位LCD顯示數(shù)據(jù)
--------------------------------------------------------*/
void LcdSendData(unsigned CHAR cData)
{
/*--------------------------------------------------------
    發(fā)送同步脈沖11111 WR(0) RS(0) 0發(fā)送順序從左至右)
--------------------------------------------------------*/
  PORTB |= (1 << SS);//SS=1,啟動SPI
  SPI_MasterTransmit(0xfa);//發(fā)送LCD顯示數(shù)據(jù)
  SPI_MasterTransmit(cData & 0xf0);//發(fā)送高4位LCD顯示數(shù)據(jù)
  SPI_MasterTransmit(cData << 4);//發(fā)送低4位LCD顯示數(shù)據(jù)
  PORTB &= ~(1 << SS);//SS=0,關(guān)閉SPI
  _delay_loop_2(72 * FREQ);//ST7920要求等待延時(shí)72uS
}


/*---------------------------------------------------
    LCD初始化設(shè)置
----------------------------------------------------*/
void LcdInit(void)
{
/*---------------------------------------------------
    LCD模塊上電等待延時(shí)
----------------------------------------------------*/
  DelayMs(1000);//上電等待延時(shí)1000Ms
  SPI_MasterInit();//SPI初始化
  LcdSendCommand(0b00100000);//發(fā)送4位控制命令
//  LcdSendCommand(0b00110000);//發(fā)送8位控制命令//與8位4位無關(guān)!!!
  LcdSendCommand(0b00000010);//發(fā)送位址歸位命令,設(shè)定DDRAM位址計(jì)數(shù)器為0
  LcdSendCommand(0b00000100);//發(fā)送進(jìn)入點(diǎn)命令
  LcdSendCommand(0b00001100);//發(fā)送開顯示關(guān)光標(biāo)命令
  LcdSendCommand(0b00000001);//發(fā)送清除顯示命令
  LcdSendCommand(0b10000000);//發(fā)送設(shè)定DDRAM地址0x00命令
}

unsigned CHAR SetLCDDISPLAYPos(unsigned CHAR row, unsigned CHAR col)
{
  if ((row < 2) && (col < 8))//漢字字符為2行7.5列(漢字必須偶數(shù)對齊)
  {
    LcdSendCommand(0x80 + row * 16 + col);//發(fā)送設(shè)定DDRAM地址row * 16 + col命令
    return 1;//成功返回
  }
  else  
    return 0;//失敗返回
}


void LCDDISPLAY(unsigned CHAR row, unsigned CHAR col, unsigned CHAR * string)
{
  if (SetLCDDISPLAYPos(row, col))
  {
    LcdSendData(*string);
  }
}


void LCDDISPLAYString(unsigned CHAR * string)
{
  while(*string) LcdSendData(*string ++);
}


//main程序
void main(void)
{
unsigned CHAR i = 0;
  PortIoInit();
  LcdInit();
// sei();
  for(;;)
  {
    DelayMs(1000);//上電等待延時(shí)1000Ms
    if ((i ++ & 0x01) == 0) LcdSendCommand(0b00000001);//發(fā)送清除顯示命令
    else  
    {
      SetLCDDISPLAYPos(0, 1);//漢字定位到上行左端
      LCDDISPLAYString("漢字顯示演示");
      SetLCDDISPLAYPos(1,0);//字符定位到下行左端
      LCDDISPLAYString("123456789ABCDEF");//必須換行
      SetLCDDISPLAYPos(1,3);//字符定位到下行左端
      LCDDISPLAYString("漢字");
    }
    DelayMs(1000);//上電等待延時(shí)1000Ms
    DelayMs(1000);//上電等待延時(shí)1000Ms
    DelayMs(1000);//上電等待延時(shí)1000Ms
    DelayMs(1000);//上電等待延時(shí)1000Ms
  }    
}



* - 本貼最后修改時(shí)間:2005-11-19 0:53:31 修改者:hotpower

http://b

16樓: >>參與討論
xsq
前輩,還有一事不明啊
您的程序如何顯示一個變量。
這樣好像不行呢,滿屏的亂碼:
unsigned CHAR p[]="鳥";
SetLcdDisplayPos(0, 0);
LcdDisplayString(*p);
而不寫漢字,寫一個數(shù)字的話,什么也不顯:
而這樣寫,別管是漢字還是數(shù)字,一切OK
SetLcdDisplayPos(0, 0);
LcdDisplayString("鳥");
我是剛學(xué),什么也不懂,讓您見笑了,請前輩指點(diǎn)迷經(jīng)啊!

* - 本貼最后修改時(shí)間:2005-11-19 8:19:34 修改者:xsq

17樓: >>參與討論
xsq
已經(jīng)解決,謝謝
把這句
LcdDisplayString(*p);
該為
LcdDisplayString(&p);
即可,謝謝您了。

18樓: >>參與討論
xsq
期待你的圖形驅(qū)動
您的漢字發(fā)送函數(shù)真是太簡潔了,
void LcdDisplayString(unsigned CHAR * string)
{
  while(*string) LcdSendData(*string ++);
}
簡潔的讓人難以置信,難道AVR知道這款LCD的編碼方法嗎?請大師指點(diǎn)一二,另外,再請問一下,你有該LCD的圖形C源程序嗎?不好意思,我想要。

19樓: >>參與討論
hotpower
注意指針和變量的不同
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
一塊做工暴臭的小PCB
請問ATMEGA128仿真器輸出頭的定義和引腳的對應(yīng)關(guān)系
如何拯救熔絲位配置錯了的AVR芯片?
請問用ATMEGA128仿真器怎么樣仿ATMEGA8的芯片
有誰用過AVR的USI兩線模式通訊(I2C)
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號