/*---------------------------------------------------------------------------------------------------------*/
/* */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "NUC1xxM051Seriescfg.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#define LCD_POWER_ON DrvGPIO_ClrBit(E_GPE,5); //接LCD1602 VSSPin,需要强制输出0,做GND用
#define LCD_VO_Adj DrvGPIO_ClrBit(E_GPC,14); //对比度调节
char table1[]={"HOT250"};
uint8_t i;
/*************************************************************************************
** Function name: DelayMs
** Descriptions: 延时1ms子程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*************************************************************************************/
void DelayMs(uint32_t z)
{
uint32_t i,j;
for(i=z;i>0;i--)
for(j=2000;j>0;j--);
}
void delay_nus(unsigned int t)
{
unsigned int i=0;
while(t--)
{
for(i=0;i<1;i++);
}
}
void delay_nms(unsigned char n)
{
unsigned char i,j;
unsigned int k;
i=12; //主频多少i就多少
//延时用这个很无奈,不同的系统有不同的方法
//好在只有初始化时使用,对系统影响不大
for(;i>0;i--)
{
for(j=0;j<n;j++)
{
for(k=0;k<980;k++);
}
}
}
void Init_GPIO(void)
{
/* D0~D7----PA0-PA7 */
DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 5,E_IO_OUTPUT);
DrvGPIO_Open( E_GPA, 6, E_IO_OUTPUT);
DrvGPIO_Open( E_GPA, 7, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 8, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 9, E_IO_OUTPUT );
DrvGPIO_Open( E_GPC, 15, E_IO_OUTPUT); //RS
DrvGPIO_Open( E_GPC, 6, E_IO_OUTPUT); //RW
DrvGPIO_Open( E_GPC, 7, E_IO_OUTPUT ); //EN
}
void Init_System(void)
{
/* Unlock the locked registers before access */
UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
//这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->PWRCON.XTL12M_EN = 1;
/* Waiting for 12M Xtal stable */
//while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); //SYSCLK->CLKSTATUS.XTL12M_STB
/*eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL */
// Note: Only some of NuMicro NUC100 Series support this function.
DrvSYS_Delay(5000);
LOCKREG(x);
//向“0x5000_0100”写入任何值,就可以重锁保护寄存器
}
void write_com(uint8_t com)
{
//ChkBusy();
/*RS----PB2 写指令 拉低 */
DrvGPIO_ClrBit(E_GPC,15);
//GPIOA->DOUT |= (com << 2);
//DelayMs(1);
delay_nms(1);
DrvGPIO_SetPortBits(E_GPA,com<<2);
/* EN---PB3 */
DrvGPIO_SetBit(E_GPC,7);
// DelayMs(4);
delay_nms(1);
DrvGPIO_ClrBit(E_GPC,7);
//DelayMs(6);
}
void write_dat(uint8_t dat)
{
// ChkBusy();
/*RS----PB14 写指令 拉高 */
DrvGPIO_SetBit(E_GPC,15);
// DrvGPIO_ClrBit(E_GPB,13);
// delay_nus(2);
//DrvGPIO_SetPortBits(E_GPA,dat<<2);
//GPIOA->DOUT |= (dat<<2);
//DelayMs(1);
delay_nms(1);
GPIOAs.DOUT.Regs = (dat << 2);
/* EN---PB12 */
DrvGPIO_SetBit(E_GPC,7);
delay_nus(2);
//DelayMs(4);
DrvGPIO_ClrBit(E_GPC,7);
//DelayMs(5);
//DrvGPIO_ClrBit(E_GPB,14);
}
/*************************************************************************************
** Function name: Init_LCD
** Descriptions: LCD初始化程序
** input parameters: 无
** output parameters: 无
** 介绍 : RS----PB14
RW----PB13
EN----PB12
D0~D7----PA0-PA7
*************************************************************************************/
void Init_LCD(void)
{
/* 只写数据 所以RW拉低*/
DrvGPIO_ClrBit(E_GPC,6);
//DelayMs(1);
write_com(0x01);
write_com(0x38);
//DelayMs(5);
write_com(0x0f); //开显示,显示光标,光标闪烁
write_com(0x06);//当写一个字符后地址指针+1;且光标加1,当写一个字符整屏不移动
DelayMs(10);
}
/*************************************************************************************
** Function name: main
** Descriptions: LED2跟随LED1的亮灭而灭亮测试程序
** 现 象:下载代码,运行程序,则LED1亮LED2灭 LED1灭LED2亮循环反复
** input parameters: 无
** output parameters: 无
** Returned value: 无
*************************************************************************************/
int main (void)
{
Init_System();
Init_GPIO();
Init_LCD();
LCD_POWER_ON;
LCD_VO_Adj;
write_com(0x80+0x14);
for(i=0;i<10;i++)
{
write_dat(table1[i]);
write_com(0x18);
DelayMs(400);
}
while(1);
}
今天装了大叔的HOTISP新版本 很给力啊 不错不错啊
实现现象
显示不是很清晰 一是手机像素不高 二是 因为没有使用PWM调背光 或者用电位器调 而是直接拉低的 所以显示不是很清晰 |