数码之家
标题:
STC屠龙刀实验板驱动7寸TFT屏测试代码分享1-LCM接口驱动
[打印本页]
作者:
慕名而来
时间:
2023-1-2 12:47
标题:
STC屠龙刀实验板驱动7寸TFT屏测试代码分享1-LCM接口驱动
本帖最后由 慕名而来 于 2023-1-6 19:49 编辑
收到STC厂家寄来的开天斧实验板和屠龙刀实验板好久了,由于时逢感染泛滥之际偶尔上手弄一弄也总是不能安心深入,这几天借阳过症状稍减、等待新阳到来的空闲时间又玩了一阵子,感觉STC32G这款单片机可玩性尚可,常来本坛的朋友或许知道,我用单片机只是为了玩儿而且玩法也非常单一就喜欢玩MCU-TFT屏和万年历显示,用途决定技术,我的用途注定用不到单片机太多的功能,也决定了我的分享也不会有太多可用经验,很多这款单片机的高大上的功能我就不琢磨了,只是测试了一下STC32G的LCM接口应用、LCM_DMA刷屏、内部RTC应用测试,本文也就是根据这个顺序分三篇分享给大家,对STC单片机感兴趣的新手可以看看,其他高手无视就好。
实验器材、硬件接线等详见程序起始之前的注释。
注:为了简单起见,仅分享所有.c文件,.h文件请自行整理编写
本文主函数相关:
//-----------------------------------------------------------------------------
//STC32G单片机LCM接口驱动SSD1963-7寸TFT液晶屏测试程序
//程序原创:wannenggong 于2022年12月10日测试通过
//程序基于STC32G为主控芯片的实验箱测试例程改编
//程序编译:KEILuv4(5.60)-C251
//程序下载时内部时钟选择24MHz
//程序演示效果为STC32G单片机LCM接口16bit总线驱动SSD1963-7“TFTLCD显示数字、汉字
//------------------------------------------------
//本案LCM接口的应用配置(引脚接线方式)如下:(参照STC32G.pdf--27.x)
//TFT-LCD驱动芯片型号为:SSD1963(7”屏幕为创群AT070N92)
//16bit-MCU并行总线 I8080模式,
//低8位口接D0~D7连接P0.0-P0.7
//高8位口接D8~D15连接P2.0-P2.7
//LCD_RS = P4^5;//数据/命令切换
//LCD_WR = P4^2;//写控制
//LCD_RD = P4^4;//读控制
//------------------------------------------------
#include "STC32G.h"
#include "TFT_LCD.h"
#include "delay.h"
#include "SSD1963.h"
//==========================================================================
void main(void)
{
WTST = 0; //设置程序指令延时参数、赋值为0为等待0个时钟、可将CPU执行指令的速度设置为最快
EAXFR = 1; //相当于P_SW2 |= 0x80(使能扩展寄存器(XFR)访问)
CKCON = 0; //提高访问XRAM速度
EXTRAM = 1; //使能外部扩展寄存器(xdata)的操作
P0M0 = 0xff; //P0推挽输出
P0M1 = 0x00;
P2M0 = 0xff; //P2推挽输出
P2M1 = 0x00;
P3M0 = 0x10; //P3.4推挽输出
P3M1 = 0x00;
P4M0 = 0x3c; //P4-2.3.4.5推挽输出
P4M1 = 0x00;
EA = 1;
LCM_Config();
LCD_Init(); //LCM初始化
ClearScreen(BLUE);//BLACK WHITE
while(1)
{
Put32_64( 100, 200, 8, WHITE, BLUE );
hanzi_48( 150, 200, "月", WHITE, BLUE );
Put64_128(200, 200, 9, WHITE, BLUE);
hanzi_48( 270, 200, "日", WHITE, BLUE );
}
}
复制代码
TFT_LCD.c
#include"TFT_LCD.h"
#include"delay.h"
#include"font.h"
bit LcmFlag;
//-----------------------------------------------------
void LCM_Config(void)//STC32G硬件LCM接口寄存器配置函数
{
LCMIFCFG=0x82; //使能LCM接口中断、中断等级设为最低、接口选择00(P2=高字节P0=低字节)、16位+I8080总线
LCMIFCFG2=0x09; //控制信号端口配置为00模式(RS=P4.5,RD-P4.4,WR=P4.2);SetupTime=2,HOLDTime=1(屏幕的Setup=HOLE=8ns)
LCMIFSTA=0x00; //状态寄存器清零,B0=LCMIFIF(中断请求标志)
}
//-----------------------------------------------------
//LcmFlag作用:参数传输完成后等待返回中断标志
//中断标志位LCMIFIF变高电平时LCMIFSTA=1、中断函数中清除中断LCMIFSTA=0标志、LcmFlag=0
void LCD_WR_REG(u8 Reg)
{
if(LcmFlag==0)
{
LCMIFDATH=0;
LCMIFDATL=Reg;
LCMIFCR=0x84; //使能LCM接口、写命令
}
}
//----8位数据发送函数---------------------------------
void LCD_WR_DATA(u8 Dat)
{
if(LcmFlag==0)
{
LCMIFDATH=0;
LCMIFDATL=Dat;
LCMIFCR=0x85; //使能LCM接口、写数据
}
}
//----------------------------------------------------
void LCD_WR_DATA16(u16 Dat)
{
if(LcmFlag==0)
{
LCMIFDATH=Dat>>8;
LCMIFDATL=Dat;
LCMIFCR=0x85; //使能LCM接口、写数据
}
}
//====窗口尺寸定义函数=========================================
void LCD_SetWindows(u16 xStar,u16 yStar,u16 xEnd,u16 yEnd)
{
LCD_WR_REG(0x2a);
LCD_WR_DATA((u8)(xStar>>8));
LCD_WR_DATA((u8)(0x00FF&xStar));
LCD_WR_DATA((u8)(xEnd>>8));
LCD_WR_DATA((u8)(0x00FF&xEnd));
LCD_WR_REG(0x2b);
LCD_WR_DATA((u8)(yStar>>8));
LCD_WR_DATA((u8)(0x00FF&yStar));
LCD_WR_DATA((u8)(yEnd>>8));
LCD_WR_DATA((u8)(0x00FF&yEnd));
LCD_WR_REG(0x2c); //开始写入GRAM
}
//----全屏涂色函数(清屏)--------------------------------------
void ClearScreen(u16 bColor)
{
u32 i;
LCD_SetWindows(0,0,800-1,480-1); //给出起始与终止坐标
for(i=0; i<384000; i++) //写入800*480个像素点
{
LCD_WR_DATA16(bColor);//每个像素两个字节
}
}
//----写48*48汉字函数------------------------------------------
void hanzi_48(u16 x,u16 y,u8 c[2],u16 fColor,u16 bColor)
{
u16 i,j,k,m;
LCD_SetWindows(x,y,x+48-1,y+48-1);
for(k=0; k<17; k++)
{
if((GB_48[k].Index[0]==c[0])&&(GB_48[k].Index[1]==c[1]))
{
for(i=0; i<288; i++)
{
m=GB_48[k].Msk[i];
for(j=0; j<8; j++)
{
if((m&0x80)==0x80)
{
LCD_WR_DATA16(fColor);
}
else
{
LCD_WR_DATA16(bColor);
}
m<<=1;
}
}
}
}
}
//----96宽128高字型显示函数-------------------------------------
//使用单片机内部存储的96*128字模型数组,shuzi=数字
void Put32_64(u16 x,u16 y,u8 shuzi,u16 fColor,u16 bColor)
{
u8 j,m;
u16 i;
LCD_SetWindows(x,y,x+32-1,y+64-1);
for(i=0; i<256; i++)
{
m=shuzi_32[shuzi][i];
for(j=0; j<8; j++)
{
if((m&0x80)==0x80)
{
LCD_WR_DATA16(fColor);
}
else
{
LCD_WR_DATA16(bColor);
}
m<<=1;
}
}
}
//----96宽128高字型显示函数-------------------------------------
//使用单片机内部存储的96*128字模型数组,shuzi=数字
void Put64_128(u16 x, u16 y, u8 shuzi, u16 fColor,u16 bColor)
{
u8 j,m;
u16 i;
LCD_SetWindows(x,y,x+64-1, y+128-1);
for(i=0; i<1024; i++)
{
m=shuzi_64[shuzi][i];
for(j=0; j<8; j++)
{
if((m&0x80)==0x80)
{
LCD_WR_DATA16(fColor);
}
else
{
LCD_WR_DATA16(bColor);
}
m<<=1;
}
}
}
//----LCM中断函数----------------------------------
void LCMIF_DMA_Interrupt(void) interrupt 13
{
if(LCMIFSTA & 0x01)
{
LCMIFSTA = 0x00;
LcmFlag = 0;
}
}
复制代码
以下是公用函数文件
SSD1963.c
#include "SSD1963.h"
#include "TFT_LCD.h"
#include "delay.h"
#include "STC32G.h"
//----LCD屏固有参数声明-------------------------------------
#define HDP0 853
#define HT 1101//928
#define HPS 46
#define HPW 0
#define VDP0 479
#define VT 524
#define VPS 23
#define VPW 209
//----------------------------------------------------------
void LCD_Init(void)
{
//复位SSD1963
LCD_RESET = 1;
delay_ms(5);
LCD_RESET = 0;
delay_ms(5);
LCD_RESET = 1;
LCD_CS = 1; //关闭片选
delay_ms(5);
LCD_CS = 0; //使能片选
delay_ms(50);
//复位结束、开始初始化SSD1963
LCD_WR_REG(0xE2); //Set PLL with OSC = 10MHz (hardware), Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1), VCO = 300MHz
LCD_WR_DATA(0x23); //参数1//N=0x23=35(D);VCO=OSC*(N=1)=10MHz*36=360MHz
LCD_WR_DATA(0x02); //参数2 Divider M = 2, PLL = 360/(M+1) = 120MHz
LCD_WR_DATA(0x04); //参数3 确认上述计算数据
delay_ms(1);
LCD_WR_REG(0xE0);
LCD_WR_DATA(0x03); // 使用并使能系统PLL作为系统时钟
delay_ms(12);
LCD_WR_REG(0x01); //软复位
delay_ms(10);
LCD_WR_REG(0xE6); //设置像素频率,33Mhz
LCD_WR_DATA(0x03);
LCD_WR_DATA(0xFF);
LCD_WR_DATA(0xFF);
LCD_WR_REG(0xB0); //设置LCD模式
LCD_WR_DATA(0x00); //24位模式
LCD_WR_DATA(0x00); //TFT 模式
LCD_WR_DATA(HDP0 >> 8); //设置LCD水平像素
LCD_WR_DATA(HDP0);
LCD_WR_DATA(VDP0 >> 8); //设置LCD垂直像素
LCD_WR_DATA(VDP0);
LCD_WR_DATA(0x00); //RGB像素排列
LCD_WR_REG(0xB4); //设置水平扫描参数
LCD_WR_DATA(HT >> 8);
LCD_WR_DATA(HT);
LCD_WR_DATA(HPS >> 8);
LCD_WR_DATA(HPS);
LCD_WR_DATA(HPW);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xB6); //设置垂直扫描参数
LCD_WR_DATA(VT >> 8);
LCD_WR_DATA(VT);
LCD_WR_DATA(VPS >> 8);
LCD_WR_DATA(VPS);
LCD_WR_DATA(VPW);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xBA);
LCD_WR_DATA(0x05); //gpio[3:0] out 1
LCD_WR_REG(0xB8);
LCD_WR_DATA(0x07); //gpio3=input, gpio[2:0]=output
LCD_WR_DATA(0x01); //gpio0 normal
LCD_WR_REG(0x36); //rotation
LCD_WR_DATA(0x00);
//正常横向0x00=左到右、0x40=右到左
//顺时针旋转180度后0x80=左到右、0xc0=右到左
//顺时针旋转90度后0x20= 、0x30=
LCD_WR_REG(0xF0); //设置颜色格式
LCD_WR_DATA(0x03); //16bit颜色RGB565
LCD_WR_REG(0x29); //开启显示
//设置PWM输出 背光通过占空比可调
LCD_WR_REG(0xD0); //可调背光的设置
LCD_WR_DATA(0x0D); //禁用=0x0D
LCD_WR_REG(0x00BE); //配置PWM输出
LCD_WR_DATA(0x0002); //1设置PWM频率
LCD_WR_DATA(80 * 2.55); //2设置PWM占空比
LCD_WR_DATA(0x0001); //3设置C
LCD_WR_DATA(0x00FF); //4设置D
LCD_WR_DATA(0x0000); //5设置E
LCD_WR_DATA(0x0000); //6设置F
//LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
}
复制代码
delay.c
#include "delay.h"
#include <intrins.h>
//======================================
void delay_ms( unsigned int ms_value ) //@24.000MHz
{
unsigned long i;
while( ms_value > 0 )
{
_nop_();
_nop_();
_nop_();
i = 5998UL;
while ( i ) i--;
ms_value--;
}
}
复制代码
注:烧录代码时设置内部时钟频率为24MHz!
[attach]1707236[/attach]
[attach]1707237[/attach]
[attach]1707238[/attach]
[attach]1707239[/attach]
网盘分享在:STC屠龙刀实验板驱动7寸TFT屏测试代码分享3-片内RTC时钟演示
https://www.mydigit.cn/thread-364135-1-1.html
(出处: 数码之家)
作者:
雪随冰舞
时间:
2023-1-2 12:58
看起来挺好,不知道还能不能申请到
作者:
1588858
时间:
2023-1-2 19:20
雪随冰舞 发表于 2023-1-2 12:58
看起来挺好,不知道还能不能申请到
不用申请了,一回复是个人就直接不理你了
作者:
kpj001
时间:
2023-1-2 19:40
雪随冰舞 发表于 2023-1-2 12:58
看起来挺好,不知道还能不能申请到
任意有点相关性的公司地址就能申请到,配合下别人的商业活动也是起码的。至于项目可以写 评估物联网在XX行业的应用,笼统一些也就行了。
作者:
hewayking
时间:
2023-1-5 16:04
楼主能不能搞个压缩工程下载链接??
作者:
joyspace
时间:
2023-1-5 16:41
感谢楼主分享,好东西啊
作者:
hefanghua
时间:
2023-1-10 20:31
请问7寸的1963屏幕哪买的?价格应该不菲。
作者:
慕名而来
时间:
2023-1-10 22:00
hefanghua 发表于 2023-1-10 20:31
请问7寸的1963屏幕哪买的?价格应该不菲。
方才毛保查看记录这块屏是17年入手的当时是178现在涨了40。
欢迎光临 数码之家 (https://www.mydigit.cn/)
Powered by Discuz! X3.4