|
|
想把许老师电桥的屏幕换成12864的,以前老王家买的1.7寸ST7567的屏,死活点不亮,是哪里问题呢?
- #include <ai8051u.h>
- #include "font16.h"
- // 引脚定义
- sbit LCD_BL = P2^7; //
- sbit LCD_SDA = P2^6; //
- sbit LCD_CLK = P2^5; //
- sbit LCD_RS = P2^4; //
- sbit LCD_RST = P2^3; //
- sbit LCD_CS = P2^2; //
- extern void delay_ms(unsigned int ms);
- extern void delay_us(unsigned int us);
- /******************** LCD写命令函数(简化CS) ********************/
- void LCD_Write_Command(unsigned char cmd) {
- char i;
- LCD_CS=0;
- LCD_RS=0;
- for(i=0;i<8;i++){
- LCD_CLK=0;
- if(cmd&0x80) LCD_SDA=1; //置数据线
- else LCD_SDA=0;
- LCD_CLK=1; //产生时钟上升沿
- cmd <<= 1;
- }
- LCD_CS=1;
- }
- /******************** LCD写数据函数(简化CS) ********************/
- void LCD_Write_Data(unsigned char dat) {
- char i;
- LCD_CS=0;
- LCD_RS=1;
- for(i=0;i<8;i++){
- LCD_CLK=0;
- if(dat&0x80) LCD_SDA=1; //置数据线
- else LCD_SDA=0;
- LCD_CLK=1; //产生时钟上升沿
- dat <<= 1;
- }
- LCD_CS=1;
- }
- /******************** lcd显示清屏 ********************/
- void LCD_Claer() {
- unsigned char x,y;
- for(y=0;y<8;y++)
- {
- LCD_Write_Command(0xb0+y);//页地址
- LCD_Write_Command(0x00);//低地址
- LCD_Write_Command(0x10);//高地址
- for(x=0;x<128;x++)
- LCD_Write_Data(0x00);
- }
- }
- /******************** LCD初始化函数(优化CS控制) ********************/
- void LCD_Init() {
- // 硬件复位
- LCD_RST = 0;
- delay_us(100);
- LCD_RST = 1;
- delay_us(50);
- // 开始通信:永久拉低CS
- LCD_CS = 0;
- // 初始化序列
- LCD_Write_Command(0xE2); // 软复位
- delay_us(200);
- LCD_Write_Command(0xA2); // 1/9 bias
- delay_us(50);
- LCD_Write_Command(0xA0); // ADC正常方向
- delay_us(50);
- LCD_Write_Command(0xC8); // COM输出反向
- delay_us(50);
- LCD_Write_Command(0xA4); // 正常显示(非全亮)
- delay_us(50);
- LCD_Write_Command(0xA6); // 正常显示(非反白)
- delay_us(50);
- LCD_Write_Command(0x24); // V0电阻设置
- delay_us(50);
- // 对比度设置
- LCD_Write_Command(0x81);
- LCD_Write_Command(0x28); // 对比度值
- delay_us(50);
- // 升压电路设置
- LCD_Write_Command(0xF8);
- LCD_Write_Command(0x00); // 升压比2x
- // 分步开启电源
- LCD_Write_Command(0x2C); // Booster on
- delay_us(50);
- LCD_Write_Command(0x2E); // Regulator on
- delay_us(50);
- LCD_Write_Command(0x2F); // Follower on
- delay_us(20);
- LCD_Claer() ;
- LCD_Write_Command(0x40); // 显示起始行0
- LCD_Write_Command(0xAF); // 开启显示
- }
- /******************** 设置显示位置 ********************/
- void LCD_SetPosition(unsigned char x, unsigned char y) {
- LCD_Write_Command(0xB0 | y); // 设置页地址
- LCD_Write_Command(0x10 | (x >> 4)); // 设置列地址高4位
- LCD_Write_Command(x & 0x0F); // 设置列地址低4位
- }
- /******************** 显示字符调用font文件的函数 ********************/
- //x横坐标,y页地址=纵坐标除以8,注意每个字符高度占用16bit=2page,最多完整显示4page,y不是座标!
- //如果用font文件,那么只能完美显示4行y=0-1,2-3,4-5,6-7page.bit 这个参数是反显一个像素,没有用st7567的命令而是用像素取反运算
- void Display_Char(unsigned char x, unsigned char y, unsigned char ch_index,bit b) {
- unsigned char i;
- LCD_SetPosition(x, y);
- ch_index= ch_index-32;
- for(i=0;i<8;i++)
- {
- if(b)
- LCD_Write_Data(~F8X16[ch_index*16+i]);
- else
- LCD_Write_Data(F8X16[ch_index*16+i]);
- }//P8x16上半部分显示
- LCD_SetPosition(x,y+1);
- for(i=0;i<8;i++)
- {
- if(b)
- LCD_Write_Data(~F8X16[ch_index*16+i+8]);
- else
- LCD_Write_Data(F8X16[ch_index*16+i+8]);
- }//P8x16下半部分显示
- }
- /******************** 显示字符串调用font文件的函数 ********************/
- /*函数名称:Display_Chars
- 功能:Lcd显示字符串
- 输入:x坐标,y坐标其实是8y行,因为每Page占用8行,字符串,b反显
- 输出:无
- 备注:x<=128,y<=64
- *********************************/
- void Display_Chars(unsigned char x,y,unsigned char *ch,bit b)
- {
- while(*ch!='\0')
- {
- if(x>120){x=0;y+=2;}//如果x在最右边,则回到左边且下移1页=8行
- Display_Char(x,y,*ch++,b);
- x+=8;
- }
- }
- /*********************************
- 函数名称:Display_pic
- 功能:Lcd显示图片
- 输入:x起始坐标,y起始坐标,x终止坐标,y终止坐标,图片数组
- 输出:无
- 备注:x<=128,y<=64,x1<x2,y1<y2
- *********************************/
- void Display_pic(unsigned char x0,y0,x1,y1,unsigned char *pic)
- {
- unsigned char x,y;
- if(y1%8==0) y=y1/8;
- else y=y1/8+1;
- for(y=y0;y<y1;y++)
- {
- LCD_SetPosition(x0,y);
- for(x=x0;x<x1;x++)
- {
- LCD_Write_Data(*pic++);
- }
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|