|
本程序是又51改写过来的,要注意的写数据和写指令处加延时。本人初学写的不好不要介意哦~
用的m16的片子用的内部8M (开始死活没有数据就是用了8M 改1M 就好 最后发现要加点延时用8M没有问题 用的16最大就8M更大测试不了)
PA口接DO-D7;
PD0 接rd
PD1 接wr
PD2 接cd
RA8835 用的是8080 信号模式 驱动320X240
用的是ICC编译
程序:
/*--------------------------------------------------------------*/
#include <iom16v.H>
/*--------------------------------------------------------------*/
//端口定义
#define LCD320_BUS PORTA
#define LCD320_RD0 PORTD&=0B11111110
#define LCD320_WR0 PORTD&=0B11111101
#define LCD320_CD0 PORTD&=0B11111011
#define LCD320_RD1 PORTD|=0B00000001
#define LCD320_WR1 PORTD|=0B00000010
#define LCD320_CD1 PORTD|=0B00000100
/*8080接口信号的组合功能
CD /RD /WR
0 0 1 读状态标志位
0 1 0 写指令参数和显示数据
1 0 1 读显示数据和光标指针
1 1 0 写指令代码
/*--------------------------------------------------------------*/
//定义指令代码、指令参数
#define systemset 0x40 //初始化设置,后续8字节参数串systemset_P8[]
const unsigned char systemset_P8[] = {0x30, 0x85, 0x07, 0x34, 0x4f, 0xef, 0x35, 0x00};
//P1 P2 P3 P4 P5 P6 P7 P8
#define scroll 0x44 //设定显示起始地址和显示范围,后续10字节参数串scroll_P10[]
#define basepart1 0x00
#define basepart2 0x28
#define basepart3 0x28*2
#define basepart4 0x00
const unsigned char scroll_P10[] = {0x00, basepart1, 0xf0, //第一显示区RAM,10KB,240行
0x00, basepart2, 0xf0, //第二显示区RAM,10KB,240行
0x00, basepart3, //第三显示区RAM,10KB
0x00, basepart4}; //第四显示区RAM,32KB
#define sleepin 0x53 //休闲模式设置 后续参数:无
#define dispoff 0x58 //显示关闭 后续参数1字节
#define dispon 0x59 //显示状态打开 后续参数1字节
#define hdotscr 0x5a //点位移量设置 后续参数1字节
#define ovlay 0x5b //显示合成设置 后续参数1字节
#define cgramadr 0x5c //CGRAM首地址设置 后续参数2字节
#define csrform 0x5d //光标形状设置 后续参数2字节
#define csrdirr 0x4c //光标向右方向移动 后续参数:无
#define csrdirl 0x4d //光标向左方向移动 后续参数:无
#define csrdiru 0x4e //光标向上方向移动 后续参数:无
#define csrdird 0x4f //光标向下方向移动 后续参数:无
#define csrw 0x46 //设置光标地址 后续参数2字节
#define csrr 0x47 //读出光标地址 后续参数2字节
#define mwrite 0x42 //显示数据写入 后续参数N字节
#define mread 0x43 //显示数据读取 后续参数N字节
/*--------------------------------------------------------------*/
#define busy 0x40 //忙信号D6 0100 0000
#define AP (systemset_P8[6])//一行所占显示存储单元的字节数
/*--------------------------------------------------------------*/
//函数声明
//void check_busy(void); //忙状态检测
void write_cmd(unsigned char cmd); //写指令代码
void write_dat(unsigned char dat); //写指令参数、显示数据
//unsigned char read_dat(void); //读出数据
void lcd_init(void); //液晶初始化
void lcd_cls(void); //液晶清屏,32KB RAM 清零
void show_on(void); //开启显示
void show_off(void); //关闭显示
//void sleep_in(void); //进入省电模式
//void sleep_out(void); //退出省电模式
void delay200ms(void); //延时500ms
void locate_xy(unsigned char x, unsigned char y); //光标定位
void show_char(unsigned char x, unsigned char y, unsigned char *string);//显示字符串
/*--------------------------------------------------------------*/
//延时200000+0us 函数定义
void delay200ms(void)
{
unsigned char i, j, k;
for(i = 201; i > 0; i--)
for(j = 32; j > 0; j--)
for(k = 14; k > 0; k--);
}
void delay()
{
unsigned int i;
i=1;
while(i--);
}
//写指令代码
void write_cmd(unsigned char cmd)
{
LCD320_RD1;
LCD320_BUS = cmd;
LCD320_CD1; //指令
LCD320_WR0; //上升沿写入
delay();
LCD320_WR1;
}
/*--------------------------------------------------------------*/
//写指令参数、显示数据
void write_dat(unsigned char dat)
{
LCD320_RD1;
LCD320_BUS = dat;
LCD320_CD0; //数据
LCD320_WR0; //上升沿写入
delay();
LCD320_WR1;
}
//液晶初始化
void lcd_init(void)
{
unsigned char i;
write_cmd(systemset); //初始化设置
for(i = 0; i < 8; i++) write_dat(systemset_P8);
write_cmd(scroll); //设定显示起始地址和显示范围
for(i = 0; i < 10; i++) write_dat(scroll_P10);
write_cmd(hdotscr); //点位移量设置
write_dat(0x00); //不移动
write_cmd(ovlay); //显示合成设置
write_dat(0x00); //二重合成,文本显示,逻辑或
show_off(); //关闭显示
lcd_cls(); //液晶清屏,64KB RAM 清零
show_on(); //开启显示
}
/*--------------------------------------------------------------*/
//液晶清屏,32KB RAM 清零
void lcd_cls(void)
{
unsigned int i = 32768; //32KB RAM
write_cmd(csrw); //写入光标地址
write_dat(0x00); //先写低八位
write_dat(0x00); //后写高八位
write_cmd(csrdirr); //光标向右方向移动
write_cmd(mwrite); //显示数据写入
while(i--) write_dat(0x00);
}
/*--------------------------------------------------------------*/
//开启显示
void show_on(void)
{
write_cmd(dispon); //显示状态开启
write_dat(0x57); //显示图像,光标1Hz闪烁
}
/*--------------------------------------------------------------*/
//关闭显示
void show_off(void)
{
write_cmd(dispoff); //显示状态关闭
write_dat(0x57); //显示图像,光标1Hz闪烁
}
//光标定位
//x横坐标: 0~53 320/6=53余2
//y纵坐标: 0~29 240/8=30
void locate_xy(unsigned char x, unsigned char y)
{
unsigned int addr;
addr =(unsigned int)(y) * AP + x;
write_cmd(csrw); //写入光标地址
write_dat((unsigned char)(addr & 0xff)); //先写低八位
write_dat((unsigned char)(addr >> 8)); //后写高八位
}
/*--------------------------------------------------------------*/
//显示字符串
//x横坐标: 0~52 320/6=53余2
//y纵坐标: 0~29 240/8=30
void show_char(unsigned char x, unsigned char y, unsigned char *string)
{
locate_xy(x, y); //光标定位
write_cmd(csrform); //光标形状设置
write_dat(0x05); //水平显示宽度6
write_dat(0x07); //线状光标显示,高度8
write_cmd(csrdirr); //光标向右方向移动
write_cmd(dispon); //显示状态开启
write_dat(0x57); //显示图像,光标1Hz闪烁
write_cmd(mwrite); //显示数据写入
while(*string)
{
write_dat(*string);
string++;
delay200ms();
}
}
/*--------------------------------------------------------------*/
//主函数
void main(void)
{
DDRA = 0xFF;
PORTA = 0xFF;
DDRD = 0xFF;
PORTD = 0xFF;
lcd_init();
while(1)
{
show_char(0, 0, "Isdfasefergaergin ");
show_char(0, 2, " abdhfiudhsfouaoreijoiajwefe?");
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|