He estado tratando de inicializar mi LCD durante aproximadamente una semana, y me da mucha pena decir que no he tenido éxito hasta ahora. He hecho esto en el pasado, y recuerdo que fue un poco difícil obtener la secuencia de inicialización de la manera correcta, pero en este punto creo que ya veté completamente la implementación y simplemente no está funcionando.
Configuración:
- LCD NHT-C0220AZ-FSW-FTW con un controlador NT7605
- TI Launchpad w / MSP430G2231
- bote de 10k de un solo turno para el control de contraste
- LCD alimentado con 3.3V
- Launchpad alimentado con USB
- Motivos para cada componente unidos
- utilizando la interfaz de 4 bits de la pantalla LCD
- retroiluminación de LCD conectada a Vcc (3.3V) desde Launchpad
Aquíhaycosasquehehechohastaahoraparalaspruebas:
- Conexionesdoblesverificadas
- pinesLCDD4-D7,RS,R/WyE
- Elpotenciómetroestáconectadoalpindecontroldecontraste,yheverificadoquelatensiónvade0aVdd.
- LCDVddconectadoa3.4V,queestáaaproximadamentelaespecificacióndevoltajemínimo
- RutinasdeE/SdedoblecomprobaciónenMSP430
- LospinesdelapantallaLCDserestablecen/configurancomoseesperaamedidaquepasopormicódigo
- Lasrutinasdetiempoestánsemi"calibradas"
for
loops
- Documentación cruzada para las rutinas de inicialización contra las rutinas de otros que he encontrado en línea
-
1.
Sin embargo, después de todo esto, ¡no puedo ver nada en la pantalla LCD! Así que aquí están mis preguntas:
- El fabricante ha verificado que hay un error en el NT7605 donde el bit de ocupado no se valida correctamente. Así que he estado usando retrasos fijos (bien conmigo), pero quería usar el indicador de ocupado para ver si el controlador está respondiendo a los comandos. ¿Hay alguna otra manera de hacer un diagnóstico de bajo nivel para ver qué piensa la pantalla LCD cuando envío comandos de inicialización?
- ¿Alguien más aquí ha usado el mismo LCD? Todas las demás pantallas LCD estándar que he usado (tipos de 2x20 caracteres) se oscurecen notablemente cuando enciendo el ajuste de contraste, e IIRC lo hacen incluso cuando no se inicializan correctamente. Sin embargo, cuando enciendo la olla en la mía, la pantalla LCD no se oscurece en absoluto. Quizás esto se deba a que no está inicializado, pero no estoy seguro.
- ¿Puede alguien encontrar algo raro con esta rutina de inicialización?
- retraso > 30ms
- enviar 0x20, solo mordisco superior
- enviar 0x28 (establecer interfaz de 4 bits)
- espera 10ms
- enviar 0x0C (pantalla activada, cursor apagado, parpadear apagado)
- espera 10ms
- enviar 0x01 (pantalla clara)
- espera 10ms
- enviar 0x02 (cursor de incremento, sin cambio de pantalla)
- espera 10ms
- establezca RS alto para comenzar a enviar datos de caracteres
- enviar 0x48 (mostrar 'H')
Micódigoseveasí:
voidInitializeLcd(){DelayTicks(10000);//4bitinterface,2lines,5x8characters//thespecsheetshowsthe0x20partof0x28gettingsentanextratime//soIusedaspecialfunctiontodealwiththiscase.Thisjustsends//the0x20partandignoresthe0x08part.SendLcdUpperNibble(COMMAND,0x28);SendLcdByte(COMMAND,0x28);DelayTicks(1000);//Displayon,cursoroff,blinkoffSendLcdByte(COMMAND,0x0C);DelayTicks(1000);//cleardisplayClearLcd();//Entrymodeset-incrementcursor,nodisplayshiftSendLcdByte(COMMAND,0x02);DelayTicks(1000);//SetwritetoDDRAMmodesincewe'lljustbesendingdatafromnowonSendLcdByte(DATA,0x48);SendLcdByte(DATA,0x65);SendLcdByte(DATA,0x6C);SendLcdByte(DATA,0x6C);SendLcdByte(DATA,0x6F);}voidClearLcd(){//CleardisplaySendLcdByte(COMMAND,0x01);DelayTicks(1000);}voidSetRS(intvalue){if(value==0)P2OUT&=~RS;elseP2OUT|=RS;}voidSetRW(intvalue){if(value==0)P2OUT&=~RW;elseP2OUT|=RW;}voidSetE(intvalue){if(value==0)P1OUT&=~E;elseP1OUT|=E;}voidDelayMs(intdelay){intctr;intms=delay*100;for(ctr=0;ctr<ms;ctr++);}voidDelayTicks(intticks){intctr;for(ctr=0;ctr<ticks;ctr++);}voidSendLcdByte(unsignedcharcommand_0_or_data_1,unsignedcharcommand){SendLcdUpperNibble(command_0_or_data_1,command);//sendthelowernibblenext//specialthankyoutoToyBuilderforcatchingmymissedbit-shiftinthefollowingline//IalsohadthemaskonP1OUTincorrect,presumablybecauseImessedupthecommandmaskandjustmadeitmatchthat.P1OUT=((command&0x0F)<<4)|(P1OUT&0x0F);Strobe(command_0_or_data_1);}voidSendLcdUpperNibble(unsignedcharcommand_0_or_data_1,unsignedcharupper_nibble){P1OUT=(upper_nibble&0xF0)|(P1OUT&0x0F);Strobe(command_0_or_data_1);}voidStrobe(unsignedcharcommand_0_or_data_1){SetRS(command_0_or_data_1);SetRW(0);DelayTicks(1000);SetE(1);DelayTicks(1000);SetE(0);}
LoúnicoquepuedodeciresquelapantallaLCDparecequeparpadeacuandopasoporencimadeSendLcdByteyleenvíodatosdecaracteres.Cuandoalcancetodo,seguroqueparecequeestoyvolteandobitscorrectamente...
EDITAR-HesoldadounanuevapantallaLCD,yestavezintentédejarlospinesdedatosnoutilizados(D0-D3)desconectados(esdecir,flotando).Nohabíadiferencia.LapantallaLCDtodavíaparpadeacuandoseinicializa.Ahoraestoyesperando100msparatodaslasdemoras,incluidaunademoracuandoseapagaelindicadorE.TambiéndesconectéelVccprovenientedelasecciónLaunchpadFETyahorasoloestoyalimentandoelMSP430ylaLCDdesdelafuentedealimentacióndemilaboratorio.
EDIT#2-FuiaunapantallaLCDde3.3Vytodocomenzóafuncionarmágicamente.GraciasaToyBuilderpordetectarunerrordecódigoestúpidocuandoestabahaciendounadepuraciónconelLCDde5V.DespuésdelintercambiolapantallaLCDseinicializócorrectamente.Actualmenteestoymostrandobasuraenlugarde"Hola", pero eso no está relacionado con esta pregunta.
EDIT # 3 - encontré mi error de visualización - estaba enviando 0x06 para el modo de entrada en lugar de 0x02. No estoy seguro de por qué hice eso, debe haber sido un error tipográfico.