|
点击此处打开armok01151177.pdf
的说明书
八位数据总线
#define uint08 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
#define sint08 signed char
#define sint16 signed int
#define sint32 signed long
#define BIT_SET(a,b) a|=BIT(b)
#define BIT_CLR(a,b) a&=~BIT(b)
#define BIT_REV(a,b) a^=BIT(b)
#define BIT_TEST(a,b) a&BIT(b)
#define LCD1602_RD BIT_SET(PORTC,PC6)
#define LCD1602_WR BIT_CLR(PORTC,PC6)
#define LCD1602_CMD BIT_CLR(PORTC,PC7)
#define LCD1602_DAT BIT_SET(PORTC,PC7)
#define LCD1602_EN BIT_SET(PORTC,PC1)
#define LCD1602_UE BIT_CLR(PORTC,PC1)
#define DDRA_IN DDRA=0x00
#define DDRA_OUT DDRA=0xFF
/****************************************Copyright (c)**************************************************
**
**
**
** 文 件 名: lcd_1602.c
** 最后修改日期: 2007-4-5 13:27
** 描 述: 初始化程序
** 版 本: V1.0
** 主 控 芯 片:M16 晶振频率:.。3728MHZ
**
**********************************************************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "function.h"
#include "extern.h"
/**********************************************************************
functionName:void delay(uint08 delay_ms)
description:延时函数 7.3728MHZ 参数1 约 1ms
**********************************************************************/
void delay(uint08 delay_ms)
{
uint08 j;
uint16 i;
for(j=0;j<delay_ms;j++)
for(i=0;i<1100;i++);
}
/**********************************************************************
functionName:uint08 read_lcd_status(void)
description:读状态
**********************************************************************/
uint08 read_lcd_status(void)
{
uint08 ret_val;
DDRA_IN;
LCD1602_CMD;
LCD1602_RD;
LCD1602_EN;
NOP();
NOP();
NOP();
ret_val=0xFF;
while(ret_val&0x80)
{
ret_val=PINA;
}
LCD1602_UE;
return(ret_val);
}
/**********************************************************************
functionName:uint08 read_dat(uint08 rs)
description:rs=0表示命令 1表示数据
**********************************************************************/
uint08 read_dat(uint08 rs)
{
uint08 ret_val;
read_lcd_status();
DDRA_IN;
if(rs)
LCD1602_DAT;
else
LCD1602_CMD;
LCD1602_RD;
LCD1602_EN;
NOP();
ret_val=PINA;
NOP();
LCD1602_UE;
return(ret_val);
}
/**********************************************************************
functionName:void write_1602(uint08 cmd,uint08 rs)
description: rs=0表示命令 1表示数据
read_status
0:忽略忙信号
1:每次等待忙信号0
**********************************************************************/
void write_1602(uint08 cmd,uint08 rs,uint08 read_status)
{
if(read_status)read_lcd_status();
DDRA_OUT;
PORTA=cmd;
if(rs)
LCD1602_DAT;
else
LCD1602_CMD;
LCD1602_WR;
LCD1602_EN;
NOP();NOP();NOP();NOP();
LCD1602_UE;
}
/**********************************************************************
functionName:void lcd_init(void)
description: LCD1602初始化
**********************************************************************/
void lcd_init(void)
{
delay(200);
delay(200);
delay(15);
write_1602(0x38,0,0);
delay(5);
write_1602(0x38,0,0);
delay(5);
write_1602(0x38,0,0);
delay(5);
write_1602(0x38,0,1);
write_1602(0x08,0,1);
write_1602(0x01,0,1);
write_1602(0x06,0,1);
write_1602(0x0C,0,1);
}
/**********************************************************************
functionName:void display_char(uint08 x,uint08 y,uint08 dat)
description: 显示一个字符
**********************************************************************/
void display_char(uint08 x,uint08 y,uint08 dat)
{
x&=0x0F;
if(y)x|=0x40;
x|=0x80;
write_1602(x,0,1);
write_1602(dat,1,1);
}
/**********************************************************************
functionName:void display_string(uint08 x,uint08 y,uint08 *dat)
description:显示一串字符
**********************************************************************/
void display_string(uint08 x,uint08 y,uint08 *dat)
{
x&=0x0f;
while(*dat)
{
display_char(x,y,*dat);
x++;
dat++;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|