|
发表于 2009-12-23 22:50:32
|
显示全部楼层
typedef struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}bit_field;
//PORTB 0x25;upB 0x23;PORTD 0x2b;upD 0x29;
#define BackLight (*((volatile bit_field*)(0x28))).bit0
#define LCD_RST (*((volatile bit_field*)(0x28))).bit1
#define LCD_CS (*((volatile bit_field*)(0x28))).bit2
#define LCD_DAT (*((volatile bit_field*)(0x25))).bit3
#define LCD_CLK (*((volatile bit_field*)(0x25))).bit5
#define WRCMD 0x0f8
#define RDSTA 0x0fc
#define WRDAT 0x0fa
#define RDDAT 0x0fe
#define BUSY 'b'
#define FREE 'f'
#define TRUE 1
void vDelay(unsigned int us);
void vLCD_REST(void);
void vLCD_WB(unsigned char data);
void vLCD_WF(unsigned char cmd,unsigned char data);
void vPrint(unsigned char pos,char *p);
char cPageMap(unsigned char pos);
char char2hex(char num);
char *uchar2hex(unsigned char num);
char *int2hex(int num);
char *hex2int8(unsigned char num);
void main(void)
{
vInit();
vLCD_REST();
while(TRUE)
{
;
}
}
void vDelay(unsigned int us)
{
while(us--)
{
__asm__(" NOP");
__asm__(" NOP");
__asm__(" NOP");
__asm__(" NOP");
}
}
void vLCD_REST(void)
{
LCD_RST = 0;
LCD_CS = 0;
LCD_DAT = 0;
LCD_CLK = 0;
vDelay(100);
LCD_RST = 1;
vDelay(200);
vLCD_WF(WRCMD,0x20);//发送4位控制命令
vDelay(200);
vLCD_WF(WRCMD,0x02);//发送位址归位命令,设定DDRAM位址计数器为0
vDelay(200);
vLCD_WF(WRCMD,0x04);//发送进入点命令
vDelay(200);
vLCD_WF(WRCMD,0x0c);//发送开显示关光标命令
vDelay(200);
vLCD_WF(WRCMD,0x01);//发送清除显示命令
vDelay(200);
vPrint(0x00,"┏━━━━━━┓");
vPrint(0x10,"┃ ST7920驱动┃");
vPrint(0x20,"┃ by Nano ┃");
vPrint(0x30,"┗━━━━━━┛");
vDelay(200);
}
void vLCD_WB(unsigned char data)
{
unsigned char i = 0;
LCD_CLK = 0;
LCD_DAT = 0;
for(i=0;i<8;i++)
{
if(data&0x80)LCD_DAT = 1;
else LCD_DAT = 0;
vDelay(15);
data<<=1;
LCD_CLK = 1;
vDelay(15);
LCD_CLK = 0;
vDelay(15);
}
LCD_CLK = 0;
LCD_DAT = 0;
vDelay(10);
}
void vLCD_WF(unsigned char cmd,unsigned char data)
{
LCD_CS = 1;
cmd &= ~0x04;
vLCD_WB(cmd);
vLCD_WB(data&0x0f0);
vLCD_WB(data<<4);
LCD_CS = 0;
}
void vPrint(unsigned char pos,char *p)
{
pos = cPageMap(pos);
if(pos==0)return;
vLCD_WF(WRCMD,pos);
while(*p)vLCD_WF(WRDAT,*p ++);
}
char cPageMap(unsigned char pos)
{
unsigned char position = 0;
if((pos&0x30)==0x00)position = 0x80;
else if((pos&0x30)==0x10)position = 0x90;
else if((pos&0x30)==0x20)position = 0x88;
else if((pos&0x30)==0x30)position = 0x98;
else return(0);
position += pos&0x07;
return(position);
}
char char2hex(char num) //字符型转化成ASCII码
{
num &= 0x0f;
if(num<10)return(num+0x30);
else return(num+0x61-0x0a);
}
char *uchar2hex(unsigned char num)
{
static char tc[3]={'\0','\0','\0'};
tc[0] = char2hex((unsigned char)(num>>4));
tc[1] = char2hex((unsigned char)(num));
return(tc);
}
char *int2hex(int num)
{
static char tc[5]={'\0','\0','\0','\0','\0'};
tc[0] = char2hex((unsigned char)(num>>12));//强制转化成字符型
tc[1] = char2hex((unsigned char)(num>>8));
tc[2] = char2hex((unsigned char)(num>>4));
tc[3] = char2hex((unsigned char)(num));
return(tc);
}
char *hex2int8(unsigned char num)
{
static char tc[4]={'\0','\0','\0','\0'};
tc[0] = ((num/100)&0x03)+0x30;
tc[1] = ((num/10)%10)+0x30;
tc[2] = (num%10)+0x30;
return(tc);
} |
|