返回

迪文屏笔记

目录

前言

学习串口屏,不过还不是很习惯51的开发

概念

  • 变量地址:存放字符串这种,要大于0x0FFF,因为他被系统变量占用
  • 描述指针:style 使用UART2发送以下协议可以修改对应数据

准备前操作

  • 图片等素材以数字+英文或中文或是数字.jpg,第一张图片以数字00开头(只有背景图片所在的icl文件需要按这样命令),图片素材的分辨率需要与屏幕大小保持一致(学校的是800x480)
  • 超长图标以1000开头,不超过1023

软件内步骤

  1. 添加图片素材

工程制作完步骤

  1. 保存工程,生成工程
  2. 使用首页的ICL工具将图片都转为ICL格式,命名为32背景文件,介绍一下13号文件触摸功能,14号显示文件,22号为初始配置文件,这些文件需要下载

烧录

sd卡

FAT32 新建DWIN_SET文件夹,将32号文件,13号文件,14号文件,22号文件放到文件夹内即可下载。 可以不用删除其他文件

组件介绍

常用控件

  • 变量图标显示:根据变量显示对应图片,按照上限值与下限值连续的,如果变量超范围则不显示图标(可用于按下按钮)
  • 动画图标显示:初始值为1时动画开始播放
  • 图片动画:任意大小,在初始页面与结束页面都放上同样属性的页面即可
  • 图标旋转:顺时针
  • 位变量图标:0-1,按位存储,可以将一排按键用一个字节存取
  • 艺术字图标
  • 图标叠加:显示jpeg,在22号文件中,注意软件中的是以字节位单位,hex editor是字为单位,1字等于2字节

触控控件

  • 按键返回:点击后修改变量地址的值
  • 增量调节:一定范围内进行++与–操作,上限为1时可以当翻转使用
  • 数据返回 模式0x01时间VP1S上的字节数据传给VP1T指向的数据(用于操控系统变量)
1
2
xdata定义时不要管初值
sys_init后定义

组态键盘

  1. 定义按键定义,定义字符图标设置
  2. 根据ASCII码表定义(注意:光标0xFF,确认0xF1,删除:0xF2,退出0xF0)

实用系统变量

迪文云接入

平台端

设备端

配网

编程部分

GPIO

Timer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "sys.h"
#include "tim.h"
//定时器0初始化
void timer0_init()
{
    //16位定时器工作模式
    TMOD &= 0xFC;
    TMOD |= 0x01;
    //定时周期为1ms
    TH0 = (u8)(T0_PERIOD_1MS>>8); 
    TL0 = (u8)T0_PERIOD_1MS;
    ET0 = 1;//使能定时器0中断
    EA = 1;//使能总中断
    TR0 = 1;//启动定时器0
}

void timer1_init()
{
    TMOD &= 0X0F;   
    TMOD |= 0X10;   //16bit 
    TR1 = 0; 
    ET1 = 1; 
    EA  = 1;

    TH1 = 0;    
    TL1 = 0;
}

外部中断

特别提示:
T5L OS CPU 速度快(1uS 平均可执行 130-150 条指令),中断执行时间短,实时性已经非常高,不推荐用户使用中断嵌套导致程序架构复杂,在每个中断服务程序执行时直接关闭中断(EA=0),退出时再开启中断(EA=1)。

1
2
3
4
5
6
7
8
9
interrupt 0
0 对应对应的通道,这个通道是固定的。
注意这是的顺序可以执行配置(参考手册)

0    外部中断0
1    定时器/计数器T0
2    外部中断1
3    定时器/计数器T1
4    串行口中断

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void exit0_init(){
    IP0 &= 0xFE;
    IP1 &= 0xfe;

    IT0 = 1;
    EX0 = 1;
    EA = 1;
}

void exit0_isr() interrupt 0 {
    sys_delay_about_ms(10);
    if(KEY1 == 0){

    }
    IE0 = 0;
}

UART

注意:UART1 为系统占用,不能编程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// example
sys_init();
uart2_init(115200);
printf("hello from uart2\r\n");

// 串口重定向
//用uart2串口实现printf函数
char putchar(char c)
{
    u2_send_byte(c);
    return c;
}

系统接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include "sys.h"

// 初始化相关
//核心寄存器初始化
void sys_cpu_init();
//系统初始化
void sys_init();

