|
|||||||||||
| 技術(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 |
求助: 請好心人幫忙看下HS12232-9漢字LCD的3線程序問題 |
| 作者:hotpower 欄目:單片機(jī) |
先給個(gè)我注解后商家提供的51匯編程序 ;This program is for 12232F,12864-12,12864M Serial TEST.html">TEST ; RS--------P3.0 ; R/W-------P3.1 ; E---------P3.2 ; DB0~7-----P1 CS EQU P3.0;片選(串行) 0:禁止 1:允許 SID EQU P3.1;輸入串行數(shù)據(jù)(串行) CLK EQU P3.2;輸入串行脈沖(串行) PSB EQU P3.3;控制界面 0:串行 1:并行8/4 位 ORG 0000H AJMP START ; ORG 0003H ; LCALL PAUSE ORG 0100h START: ; MOV IE,#81H ;EXT. INT0 PERMIT ; MOV IP,#01H ;INT0 IS FIRST INT. LEVEL ; MOV TCON,#00H ;TIMER/COUNTER CONTROLER INIT. MOV SP, #67H CLR PSB;選擇串行工作模式 LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL SETUP;LCD初始化設(shè)置 LCALL DEF_CHAR;自定義字符顯示 /*--------------------------------------------------- 顯示4行CGRAM1字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x00命令 /*--------------------------------------------------- 顯示第一行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST11: MOV DPTR,#CGRAM1 ;CGRAM TEST LCALL WRITE_CGRAM DJNZ R3,TEST11 MOV A,#90H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x10命令 /*--------------------------------------------------- 顯示第二行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST12: MOV DPTR,#CGRAM1 LCALL WRITE_CGRAM DJNZ R3,TEST12 MOV A,#88H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x08命令 /*--------------------------------------------------- 顯示第三行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST13: MOV DPTR,#CGRAM1 LCALL WRITE_CGRAM DJNZ R3,TEST13 MOV A,#98H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x18命令 /*--------------------------------------------------- 顯示第四行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST14: MOV DPTR,#CGRAM1 LCALL WRITE_CGRAM DJNZ R3,TEST14 /*--------------------------------------------------- CGRAM1字符顯示等待延時(shí)5秒 ----------------------------------------------------*/ LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS /*--------------------------------------------------- 顯示4行CGRAM2字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x00命令 /*--------------------------------------------------- 顯示第一行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST21: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST21 MOV A,#90H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x10命令 /*--------------------------------------------------- 顯示第二行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST22: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST22 MOV A,#88H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x08命令 /*--------------------------------------------------- 顯示第三行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST23: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST23 MOV A,#98H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x18命令 /*--------------------------------------------------- 顯示第四行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST24: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST24 /*--------------------------------------------------- CGRAM2字符顯示等待延時(shí) ----------------------------------------------------*/ LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS LCALL DELAY;延時(shí)150mS /*--------------------------------------------------- 顯示4行CGRAM3字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x00命令 /*--------------------------------------------------- 顯示第一行CGRAM3字符 ----------------------------------------------------*/ MOV R3,#8 TEST31: MOV DPTR,#CGRAM3 LCALL WRITE_CGRAM DJNZ R3,TEST31 MOV A,#90H LCALL WRITE_COM;發(fā)送設(shè)定DDRAM地址0x10命令 /*--------------------------------------------------- 顯示第二行CGRAM3字符 ----------------------------------------------------*/ MOV R3,#8 TEST32: < |
| 2樓: | >>參與討論 |
| 作者: hotpower 于 2005/1/10 0:18:00 發(fā)布:
再請幫忙看下我用WINAVR編寫的C程序毛病出在哪里??? 調(diào)了2個(gè)多小時(shí)都沒通...郁悶呀... #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 為輸出,其他為輸入 */ DDRB = (1 << MOSI) | (1 << SCK); 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))); /* for (unsigned CHAR i = 8; i > 0; i --) { if (cData & 0x80) PORTB |= (1 << MOSI); else PORTB &= ~(1 << MOSI); PORTB &= ~(1 << SCK); cData <<= 1; PORTB |= (1 << SCK); } */ } 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) { DelayMs(10);//等待延時(shí)10Ms // _delay_loop_2(72 * FREQ);//ST7920要求等待72uS /*-------------------------------------------------------- 發(fā)送同步脈沖11111 WR(0) RS(0) 0發(fā)送順序從左至右) --------------------------------------------------------*/ // PORTB &= ~(1 << SS);//SS=0,啟動SPI PORTB |= (1 << SS);//SS=1,關(guān)閉SPI SPI_MasterTransmit(0xf8);//發(fā)送LCD控制命令 SPI_MasterTransmit(cCommand & 0xf0);//發(fā)送高4位LCD控制命令 SPI_MasterTransmit(cCommand << 4);//發(fā)送低4位LCD控制命令 // PORTB |= (1 << SS);//SS=1,關(guān)閉SPI PORTB &= ~(1 << SS);//SS=0,啟動SPI } /*-------------------------------------------------------- 發(fā)送8位LCD顯示數(shù)據(jù) --------------------------------------------------------*/ void LcdSendData(unsigned CHAR cData) { DelayMs(10);//等待延時(shí)10Ms // _delay_loop_2(72 * FREQ);//ST7920要求等待延時(shí)72uS /*-------------------------------------------------------- 發(fā)送同步脈沖11111 WR(0) RS(0) 0發(fā)送順序從左至右) --------------------------------------------------------*/ // PORTB &= ~(1 << SS);//SS=0,啟動SPI PORTB |= (1 << SS);//SS=1,關(guān)閉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=1,關(guān)閉SPI PORTB &= ~(1 << SS);//SS=0,啟動SPI } /*--------------------------------------------------- LCD初始化設(shè)置 ----------------------------------------------------*/ void LcdInit(void) { /*--------------------------------------------------- LCD模塊上電等待延時(shí) ----------------------------------------------------*/ DelayMs(1000);//上電等待延時(shí)1000Ms SPI_MasterInit();//SPI初始化 // LcdSendCommand(0b00100000);//發(fā)送4位控制命令 LcdSendCommand(0b00110000);//發(fā)送8位控制命令 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 SetLcdDisplayCharPos(unsigned CHAR row, unsigned CHAR col) { if ((row < 2) && (col < 16))//英文字符為2行16列 { LcdSendCommand(0x80 + row * 16 + col);//發(fā)送設(shè)定DDRAM地址row * 16 + col命令 return 1; } else return 0; } void LcdDisplayChar(unsigned CHAR row, unsigned CHAR col, unsigned CHAR * string) { if (SetLcdDisplayCharPos(row, col)) { LcdSendData(*string); } } unsigned CHAR SetLcdDisplayChinsePos(unsigned CHAR row, unsigned CHAR col) { if ((row < 2) && (col < 8))//漢字字符為2行8列(偶數(shù)對齊) { LcdSendCommand(0x80 + row * 16 + col * 2);//發(fā)送設(shè)定DDRAM地址row * 16 + col * 2命令 return 1; } else return 0; } void LcdDisplayChinse(unsigned CHAR row, unsigned CHAR col, unsigned CHAR * string) { if (SetLcdDisplayChinsePos(row, col)) { LcdSendData(*string); LcdSendData(*(string + 1)); } } void LcdDisplayString(unsigned CHAR * string) { while(*string) LcdSendData(*string ++); } //main程序 void main(void) { PortIoInit(); LcdInit(); // sei(); for(;;) { DelayMs(1000);//上電等待延時(shí)1000Ms SetLcdDisplayChinsePos(0, 0);//漢字定位到上行左端 LcdDisplayString("漢字顯示演示程序"); SetLcdDisplayCharPos(1,0);//字符定位到下行左端 LcdDisplayString("0123456789ABCDEF"); DelayMs(1000);//上電等待延時(shí)1000Ms DelayMs(1000);//上電等待延時(shí)1000Ms DelayMs(1000);//上電等待延時(shí)1000Ms DelayMs(1000);//上電等待延時(shí)1000Ms } } |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |