原来这样加入代码:lol
//***基于助学板采用PA口4条数据线实现对JHD802A的简单驱动***//
//作者:hzy41y
//最后更新日期2012年06月06日10:10
/* NUC120 JHD802A
NUC120 JHD802A
--------| |-----------|
| 4 | VDD|-------+5V
GPA7|-----------| DB7 |
GPA6|-----------| DB6 |
GPA5|-----------| DB5 |
GPA4|-----------| DB4 |
| | VSS|________0V
PC14|-----------| RS | |
PC15|-----------| R/W | |
PC6 |-----------| E | |
| | VEE|___|
--------| |-----------|
JHD802A接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14
VSS VCC VEE RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#define RS_Set DrvGPIO_SetBit(E_GPC,14)
#define RW_Set DrvGPIO_SetBit(E_GPC,15)
#define E_Set DrvGPIO_SetBit(E_GPC,6)
#define RS_Clr DrvGPIO_ClrBit(E_GPC,14)
#define RW_Clr DrvGPIO_ClrBit(E_GPC,15)
#define E_Clr DrvGPIO_ClrBit(E_GPC,6)
#define LED_Clr DrvGPIO_ClrBit(E_GPA,2)
#define LED_Set DrvGPIO_SetBit(E_GPA,2)
void GPIO_Configuration(void)
{ DrvGPIO_Open( E_GPC, 6, E_IO_QUASI ); //标准数字双向口
DrvGPIO_Open( E_GPC, 14, E_IO_QUASI );
DrvGPIO_Open( E_GPC, 15, E_IO_QUASI );
DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 4, E_IO_QUASI );
DrvGPIO_Open( E_GPA, 5, E_IO_QUASI );
DrvGPIO_Open( E_GPA, 6, E_IO_QUASI );
DrvGPIO_Open( E_GPA, 7, E_IO_QUASI );
}
//*****************延时子函数(12MHZ,1MS)********************//
void delay_ms(uint32_t count)
{ uint32_t i,j;
for(i=count;i>0;i--)
for(j=2395;j>0;j--);
}
//******************读802忙标志位BF*************************//
uint8_t read802()
{ uint8_t i;
RS_Clr; RW_Set; E_Set;
delay_ms(1);
i=DrvGPIO_GetBit(E_GPA,7); //第一次读出的是LCD的高四位数据
E_Clr; // E=0;
return i;
}
//**************写指令到802A指令寄存器IR*******************//
void WriteIR802(uint8_t i){
while(read802());//读802忙标志位BF
RW_Clr; RS_Clr; E_Clr;
DrvGPIO_SetPortBits(E_GPA, i); // 第一次写入LCD的高四位数据
E_Set;
delay_ms(1);
E_Clr;
DrvGPIO_SetPortBits(E_GPA, i<<4); //第二次写入LCD的低四位数据
E_Set;
delay_ms(1);
E_Clr;
}
//****************写1字节数据到--DR**********************//
void WriteDR(uint8_t x){
while(read802());//读802忙标志位BF
RS_Set; RW_Clr; E_Clr;
GPIOA->DOUT =x; //第一次写入LCD的高四位数据
E_Set;
delay_ms(1);
E_Clr;
GPIOA->DOUT =x<<4; //第二次写入LCD的低四位数据
E_Set;
delay_ms(1);
E_Clr;
}
//*******************初始化802A*************************//
void init802(void){
WriteIR802(0x28);//写指令:功能设置4位数据总线;显示2行;字符点阵字体5*8.
WriteIR802(0x01); //写指令:清除屏幕
WriteIR802(0x06); //写指令:输入方式设置AC自动加1.
WriteIR802(0x0c); //写指令:开显示
}
int main (void)
{ UNLOCKREG(); // 芯片注册解锁
SYSCLK->PWRCON.XTL12M_EN = 1; // 设定12M外部晶振
DrvSYS_Delay(5000); // 等待时钟就绪
GPIO_Configuration();
init802();
WriteIR802(0x80); //设定写入第一行0x00地址 地址只有7位,最高位为特殊位
WriteDR('U');
WriteDR('N');
WriteDR('C');
WriteDR('1');
WriteDR('2');
WriteDR('0');
WriteDR('_');
WriteIR802(0xc0); //设定写入第二行0x43地址 地址只有7位,最高位为特殊位
WriteDR('J');
WriteDR('H');
WriteDR('D');
WriteDR('8');
WriteDR('0');
WriteDR('2');
WriteDR('A');
while(1);
}
|