// 软件大约定时
void sys_delay_about_ms(u16 ms);
void sys_delay_about_us(u8 us);

// 使用Timer 2 精确定时(也就是不要手动去动Timer2)
void sys_timer2_init();
void sys_delay_ms(u16 ms)

// 系统变量访问与修改接口
void sys_read_vp(u16 addr,u8* buf,u16 len);
void sys_write_vp(u16 addr,u8* buf,u16 len);

ADC

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
u16 ad;
float vol;
sys_init();

while(1){
    ad = adc_read_avg(ADC_CHANNEL0,20);
    vol = ad *(3300.0f/4095);

    sys_write_vp(0x2000, (u8*)&ad,1);   // 显示 ad 值
    sys_write_vp(0x2001, (u8*)&vol,2);  // 显示电压
}

MISC

wifi(板载ESP8266)

1
2
3
4
// wifi 初始化
void wifi_init(void);
// 查询迪文云状态
void show_server_connect_status(void);

看门狗

软件复位,内部 RAM 清空

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// from sys.h
//看门狗宏定义
#define WDT_ON()                MUX_SEL|=0x02       //开启看门狗
#define WDT_OFF()               MUX_SEL&=0xFD       //关闭看门狗
#define WDT_RST()               MUX_SEL|=0x01       //喂狗


// a exmaple
void main(){
    WDT_ON();
    WDT_OFF();
 }
/**
 * @brief 定时器定义
 */
void tim1_isr() ...{
    WDT_RST();
}

NOR FLASH

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#deifne NORFLASH_READ 0x5A
#deifne NORFLASH_WRITE 0xA5

void norflash_wirte(u32 addr, u8* buff, u16 len);
void norflash_read(u32 addr, u8* buff, u16 len);

void norflash_read(u32 addr,u8 *buff,u16 len) {
    norflash_cmd[0] = NORFLASH_READ;
    norflash_cmd[1] = (u8)(addr>>16);
    norflash_cmd[2] = (u8)(addr>>8);
    norflash_cmd[3] = (u8)addr;

    norflash_cmd[4] = (u8)(CACHE_ADDR>>8);
    norflash_cmd[5] = (u8)CACHE_ADDR;

    norflash_cmd[6] = (u8)(len>>8);
    norflash_cmd[7] = (u8)len;

    sys_write_vp(NORFLASH_ADDR,norflash_cmd,4);
}

void norflash_wirte(u32 addr, u8* buff, u16 len) {
    sys_write_vp(CACHE_ADDR,buff,len);
    norflash_cmd[0] = NORFLASH_WRITE;
    norflash_cmd[1] = (u8)(addr>>16);
    norflash_cmd[2] = (u8)(addr>>8);
    norflash_cmd[3] = (u8)addr;
    norflash_cmd[4] = (u8)(CACHE_ADDR>>8);
    norflash_cmd[5] = (u8)CACHE_ADDR;
    norflash_cmd[6] = (u8)(len>>8);
    norflash_cmd[7] = (u8)len;
    sys_write(NORFLASH_ADDR,norflash_cmd,4);
    while(1) {
        sys_read_vp(NORFLASH_ADDR,norflash_cmd,2);
        if(norflash_cmd[0]==0)
            break;
        sys_delay_about_ms(1);//必须加延时,否则会出现莫名其妙的错误
    }
}
例程
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
norflash_read(NORFLASH_DATA_ADDR,buff,sizeof(buff)/2);
sys_write_vp(0x2000,buff,sizeof(buff)/2);
while(1)
{
    cnt++;
    sys_delay_ms(50);

    if(is_key_pressed)
    {
        len = sprintf(buff,"被保存的值:%u",cnt);
        buff[++len] = 0;
        len = len/2+1;
        if(len&0x01)
            len++;
        norflash_write(NORFLASH_DATA_ADDR,buff,len);
        sys_write_vp(0x2000,buff,sizeof(buff)/2);
        is_key_pressed = 0;
    }
}

虚拟按键(屏幕按键点击)

就是轮询变量,软件使用按键返回功能,返回对应值

音频播放

  1. 修改cfg 文件,启用音频播放功能
  2. 生成wae 音频文件
  3. 生成对应的文件,并修改cfg 中显式指定音频存放的内存位置
Licensed under CC BY-NC-SA 4.0