热度 20
2014-4-4 14:42
877 次阅读|
1 个评论
第一次接触液晶屏(320*240, RA8835),用的CPU是ATmega16. 只想显示最简单的字母和数字,却怎么也调不通 。。求大侠相助 #include #include #include #define F_CPU 1000000 //内部晶振1M #include //------------------------------------------------------------------------------ //Parameter Defines #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 0x28 //一行所占显示存储单元的字节数 //------------------------------------------------------------------------------ //===== MCU Interface ===== #define lcd_bus PORTB //PORTB 数据口 //-------------------------------------- #define WR_H PORTD |= (12) //WR 为高 #define WR_L PORTD = ~(12) //WR 为低 #define RD_H PORTD |= (13) //RD 为高 #define RD_L PORTD = ~(13) // RD为低 #define CE_H PORTD |= (14) //CE 为高 片选 #define CE_L PORTD = ~(14) //CE 为低 #define A0_H PORTD |= (16) //A0 为高 命令数据选择 #define A0_L PORTD = ~(16) //A0 为低 #define RST_H PORTD |= (17) //RST 为高 复位 #define RST_L PORTD = ~(17) //RST 为低 #define nBUSY (P30x08) void wr_cmd80(unsigned char cmdx); ///写命令 void wr_dat1335(unsigned char datax); //写数据 void init1335(); //初始化1335函数 void Full1335(void);//全屏显示 void SetCursor1335(unsigned char lsb,unsigned char msb);//设置光标 void clear1335(void);//清屏 void lattice_1335(unsigned int pixelW,unsigned char pixelH,unsigned char dat1,unsigned char dat2);//指定范围内写入数据 void locate_xy1(unsigned char x, unsigned char y); //定位光标 void show_char(unsigned char x, unsigned char y, char *string); //字符串显示 ////CPU初始化////// void CPUInit( void ) { DDRB = 0xff; PORTB = 0x00; //B口输出 0, D0~D7 DDRD |= (12)|(13)|(14)|(16)|(17); PORTD |= (12)|(13)|(14)|(16)|(17); //D口输出 ,1,PD2为/WR PD3为/RD PD4为CE PD6为A0 PD7为/RST } ///// 标准8080时序写命令////////////// unsigned char rd_status(void) { unsigned char datx; A0_L; WR_H; RD_L; datx = lcd_bus; RD_H; return datx; } void wr_cmd80(unsigned char cmdx) //写命令 { CE_L; A0_H; RD_H; //lcd_cmd = cmdx; lcd_bus = cmdx; WR_L; WR_H; CE_H; } ////////////写数据/////////////////// void wr_dat1335(unsigned char datax) { CE_L; while(rd_status()0x80); //0x80??? A0_L; RD_H; //lcd_para = datax; lcd_bus = datax; WR_L; WR_H; CE_H; } ////////初始化1335/////////////////////////////////// void init1335() { wr_cmd80(0x40); //SYSTEM SET wr_dat1335(0x30); //p1 wr_dat1335(0x87); //p2 FX wr_dat1335(0x07); //p3 FY wr_dat1335(0x27); //p4 C/R 27 wr_dat1335(0x42); //p5 42 TC/R wr_dat1335(0xEF); //p6 L/F ef wr_dat1335(0x28); //p7 APL 28 wr_dat1335(0x00); //p8 APH wr_cmd80(0x44); //SCROLL wr_dat1335(0x00); //sa1-L wr_dat1335(0x00); //sa1-H wr_dat1335(0xF0); //sL1 wr_dat1335(0x00); //sa2-L wr_dat1335(0x28); //sa2-H wr_dat1335(0xF0); //sL2 wr_dat1335(0x00); //sa3-L wr_dat1335(0x50); //sa3-H wr_dat1335(0x00); //sa4-L wr_dat1335(0x00); //sa4-H wr_cmd80(0x5a); //HDOT SCR wr_dat1335(0x00); wr_cmd80(0x58); //DISP OFF wr_dat1335(0x54); wr_cmd80(0x5d); //CSR FORM wr_dat1335(0x00); //CRX wr_dat1335(0x00); //CRY wr_cmd80(0x59); //DISP ON wr_dat1335(0x54); wr_cmd80(0x5b); wr_dat1335(0x00); } //////////全屏////////////////////////// void Full1335(void) { unsigned int i; wr_cmd80(0x5b); wr_dat1335(0x00); SetCursor1335(0x00,0x00); wr_cmd80(0x42); for(i=0;i0x2580;i++) wr_dat1335(0x1F); for(;i0x7fff;i++) wr_dat1335(0xFF); } ///////清屏///////////// void clear1335(void) { unsigned int i; wr_cmd80(0x5b); wr_dat1335(0x00); SetCursor1335(0x00,0x00); wr_cmd80(0x42); for(i=0;i0x2580;i++) wr_dat1335(0x20); for(;i0x7fff;i++) wr_dat1335(0x00); } ///////设置光标////////// void SetCursor1335(unsigned char lsb,unsigned char msb) { wr_cmd80(0x46); //设置光标地址 wr_dat1335(lsb); wr_dat1335(msb); wr_cmd80(0x42); } ////////////指定范围内写入数据///////////// void lattice_1335(unsigned int pixelW,unsigned char pixelH,unsigned char dat1,unsigned char dat2) { unsigned char i,k,tmp1,tmp2; tmp1 = pixelH/2; tmp2 = (unsigned char)(pixelW/8); SetCursor1335(0x80,0x25); for(k=0;k { for(i=0;i wr_dat1335(dat1); for(i=0;i wr_dat1335(dat2); } } /*--------------------------------------------------------------*/ //光标定位 //x横坐标: 0~39 320/8=40 //y纵坐标: 0~29 240/8=30 void locate_xy1(unsigned char x, unsigned char y) { unsigned int addr; addr =(unsigned int)(y) * AP + x; wr_cmd80(csrw); //写入光标地址 wr_dat1335((unsigned char)(addr 0xff)); //先写低八位 wr_dat1335((unsigned char)(addr 8)); //后写高八位 } /*--------------------------------------------------------------*/ //显示字符串 //x横坐标: 0~39 320/8=40 //y纵坐标: 0~29 240/8=30 void show_char(unsigned char x, unsigned char y, char *string) { locate_xy1(x, y); //光标定位 wr_cmd80(csrform); //光标形状设置 wr_dat1335(0x07); //水平显示宽度6 wr_dat1335(0x07); //线状光标显示,高度8 wr_cmd80(csrdirr); //光标向右方向移动 wr_cmd80(dispon); //显示状态开启 wr_dat1335(0x57); //显示图像,光标1Hz闪烁 wr_cmd80(mwrite); //显示数据写入 while(*string) { wr_dat1335(*string); string++; } } //////////////主函数/////////////////// int main(void) { _delay_ms(50); CPUInit(); //初始化CPU _delay_ms(50); //CPU初始化 RST_L; //复位 //RESET _delay_ms(50); RST_H; _delay_ms(50); init1335(); //初始化液晶屏 //RD_H; while(1) { Full1335(); //全屏 _delay_ms(1000); clear1335(); //清屏 _delay_ms(1000); /*lattice_1335(320,240,0x55,0xaa); //指定范围内写入数据 _delay_ms(1000); lattice_1335(320,240,0xaa,0x55); _delay_ms(1000); lattice_1335(320,240,0xff,0x00); _delay_ms(1000); lattice_1335(320,240,0x00,0xff); _delay_ms(1000); */ show_char(0, 0, "Hi"); //显示字符串 }; } ;i++) ;i++) ;k++)