切换到宽版
  • 3112阅读
  • 2回复

[STM]在大神们的带领下,stm8s103 点亮中行U盾12864屏 [复制链接]

上一主题 下一主题
离线qq55304672
 

发帖
21
M币
-393
专家
1
粉丝
2
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-01-15
看了很多贴子,拿来的代码都不能用。主要是那些命令不对。
还是万能的X宝好。找了个屏里面的说明,直接改代码。试机OK;


#include "STM8S103f3p.h"

_Bool cs1 @PC_ODR:3;
_Bool reset @PC_ODR:4;
_Bool rs @PC_ODR:5;
_Bool sclk @PC_ODR:6;
_Bool sid @PC_ODR:7;

char num9[]={
/*-- 文字: 9 --*/
/*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
char zhuang1[]={
/*-- 文字: 状 --*/
/*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,
0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00};
char cheng1[]={
/*-- 文字: 成 --*/
/*-- 宋体 23; 此字体下对应的点阵为:宽 x 高=31x31 --*/
/*-- 高度不是 8 的倍数,现调整为:宽度 x 高度=32x32 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,
0xFC,0xFC,0x88,0x00,0x00,0x1C,0x78,0xF0,0xE0,0x00,0x80,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0x83,0x83,0x83,0x83,0x83,0x83,0xC3,0xC3,0x03,0x1F,
0xFF,0xFF,0x83,0x03,0x03,0x03,0xC3,0xF3,0xF3,0x63,0x03,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0xFF,0x3F,0x00,0x80,0x00,0x00,0x80,0xFF,0xFF,0x03,0x00,0x00,0x03,
0x9F,0xFF,0xF8,0xF8,0xBE,0x1F,0x07,0x01,0x00,0x00,0xE0,0x20,0x00,0x00,0x20,0x38,
0x1F,0x07,0x01,0x00,0x00,0x01,0x01,0x07,0x07,0x23,0x31,0x18,0x0C,0x0E,0x07,0x03,
0x01,0x01,0x01,0x03,0x07,0x0F,0x0E,0x1C,0x1F,0x3F,0x30,0x00,0x00,0x00,0x00,0x00};

/*写指令到 LCD 模块*/
void transfer_command(int data1)
{
int i;
cs1=0;
rs=0;
for(i=0;i<8;i++)
{
sclk=0;
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
data1=data1<<=1;
}
}
/*写数据到 LCD 模块*/
void transfer_data(int data1)
{
int i;
cs1=0;
rs=1;
for(i=0;i<8;i++)
{
sclk=0;
if(data1&0x80) sid=1;
  else sid=0;
sclk=1;
data1=data1<<=1;
}
}
/*延时*/
void delay(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<110;k++);
}
//初始化液晶屏
void InitLCD(void)
{
cs1=0;
reset=0; /*低电平复位*/
delay(100);
reset=1; /*复位完毕*/
delay(20);
transfer_command(0xe2); /*软复位*/
delay(5);
transfer_command(0x2f); /*升压*/
delay(5);
transfer_command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/
transfer_command(0x81); /*微调对比度*/
transfer_command(0x28); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/
transfer_command(0xa2); /*1/9 偏压比(bias)*/
transfer_command(0xc8); /*行扫描顺序:从上到下*/
transfer_command(0xa0); /*列扫描顺序:从左到右*/
transfer_command(0x40); /*起始行:第一行开始*/
transfer_command(0xaf); /*开显示*/
cs1=1;
}

void lcd_address(int page,int column)
{
cs1=0;
column=column-1; //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
page=page-1;
transfer_command(0xb0+page); /*设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
我们平常所说的第 1 页,在 LCD 驱动 IC 里是第 0 页,所以
在这里减去 1*/
transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高 4 位
transfer_command(column&0x0f); //设置列地址的低 4 位
}

/*全屏清屏*/
void clear_screen(void)
{
unsigned char i,j;
cs1=0;
for(i=0;i<9;i++)
{
lcd_address(1+i,1);
for(j=0;j<132;j++)
{
transfer_data(0x00);
}
  }
cs1=1;
}
//==================display a piture of 128*64 dots================
void full_display(void)
{
int i,j;
for(i=0;i<8;i++)
{
cs1=0;
lcd_address(i+1,0);
for(j=0;j<128;j++)
{
transfer_data(0xff);
}
}
}
/*显示 32x32 点阵图像、汉字、生僻字或 32x32 点阵的其他图标*/
void display_graphic_32x32(int page,int column,char *dp)
{
int i,j;
cs1=0;
for(j=0;j<4;j++)
{
lcd_address(page+j,column);
for (i=0;i<31;i++)
{
transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
cs1=1;
}
/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/
void display_graphic_16x16(int page,int column,char *dp)
{
int i,j;
cs1=0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<16;i++)
{
transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
cs1=1;
}
/*显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标*/
void display_graphic_8x16(int page,int column,char *dp)
{
int i,j;
cs1=0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<8;i++)
{
transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
cs1=1;
}


void InitGpio(void)
{
    PC_DDR=0xff;
    PC_CR1=0xff;
    PC_CR2=0xff;
}


main()
{
    int i;
    InitGpio();
    InitLCD();
    clear_screen();
    
    display_graphic_32x32(1,1,cheng1); /*在第 1 页,第 49 列显示单个汉字"成"*/
    display_graphic_16x16(5,1,zhuang1); /*在第 5 页,第 1 列显示单个汉字"状"*/
    display_graphic_16x16(7,(1+16),zhuang1); /*在第 7 页,第 17 列显示单个汉字"状"*/
    display_graphic_8x16(5,(89),num9); /*在第 5 页,第 89 列显示单个数字"9"*/
    display_graphic_8x16(5,(89+8*1),num9); /*在第 5 页,第 97 列显示单个数字"9"*/
      while (1)
        {
        }
}


送上说明:LX12864G-086-PN 使用说明书






U盾LCD屏驱动相关文章:

成功驱动农行、工行U盾屏,排线丝印TSE1G6012或FPC-QFG12864
http://bbs.mydigit.cn/read.php?tid=1425394
成功驱动工行U盾12864屏,排线丝印FM92031ACT6
http://bbs.mydigit.cn/read.php?tid=1425706
终于点亮了工行U盾,12864B LCD接口定义图
http://bbs.mydigit.cn/read.php?tid=1262646
U盾DIY GPS万年历兼谈STC EEPROM的使用:
http://bbs.mydigit.cn/read.php?tid=1283320
坛友的 农行U盾液晶屏再利用DIY(附代码)
http://bbs.mydigit.cn/read.php?tid=1268821
成功驱动农行超小U盾的屏幕,排线丝印FPC14570A
http://bbs.mydigit.cn/read.php?tid=1448992
坛友的 建行e路通19264点阵屏改液晶模块,顺利点亮
http://bbs.mydigit.cn/read.php?tid=1235754
教大家如何点亮建行网银盾的液晶屏(附代码指令)
http://bbs.mydigit.cn/read.php?tid=1295119
教大家如何点亮建行网银盾的液晶屏2.0(以代码为主)
http://bbs.mydigit.cn/read.php?tid=1448258
成功驱动建行U盾19264点阵屏,但是逻辑分析仪抓的数据令人费解
http://bbs.mydigit.cn/read.php?tid=1443276
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共3条打赏 ,M币+84 ,专家+1
离线jpdd521

发帖
25694
M币
7956
专家
15
粉丝
350
只看该作者 1楼 发表于: 2018-01-16
请登录后查看
离线springvirus

发帖
410
M币
732
专家
3
粉丝
15
只看该作者 2楼 发表于: 2018-02-14
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个