|
这块小板是前几天做的 准备过几天再做第二版
手中还余下2块空板 想与大家一起开发开发这块板 也提些建议 有需要的请直接联系我MSN starli2789@hotmail.com
这块板本身有硬件缺陷,下一板将改正
如果哪位最近有时间一起研究的话,请联系我。我会送 空板 及 部份配件
---------------------------------------------------------------------------------------------------
(原文件名:DSCI2288.JPG)
(原文件名:DSCI2410.JPG)
(原文件名:DSCI2416.JPG)
(原文件名:DSCI2431.JPG)
---------------------------------------------------------------------------------------------------
AT mega8 Board _ v1.0
发现的问题
1.未加晶震 (做原理图时我也不知是怎么想的,真的昏了)
2.板厂加工问题导致电容的 两端都接在电源上 (板厂也昏了)
3.未留 PS/2键盘接口
4.AT45DB321 的电平问题 在5V下也许会出现问题
原理图点
击此处下载 ourdev_308782.pdf(文件大小:59K) (原文件名:原理图.pdf) PDF格式
点击此处下载 ourdev_308824.rar(文件大小:50K) (原文件名:Sheet1.rar) AD6格式
板图 _ PCB
点击此处下载 ourdev_308822.rar(文件大小:103K) (原文件名:ATmega8 Test Board _ v1.0.rar) Protel99格式
BOM表
点击此处下载 ourdev_308823.rar(文件大小:4K) (原文件名:BOM.rar)
点击此处打开 ourdev_308802.jpg(文件大小:397K,只有300K以内的图片才能直接显示) (原文件名:SpxImage1.jpg)
清楚的原理请看PDF图
(原文件名:SpxImage2.jpg)
-------------------------------------------------------------------------------------------------------
下面是我这几天开发出来的部份底层驱动
1.LCM12864
===LCM12864.H==========================================================================================================
/*----------------------------------------------------------
LCM12864 底层驱动程序
AT mega8 内部RC振荡器 1Mhz
创建日期: 2008.05.25
修改日期:
Starli V1.0
----------------------------------------------------------*/
#ifndef _LCM12864_H_
#define _LCM12864_H_
#define LCM_INTERFACE 0x01 // 1,并行,0,串行
//==========================同步数据类型定义====================================
#define SYNC_WRITE_COMMAND 0xF8
#define SYNC_READ_COMMAND 0xFC
#define SYNC_WRITE_DATA 0xFA
#define SYNC_READ_DATA 0xFE
//===========================液晶基本指令集定义=================================
#define LCD_CMD_CLRSCR 0x01 //清屏,用0x20填充整个DDRAM,并且AC复位到0x00
#define LCD_CMD_RESET_ADDRESS 0x02 //地址归位,设置DDRAM中的AC到0x00并且将游标移动到开头的原点位置
#define LCD_CMD_DOT_MODE 0x04 //进入点设定,
#define LCD_CMD_DISPLAY 0x08 // 显示状态开关
#define BIT_DISPLAY_D 2 // D 整体显示开关 1 = ON , 0 = OFF
#define BIT_DISPLAY_C 1 // C 游标开关 1 = ON , 0 = OFF
#define BIT_DISPLAY_B 0 // B 游标位置开关 1 = ON , 0 = OFF
#define LCD_CMD_CURSOR 0x10 // 游标或显示移位控制
#define BIT_CURSOR_SC 3 //
#define BIT_CURSOR_RL 2
#define LCD_CMD_MODE_SELECT 0x20 // 功能设定
#define BIT_MODE_SELECT_DL 4 // 4/8位数据选择 1 = 8位 , 0 = 4位.
#define BIT_MODE_SELECT_RE 2 // 指令集选择 1 = 扩充指令集 , 0 = 基本指令集
#define LCD_CMD_CGRAM 0x40 // 设定CGRAM地址
#define LCD_CMD_DDRAM 0x80 // 设定DDRAM地址计数器
//==============================扩充指令集======================================
#define LCD_EXT_CMD_HALT 0x01 // 将DDRAM填满0x20,并且设定DDRAM的地址计数器AC到0x00
#define LCD_EXT_CMD_IRAM_EN 0x02 // 卷动地址或IRAM地址选择
#define BIT_IRAM_SR 0 // SR = 1 允许输入垂直卷动地址 , SR = 0 允许输入IRAM地址
#define LCD_EXT_CMD_INV 0x04 // 反白选
#define BIT_INV_R1 1
#define BIT_INV_R0 0
#define LCD_EXT_CMD_SLEEP 0x08 // 睡眠模式
#define BIT_SLEEP_SL 2 // SL = 1 脱离睡眠模式 , SL = 0进入睡眠模式
#define LCD_EXT_CMD_MODE_SELECT 0x30 // 扩充功能设定
#define BIT_EXT_MODE_SELECT_RE 2 // RE = 1 扩充指令集 , RE = 0 基本指令集.
#define BIT_EXT_MODE_SELECT_G 1 // G = 1 绘图显示ON , G = 0 绘图显示OFF
#define LCD_EXT_CMD_IRAM 0x40 // 设定IRAM地址或卷动地址
#define LCD_EXT_CMD_GRAM_SET 0x80 // 设置绘图RAM地址
#define ASCII_MAX_ROW 4
#define ASCII_MAX_LINE 16
//-----------LCM12864并行接口定义----------------------------------------
#define LCD_DB_PORT PORTD //数据
#define LCD_DB_DDR DDRD
#define LCD_DB_PIN PIND
#define LCD_CB_PORT PORTB //控制
#define LCD_CB_DDR DDRB
#define LCD_RS PB0
#define LCD_RW PB3
#define LCD_E PB5
#define Set_E() LCD_CB_DDR |= (1 << LCD_E); LCD_CB_PORT |= (1 << LCD_E)
#define Set_RS() LCD_CB_DDR |= (1 << LCD_RS); LCD_CB_PORT |= (1 << LCD_RS)
#define Set_RW() LCD_CB_DDR |= (1 << LCD_RW); LCD_CB_PORT |= (1 << LCD_RW)
#define Clr_E() LCD_CB_DDR |= (1 << LCD_E); LCD_CB_PORT &= ~(1 << LCD_E)
#define Clr_RS() LCD_CB_DDR |= (1 << LCD_RS); LCD_CB_PORT &= ~(1 << LCD_RS)
#define Clr_RW() LCD_CB_DDR |= (1 << LCD_RW); LCD_CB_PORT &= ~(1 << LCD_RW)
//-----------LCM12864串行接口定义----------------------------------------
#define LCD_PORT PORTB
#define LCD_DDR DDRB
#define LCD_CS PB2
#define LCD_SDI PB3
#define LCD_SCK PB5
//----------底层驱动------------------------------------------------------------
extern void WriteDataToLcd(unsigned char ucByte); //写数据
extern void WriteCommandToLcd(unsigned char ucCommand); //写命令
extern void InitLcd(void); //初始化
//----------应用层驱动----------------------------------------------------------
extern void LcmPrintf(unsigned char x,unsigned char y,unsigned char *LcmDat);
extern void LcmDisplayStr(unsigned char row, unsigned char *LcmDat,unsigned char length);
#endif
==LCM12864.C=====================================================================================================================
/*------------------------------------------------------------------------------
LCM12864 底层驱动程序
AT mega8 内部RC振荡器 1Mhz
创建日期: 2008.05.25
修改日期:
Starli V1.0
------------------------------------------------------------------------------*/
#include "config.H"
#if LCM_INTERFACE
//------------------------------------------------------------------------------
static unsigned char TestBusy(void);
/*-------------------------------------------------
测试LCM12864忙标志
返回 : 0x00 不忙 0x80 忙
-------------------------------------------------*/
static unsigned char TestBusy(void)
{
unsigned char ucReadDat;
LCD_DB_DDR = 0x00; //输入
LCD_DB_PORT = 0xff; //弱上拉
Clr_E();
Set_E();
Clr_RS();
Set_RW();
ucReadDat = LCD_DB_PIN;
LCD_DB_PORT = 0x00; //高阻
return (ucReadDat & 0x80);
}
/*-------------------------------------------------
向LCM12864定入1字节数据
-------------------------------------------------*/
void WriteDataToLcd(unsigned char ucByte)
{
while(TestBusy()); //测忙
LCD_DB_DDR = 0xff; //输出
Set_RS();
Clr_RW();
LCD_DB_PORT = ucByte;
Set_E();
Clr_E();
}
/*-------------------------------------------------
向LCM12864定入1字节命令
-------------------------------------------------*/
void WriteCommandToLcd(unsigned char ucCommand)
{
while(TestBusy());
LCD_DB_DDR = 0xff;
Clr_RS();
Clr_RW();
LCD_DB_PORT = ucCommand;
Set_E();
Clr_E();
}
/*-------------------------------------------------
LCM12864初始化
Starli V1.0
-------------------------------------------------*/
void InitLcd(void)
{
LCD_DB_PORT = 0xff;
LCD_DB_DDR = 0xff;
Set_RS();
Set_RW();
Clr_E();
Delay(60);
WriteCommandToLcd(0x30); //8位并口,基本指令操作
Delay(1);
WriteCommandToLcd(0x30);
__delay_cycles(100);
WriteCommandToLcd(0x0c); //开游标
Delay(1);
WriteCommandToLcd(0x01); //清除显示
Delay(20);
}
#else
/*==============================================================================
函 数 名 : WriteDataToLcd()
函数功能 : 向LCD的数据RAM写一个字节的数据.
入口参数 : ucByte ---- 要写的字节.
编 译 器 : EWAVR4.20A
==============================================================================*/
void WriteDataToLcd(unsigned char ucByte)
{
LCD_PORT |= (1 << LCD_CS); // 使能LCD12864
SendSpi(SYNC_WRITE_DATA); // 同步数据
SendSpi(ucByte & 0xf0); // 高半字节
SendSpi(ucByte << 4); // 低半字节
LCD_PORT &= ~(1 << LCD_CS); // 禁止LCD12864
}
/*==============================================================================
函 数 名 : WriteCommandToLcd()
函数功能 : 向LCD写一条指令.
入口参数 : ucCommand ---- 要写的指令.
编 译 器 : EWAVR4.20A
==============================================================================*/
void WriteCommandToLcd(unsigned char ucCommand)
{
LCD_PORT |= (1 << LCD_CS); // 使能LCD12864
SendSpi(SYNC_WRITE_COMMAND); // 同步数据
SendSpi(ucCommand & 0xf0); // 高半字节
SendSpi(ucCommand << 4); // 低半字节
LCD_PORT &= ~(1 << LCD_CS); // 禁止LCD12864
}
/*==============================================================================
函 数 名 : InitLcd()
函数功能 : 初始化LCD12864.
入口参数 : 无
返回参数 : 无
编 译 器 : EWAVR4.20A
==============================================================================*/
void InitLcd(void)
{
InitSpi();
Delay(60);
WriteCommandToLcd(LCD_CMD_MODE_SELECT | (1 << BIT_MODE_SELECT_DL)); // 基本指令集动作,绘图显示OFF
Delay(20);
WriteCommandToLcd(LCD_CMD_MODE_SELECT | (1 << BIT_MODE_SELECT_DL)); // 基本指令集动作,绘图显示OFF
__delay_cycles(1000);
WriteCommandToLcd(LCD_CMD_DISPLAY | (1 << BIT_DISPLAY_D)); // 显示状态整体显示开
Delay(20);
WriteCommandToLcd(LCD_CMD_CLRSCR); // 清屏
Delay(20);
}
#endif
void LcmPrintf(unsigned char x,unsigned char y,unsigned char *LcmDat)
{
//unsigned char i;
switch(x)
{
case 1 : WriteCommandToLcd(0x80+y);break;
case 2 : WriteCommandToLcd(0x90+y);break;
case 3 : WriteCommandToLcd(0x88+y);break;
case 4 : WriteCommandToLcd(0x98+y);break;
}
Delay(5);
WriteDataToLcd( *LcmDat);
}
/*-------------------------------------------------
-------------------------------------------------*/
void LcmDisplayStr(unsigned char row, unsigned char *LcmDat,unsigned char length)
{
unsigned char i;
switch(row)
{
case 0x01 : WriteCommandToLcd(0x80);break;
case 0x02 : WriteCommandToLcd(0x90);break;
case 0x03 : WriteCommandToLcd(0x88);break;
case 0x04 : WriteCommandToLcd(0x98);break;
}
Delay(5);
for (i = 0 ; i< length ; i++)
{
WriteDataToLcd( *LcmDat);
LcmDat++ ;
}
}
void DrawLine(void)
{
unsigned char i , j;
WriteCommandToLcd(0x36); //扩展指令,绘图开
for(i = 0 ; i < 64 ; i ++)
{
for(j = 0 ; j < 16 ; j ++)
{
WriteCommandToLcd(LCD_EXT_CMD_GRAM_SET + i);
WriteCommandToLcd(LCD_EXT_CMD_GRAM_SET + j);
WriteDataToLcd(0x00);
WriteDataToLcd(0x00);
}
}
//WriteCommandToLcd(0x36);
//WriteCommandToLcd(0x36);
/*
for(i = 0 ; i < 16 ; i ++)
{
WriteCommandToLcd(LCD_EXT_CMD_GRAM_SET); //垂直地址(y轴)
WriteCommandToLcd(LCD_EXT_CMD_GRAM_SET + i); //水平地址(x轴)
WriteDataToLcd(0x0f);
}
*/
WriteCommandToLcd(LCD_EXT_CMD_GRAM_SET);
WriteCommandToLcd(LCD_EXT_CMD_GRAM_SET);
WriteDataToLcd(0xff);
} |
|