|
发表于 2007-8-6 00:55:27
|
显示全部楼层
我也试了,没成功,程序贴出来,大家帮忙看看(液晶是阿莫这买的黄底黑字,程序是楼主的改的,M8 7.3728MHz)
/*------------------------------------------------------------
FileName : lcd.h
Created by : ZhengYanbo
Created date : 2006.3.17
Last modified: 2006.3.17
Comments: : serial drive for st7920
-------------------------------------------------------------*/
#ifndef __LCD_H__
#define __LCD_H__
#include "type.h"
//LCM122*32 pin define
#define CLK PORTC.2 //pc2
#define SID PORTC.1 //pc1
#define CS PORTC.0 //pC0
#define SET_CLK() CLK=1
#define CLR_CLK() CLK=0
#define SET_SID() SID=1
#define CLR_SID() SID=0
#define LCD_Enable() CS=1
#define LCD_Disable() CS=0
#define SID_PIN_IN() DDRC.1=0
#define SID_PIN_OUT() DDRC.1=1
#define CLK_PIN_OUT() DDRC.2=1
#define CS_PIN_OUT() DDRC.0=1
#define SID_PIN PINC.1 //read pinx, not port!
#define LCD_Hi_Z() PORTC&=~0x07
//lcd serial command
//#define LCD_WRITE_COMMAND 0b11111000
//#define LCD_WRITE_DATA 0b11111010
//#define LCD_READ_STATUS 0b11111100
//#define LCD_READ_DATA 0b11111110
#define LCD_WRITE_COMMAND 0xF8
#define LCD_WRITE_DATA 0xFA
#define LCD_READ_STATUS 0xFC
#define LCD_READ_DATA 0xFE
void serial_write_byte(byte data);
byte serial_read_byte(void);
void LCDWriteCmd(byte command);
void LCDWriteData(byte data);
void InitLCD(void);
void LCD_Write_CGRAM(byte nBytes);
void LCD_Write_CGRAM(byte nBytes);
void writechar(byte value);
void writestring(byte flash *strn);
void gotoxy(byte line, byte position);
void LCDclrscr(void);
void blink(byte on_off);
void writeNumber(word value);
#endif
/*------------------------------------------------------------
FileName : lcd.c
Created by : ZhengYanbo
Created date : 2006.3.17
Last modified: 2006.3.17
Comments: : serial drive for st7920
-------------------------------------------------------------*/
#include "lcd.h"
#include "type.h"
//**********************************************************
//用串行方式写一个字节数据到LCD
void serial_write_byte(byte data)
//**********************************************************
{
byte i;
//SID pin output mode
SID_PIN_OUT();
CLK_PIN_OUT();
CS_PIN_OUT();
for(i=0; i<8; i++)
{
if(data & 0x80)
SET_SID();
else
CLR_SID();
CLR_CLK();
//wait pin steady
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
//send clk
SET_CLK();
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
data<<=1;
}
CLR_CLK();
}
//**********************************************************
//以串行方式从LCD中读一个字节,返回数据
byte serial_read_byte(void)
//**********************************************************
{
byte i, temp=0;
//SID pin input mode
SID_PIN_IN();
CLK_PIN_OUT();
CS_PIN_OUT();
for(i=0; i<8; i++)
{
temp<<=1;
CLR_CLK();
//wait pin steady
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
//send clk
SET_CLK();
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
temp |= (byte)SID_PIN;
}
CLR_CLK();
return(temp);
}
//**********************************************************
//读LCD的状态,读出BF信号
byte LCD_read_status(void)
//**********************************************************
{
byte temp;
LCD_Enable();
//send 0b11111100
serial_write_byte(LCD_READ_STATUS);
//read upper 4 bits
temp = serial_read_byte() & 0xF0;
//read lower 4 bits
temp = (serial_read_byte() & 0xF0)>>4 + temp;
LCD_Disable();
//return its value
return(temp);
}
//**********************************************************
//忙信号BF检查
//返回: 1->success 0->error(time out)
byte check_busy(void)
//**********************************************************
{
int time_out;
time_out=500;
while(LCD_read_status()&0x80)
{
time_out--;
//check time out
if(time_out==0) return 0;
};
return 1;
}
//**********************************************************
//写命令到LCM
void LCDWriteCmd(byte command)
//**********************************************************
{
//not check BF state
//delay_us(500);
check_busy();
LCD_Enable();
//send 0b11111000
serial_write_byte(LCD_WRITE_COMMAND);
//write upper 4 bits
serial_write_byte(command&0xF0);
//write lower 4 bits
serial_write_byte((command<<4)&0xF0);
LCD_Disable();
}
//**********************************************************
//写数据到LCM
void LCDWriteData(byte data)
//**********************************************************
{
//not check BF state
//delay_us(500);
check_busy();
LCD_Enable();
//send 0b11111010
serial_write_byte(LCD_WRITE_DATA);
//write upper 4 bits
serial_write_byte(data&0xF0);
//write lower 4 bits
serial_write_byte((data<<4)&0xF0);
LCD_Disable();
}
//***********************************************************
void LCD_Write_CGRAM(byte nBytes)
//***********************************************************
{
//Load user's font characters
byte i;
//Set CGram addres;
LCDWriteCmd(0x40);
//load CGRAM characters
for(i=0;i<nBytes;i++) LCDWriteData(CGRAM);
}
//***********************************************************
void writechar(byte value)
//***********************************************************
{
//Write 1 character
//#asm("cli");
LCDWriteData(value);
//Set High status
LCD_Hi_Z();
}
//***********************************************************
//Write a string from flash ROM
void writestring(byte flash *strn)
//***********************************************************
{
while (*strn!=0) writechar(*strn++);
}
//***********************************************************
//Gotoxy function. X=line number, Y=character position
void gotoxy(byte line, byte position)
//***********************************************************
{
byte address;
address=lcdLineStart[line]+position;
LCDWriteCmd(address);
}
//***********************************************************
//Clear LCD
void LCDclrscr(void)
//***********************************************************
{
LCDWriteCmd(0x01);
delay_ms(25); //Writing cycle time is 4.6ms for LCD128X64.
}
//***********************************************************
//Setup curson blink, based on player state
void blink(byte on_off)
//***********************************************************
{
//if on_off = 1 blink on, if on_off=0 blink off
LCDWriteCmd(0x0C + (on_off & 1));
}
//***********************************************************
//Write a decimal number on LCD
void writeNumber(word value)
//***********************************************************
{
byte temp[8],i=0;
do {
temp[i++]=value%10;
value=value/10;
}
while (value>0);
//start from back and print the number
for(;i>0;) writechar(temp[--i]+48);
}
//***********************************************************
//Initialize LCD, then print logo
void InitLCD(void)
//***********************************************************
{
delay_ms(50); //Wait LCD ready
check_busy();
LCDWriteCmd(0x30); //function set
delay_us(100);
LCDWriteCmd(0x30); //function set
delay_us(100);
LCDWriteCmd(0x0C); //display on, cursor off
delay_us(100);
LCDWriteCmd(0x01); //clear lcd
delay_ms(10);
LCDWriteCmd(0x06); //Entry mode set
//Write LCD CGRAM
LCD_Write_CGRAM(128);
//Printing Logo
//LCDclrscr();
gotoxy(0,0);
writestring("ST7920串行驱动");
gotoxy(1,0);
writestring("版本:Test v1.0");
delay_ms(1000);
//second screen
LCDclrscr();
writestring("设计:Datazyb");
gotoxy(1,0);
writestring("日期:2006.3.17");
}
//end of lcd.c
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#include "type.h"
byte key=0;
byte key_code=0;
byte intFlag=0;
byte Menu_Layer=0;
byte cursorPos=1;
byte root_index=1;
byte sub_index=1;
byte sub_sub_index=1;
flash byte lcdLineStart[4]={0x80,0x90,0x88,0x98};
flash byte CGRAM[128] =
{
0x3E,0x38,0x7F,0x38,0xFF,0xB8,0xDD,0xB8,
0x9C,0xB8,0x1C,0x38,0x1C,0x38,0x1C,0x38,
0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1D,0x39,
0x1D,0xBB,0x1D,0xFF,0x1C,0xFE,0x1C,0x7C,
//play char
0x1C,0x00,0x1E,0x00,0x1F,0x00,0x1F,0x80,
0x1F,0xC0,0x1F,0xE0,0x1F,0xF0,0x1F,0xF8,
0x1F,0xF8,0x1F,0xF0,0x1F,0xE0,0x1F,0xC0,
0x1F,0x80,0x1F,0x00,0x1E,0x00,0x1C,0x00,
//stop char
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,
0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,
0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,
0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
//pause char
0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,
0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,
0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,
0x1C,0x38,0x00,0x00,0x00,0x00,0x00,0x00
};
#endif
/*----------------------------------------------------------
;CodeVisionAVR C Compiler V1.24.7c Professional
;(C) Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
;http://www.hpinfotech.com
;Chip type : ATmega8L
;Program type : Application
;Clock frequency : 16.000000 MHz
;Memory model : Small
;Optimize for : Size
CPU : MEGA8
CLK : 12MHz
Test:
Last Access Date: 2006.3.17
-------------------------------------------------------------*/
#include <mega8.h>
#include "type.h"
#include "global.h"
#include "lcd.h"
#include <delay.h>
void main (void)
//*************************************************
{
unsigned char i;
InitLCD();
delay_ms(1000);
while(1)
{
LCDclrscr();
gotoxy(2,0);
writestring("终于看到你了!");
LCD_Enable();
delay_ms(2000);
}
}//main loop |
|