|
本帖最后由 慕名而来 于 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!
网盘分享在:STC屠龙刀实验板驱动7寸TFT屏测试代码分享3-片内RTC时钟演示
https://www.mydigit.cn/thread-364135-1-1.html
(出处: 数码之家)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|