找回密码
 立即注册
查看: 310|回复: 8

终于搞定液晶了

[复制链接]
已绑定手机

35

主题

91

回帖

249

积分

中级会员

积分
249
发表于 2026-8-28 23:26:47 | 显示全部楼层 |阅读模式
main.c:


#include <STC89C5xRC.H>
#include "LCD.h"
//char *str1="    Hello World!        Hello World!    ";
//char *str2="    I'm LCD1602A        I'm LCD1602A    ";
//void main(){
//  unsigned int counter=0;
//  LCD_Init();
//  LCD_ShowString(0,0,str1);
//  LCD_ShowString(0,1,str2);
//  while(1){
//    for(counter=0;counter<500;counter++){
//      LCD_Delay();
//    }
//    LCD_Scroll(0);
//  }
//}
unsigned char heart[]={0x00,0x0a,0x1f,0x1f,0x0e,0x04,0x00,0x00};
void main(){
  LCD_Init();
  LCD_Write_CGRAM(7,heart);
  LCD_SetPox(0,0);
  LCD_WD(0x07);
  while(1);
}



LCD.c:
#include <STC89C5xRC.H>
#define LCD_DATA  P0
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
void LCD_Delay();
void LCD_WS(unsigned char ws);
void LCD_WD(unsigned char wd);
void LCD_Init();
void LCD_SetPox(unsigned char x,unsigned char y);
void LCD_ShowString(unsigned char x,unsigned char y,char *str);
void LCD_Scroll(bit fx);
void LCD_Write_CGRAM(unsigned char weizhi,unsigned char *array);

void LCD_Delay(){
  unsigned char data i, j;//24MHz 2ms
        i = 8;
        j = 197;
        do
        {
                while (--j);
        } while (--i);
}
void LCD_WS(unsigned char ws){
  LCD_E=1;
  LCD_RS=0;//S
  LCD_RW=0;//W
  LCD_DATA=ws;
  LCD_Delay();
  LCD_E=0;
}
void LCD_WD(unsigned char wd){
  LCD_E=1;
  LCD_RS=1;//R
  LCD_RW=0;//W
  LCD_DATA=wd;
  LCD_Delay();
  LCD_E=0;
}
void LCD_Init(){
  LCD_WS(0x38);
  LCD_WS(0x0C);
  LCD_WS(0x06);
  LCD_WS(0x01);
}
void LCD_SetPox(unsigned char x,unsigned char y){
  if(y){
    LCD_WS(0x80+0x40+x);
  }else{
    LCD_WS(0x80+x);
  }
}
void LCD_ShowString(unsigned char x,unsigned char y,char *str){
  LCD_SetPox(x,y);
  while(*str){
    LCD_WD(*str);
    str++;
  }
}
void LCD_Scroll(bit fx){
  if(fx){
    LCD_WS(0x1C);//right
  }else{
    LCD_WS(0x18);//left
  }
}
void LCD_Write_CGRAM(unsigned char weizhi,unsigned char *array){
  //0<=weizhi<8,array[8]
  unsigned char i=(weizhi<<3)|0x40;
  LCD_WS(i);
  for(i=0;i<8;i++){
    LCD_WD(array[i]);
  }
  LCD_WS(0x80);
}



LCD.h:
#ifndef __LCD_H
#define __LCD_H
void LCD_Delay();
void LCD_WS(unsigned char ws);
void LCD_WD(unsigned char wd);
void LCD_Init();
void LCD_SetPox(unsigned char x,unsigned char y);
void LCD_ShowString(unsigned char x,unsigned char y,char *str);
void LCD_Scroll(bit fx);
void LCD_Write_CGRAM(unsigned char weizhi,unsigned char *array);
#endif

回复

使用道具 举报 送花

已绑定手机

11

主题

484

回帖

1362

积分

金牌会员

积分
1362
发表于 2026-8-29 11:07:37 | 显示全部楼层
成熟的1602和12864代码到处都是,不用这么吃力吧。
回复

使用道具 举报 送花

1

主题

128

回帖

641

积分

高级会员

积分
641
发表于 2026-8-29 23:56:22 | 显示全部楼层
还没用上AI写代码吗?
回复

使用道具 举报 送花

2

主题

34

回帖

777

积分

高级会员

积分
777
发表于 2026-9-3 10:06:36 | 显示全部楼层
回复

使用道具 举报 送花

已绑定手机

35

主题

91

回帖

249

积分

中级会员

积分
249
 楼主| 发表于 2026-9-5 12:43:52 | 显示全部楼层
jker*** 发表于 2026-8-29 23:56
还没用上AI写代码吗?

自己写更好吧
回复

使用道具 举报 送花

已绑定手机

35

主题

91

回帖

249

积分

中级会员

积分
249
 楼主| 发表于 2026-9-12 18:51:53 | 显示全部楼层
回复

使用道具 举报 送花

38

主题

117

回帖

2993

积分

金牌会员

积分
2993
发表于 2026-9-12 20:44:23 | 显示全部楼层
12864显存模型,看得明白的话,就能在屏上做出各种特效了

截图202609122042585888.jpg

12点击汉字字模

12点击汉字字模

16点阵

16点阵
回复

使用道具 举报 送花

已绑定手机

35

主题

91

回帖

249

积分

中级会员

积分
249
 楼主| 发表于 2026-9-12 20:48:45 | 显示全部楼层
深*** 发表于 2026-9-12 20:44
12864显存模型,看得明白的话,就能在屏上做出各种特效了

唔,OLED和这个好像也能适配,让我们再一起想想吧
回复

使用道具 举报 送花

38

主题

117

回帖

2993

积分

金牌会员

积分
2993
发表于 2026-9-12 21:11:15 | 显示全部楼层
光头*** 发表于 2026-9-12 20:48
唔,OLED和这个好像也能适配,让我们再一起想想吧

其实任意单色屏都适配这套模型的,这是在内存中划出的一块做显存的,就是一数组,刷屏前将显示数据写入数组,数据是换算成bit写入的,写的时候记录下改变的位置(也是一数组),显示数据写完后再将变化的部分送给屏幕去显示,效率比较高,
可以看看这个视频中的样子,https://www.bilibili.com/video/B ... p;bvid=BV1zy4y1c7rC,因为是公司项目用于产品中的,其他的你自己尝试研究研究
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 11:25 , Processed in 0.077664 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表